Applies To.NET

Poznámka: Revize z 22. června 2023 s cílem aktualizovat řešení a alternativní řešení

Poznámka: Revidováno 15. června 2023, aby se aktualizovaly možnosti 4 a 5 

Pozadí

13. června 2023 společnost Microsoft vydala aktualizaci zabezpečení pro rozhraní .NET Framework a .NET, která má vliv na to, jak modul runtime importuje certifikáty X.509. Tyto změny můžou způsobit, že import certifikátu X.509 vyvolá výjimku CryptographicException ve scénářích, kdy by import před aktualizací proběhl úspěšně.

Tento dokument popisuje změny a alternativní řešení dostupná pro ovlivněné aplikace.

Ovlivněný software

  • .NET Framework 2.0

  • .NET Framework 4.6.2, 4.7, 4.7.1, 4.7.2

  • .NET Framework 4.8

  • .NET Framework 4.8.1

  • .NET 6.0

  • .NET 7.0

Ovlivněná rozhraní API

Popis změny

Před 13. červnem 2023 změna, kdy se v rozhraních .NET Framework a .NET zobrazí objekt blob binárního certifikátu pro import, by rozhraní .NET Framework a .NET obvykle delegovaly ověřování a import objektu blob do základního operačního systému. Například ve Windows se rozhraní .NET Framework a .NET při ověřování a importu obvykle spoléhá na rozhraní API PFXImportCertStore .

Od 13. června 2023 platí, že když se .NET Framework a .NET zobrazí objekt blob binárního certifikátu pro import, rozhraní .NET Framework a .NET budou za určitých okolností provádět dodatečné ověření před předáním objektu blob do základního operačního systému. Toto další ověření provádí řadu heuristických kontrol, které určují, jestli příchozí certifikát při importu záměrně nevyčerpal prostředky. Vzhledem k tomu, že se jedná o další ověření nad rámec toho, co by základní operační systém normálně prováděl, může blokovat objekty blob certifikátu, které by se úspěšně naimportovaly před změnou 13. června 2023.

Známé regrese

  1. Pokud byl certifikát X.509 exportován jako objekt blob PFX s neobvykle vysokým počtem iterací hesel, může se stát, že se tento certifikát nepodaří importovat. Většina zařízení pro export certifikátů používá počet iterací někde mezi 2 000 a 10 000. Po instalaci aktualizace zabezpečení se import nezdaří u certifikátů obsahujících počet iterací větší než 600 000.

  2. Pokud byl certifikát X.509 exportován pomocí hesla s hodnotou null [např. prostřednictvímX509Certificate.Export(X509ContentType.Pfx, (string)null)nebo bezheslovéhoX509Certificate.Export(X509ContentType.Pfx)]), nemusí se teď tento certifikát importovat.  

    Poznámka: Výše uvedená regrese byla vyřešena v aktualizaci z 22. června 2023 popisované v aktualizaci KB5028608.

  3. Pokud byl certifikát X.509 exportován jako objekt blob PFX pomocí schopnosti systému Windows chránit privátní klíč k identifikátoru SID, může se stát, že se tento certifikát nepodaří importovat. To bude mít vliv na objekty blob PFX vytvořené následujícím způsobem:

    • Prostřednictvím Průvodce exportem certifikátu systému Windows a určením v průvodci, že privátní klíč má být chráněn pro uživatele domény; Nebo

    • Prostřednictvím rutiny PowerShellu Export-PfxCertificate , kde je k dispozici explicitní argument -ProtectTo ; Nebo

    • Prostřednictvím nástroje certutil , kde je zadán explicitní argument -protectto ; Nebo

    • Prostřednictvím rozhraní API PFXExportCertStoreEx , kde je k dispozici příznak PKCS12_PROTECT_TO_DOMAIN_SIDS.

Alternativní řešení & řešení

Existují různá alternativní řešení v závislosti na tom, jestli chcete provádět cílené změny na jednotlivých webech volání v kódu, chcete změnit chování jedné aplikace nebo chcete provést změny v rámci celého počítače.

Možnost 1 (upřednostňovaná) – Instalace aktualizované opravy

Poznámka: Toto je upřednostňovaná možnost, protože řeší běžně hlášené regrese zákazníků a nevyžaduje žádné změny kódu v aplikaci.

Použitelnost: Tato možnost platí pro všechny verze rozhraní .NET Framework a .NET.

Tento problém byl vyřešen v aktualizaci z 22. června 2023 popisované v aktualizaci KB5028608.

Microsoft doporučuje, aby se zákazníci, u kterých dochází k regresím zavedeným ve verzi z 13. června 2023, pokusili nainstalovat tuto aktualizovanou opravu před pokusem o alternativní řešení uvedená dále v tomto dokumentu.

Možnost 2 – Úprava webu volání

Použitelnost: Tato možnost platí pro všechny verze rozhraní .NET Framework a .NET.

Zvažte, jestli je objekt blob, který importujete, důvěryhodný. Byl například objekt blob načtený z důvěryhodného umístění, jako je databáze nebo konfigurační soubor, který máte pod kontrolou, nebo byl poskytnut prostřednictvím síťového požadavku neověřeného nebo neprivilegovaného klienta?

Microsoft důrazně doporučuje, abyste neimportovali objekty blob PFX poskytované neověřenými nebo neprivilegovanými klienty, protože tyto objekty blob můžou obsahovat škodlivé chování při vyčerpání prostředků.

Pokud potřebujete importovat objekt blob certifikátu veřejného klíče, který vám poskytla nedůvěryhodná strana, můžete k bezpečnému importu takového objektu blob použít následující kód. Tento ukázkový kód používá metodu GetCertContentType k určení základního typu objektu blob certifikátu a odmítne objekty blob PFX v případech, kdy očekáváte pouze import objektu blob certifikátu veřejného klíče. KonstruktorX509Certificate2(byte[]) je bezpečný pro použití při zadání nedůvěryhodných objektů blob PFX.

using System.Security.Cryptography.X509Certificates;
public static X509Certificate2 ImportPublicCertificateBlob(byte[] blob)
{
     if (X509Certificate2.GetCertContentType(blob) == X509ContentType.Pfx)
    {
          throw new Exception("PFX blobs are disallowed.");
    }
   else
   {
         // Import only after we have confirmed it's not a PFX.
        return new X509Certificate2(blob);
    }
} 

Pokud potřebujete importovat objekt blob certifikátu privátního klíče bez hesla a zjistili jste, že je objekt blob důvěryhodný, můžete potlačit další ověřovací kontroly provedené vydáním zabezpečení z 13. června 2023 voláním jiného přetížení konstruktoru. Můžete například volat přetížení konstruktoru, které přijímá řetězcové heslo argumentu a předá hodnotu argumentu null. 

byte[] blobToImport = GetBlobToImport(); // fetch this from a database, config, etc. 

// REGRESSION - byte[] ctor performs additional security checks X509Certificate2 certA = new X509Certificate2(blobToImport);

// RECOMMENDED WORKAROUND - different ctor overload suppresses additional security checks X509Certificate2 certB = new X509Certificate2(blobToImport, (string)null);

Možnost 3 – Úprava nebo potlačení dalšího ověřování pomocí proměnné prostředí

Použitelnost: Tato možnost platí pouze pro všechny verze rozhraní .NET Framework.  Nevztahuje se na .NET 6.0+.

I když rozhraní .NET Framework ve výchozím nastavení omezuje operace importu tak, aby nepobíhly více než 600 000 iterací hesla, lze tento limit nakonfigurovat na úrovni celé aplikace nebo počítače pomocí proměnné prostředí. Tento nový limit se bude vztahovat na všechna volání ovlivněných rozhraní API uvedených výše.

Pokud chcete limit změnit, nastavte proměnnou prostředíCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitna hodnotu nového limitu. Pokud chcete například nastavit limit na 1 000 000 iterací (jeden milion), nastavte proměnnou prostředí, jak je znázorněno níže.

  • Toto číslo řídí celkový limit iterace, což je součet počtu iterací MAC, šifrovaného bezpečného obsahu a počtu iterací zahaleného sáčku. Pokud jste ručně exportovali PFX pomocí explicitního počtu iterací <iter_count> (např. prostřednictvím openssl pkcs12 -export -iter <iter_count>) a chcete importovat tento objekt blob PFX, nastavte tuto proměnnou prostředí na hodnotu alespoň tak velkou, jako je součet všech očekávaných iterací. V praxi může rozhraní .NET Framework a .NET povolit, aby celkový počet iterací mírně překročil jakýkoli explicitní limit nakonfigurovaný zde.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Pokud chcete další kontroly úplně potlačit, nastavte proměnnou prostředí na speciální hodnotu sentinelu -1, jak je znázorněno níže.

  • ⚠️ Upozornění: Hodnotu proměnné prostředí nastavte na -1 pouze v případě, že jste si jistí, že cílová aplikace nezvládá nedůvěryhodný vstup certifikátu.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

Možnost 4 – Úprava nebo potlačení dalšího ověřování pomocí AppContextu

Použitelnost: Tato možnost se vztahuje pouze na .NET 6.0+.  Nevztahuje se na rozhraní .NET Framework.

I když .NET ve výchozím nastavení omezuje operace importu na maximálně 600 000 iterací hesla, tento limit je možné nakonfigurovat pro celou aplikaci pomocí přepínače AppContext. Tento nový limit se bude vztahovat na všechna volání ovlivněných rozhraní API uvedených výše.

Pokud chcete změnit limit, nastavte přepínač AppContext System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit na hodnotu nového limitu. Pokud například chcete nastavit limit na 1 000 000 iterací (jeden milion), nastavte přepínač, jak je znázorněno níže.

  • Toto číslo řídí celkový limit iterace, což je součet počtu iterací MAC, šifrovaného bezpečného obsahu a počtu iterací zahaleného sáčku. Pokud jste ručně exportovali PFX pomocí explicitního počtu iterací <iter_count> (např. prostřednictvím openssl pkcs12 -export -iter <iter_count>) a chcete importovat tento objekt blob PFX, nastavte tuto proměnnou prostředí na hodnotu alespoň tak velkou, jako je součet všech očekávaných iterací. V praxi může .NET umožnit, aby celkový počet iterací mírně překročil jakýkoli explicitní limit nakonfigurovaný tady.

Nastavení přepínače v souboru projektu aplikace (.csproj nebo .vbproj):

<!--

  • This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="1000000" />

</ItemGroup>

Případně můžete do stejného adresáře, který obsahuje soubor projektu vaší aplikace, umístit soubor s názvem runtimeconfig.template.json s následujícím obsahem:

{

     "configProperties": {

  • "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": 1000000

      }

}

Další informace o změně nastavení konfigurace modulu runtime .NET najdete na stránce dokumentace k nastavení konfigurace modulu runtime .NET.

Pokud chcete další kontroly úplně potlačit, nastavte přepínač konfigurace na speciální hodnotu sentinelu -1, jak je znázorněno níže.

⚠️ Upozornění: Přepínač AppContext nastavte na hodnotu -1 pouze v případě, že jste si jistí, že cílová aplikace nezvládá nedůvěryhodný vstup certifikátu.

V souboru projektu aplikace (.csproj nebo .vbproj):

<!--

  • This switch only works if the current project file represents an application. It has no effect if the current project file represents a shared library.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption Include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" Value="-1" />

</ItemGroup>

Nebo v souboru runtimeconfig.template.json:

{

  • "configProperties": { 
  •     "System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit": -1

     }

}

Možnost 5 – Úprava nebo potlačení dalšího ověřování v celém počítači prostřednictvím registru (pouze Windows pro .NET Framework)

Použitelnost: Tato možnost platí pouze pro všechny verze rozhraní .NET Framework.  Nevztahuje se na .NET 6.0+.

I když rozhraní .NET Framework ve výchozím nastavení omezuje operace importu tak, aby nebraly více než 600 000 iterací hesla, tento limit lze nakonfigurovat pro celý počítač pomocí registru HKLM. Tento nový limit se bude vztahovat na všechna volání ovlivněných rozhraní API uvedených výše.

Pokud chcete limit změnit, nastavte v klíči registruHKLM\Software\Microsoft\.NETFrameworkhodnotuPkcs12UnspecifiedPasswordIterationLimitna hodnotu, na kterou by měl být nový limit. Pokud například chcete nastavit limit na 1 000 000 iterací (jeden milion), spusťte příkazy, jak je znázorněno níže, z příkazového řádku se zvýšenými oprávněními.

  • Toto číslo řídí celkový limit iterace, což je součet počtu iterací MAC, šifrovaného bezpečného obsahu a počtu iterací zahaleného sáčku. Pokud jste ručně exportovali PFX pomocí explicitního počtu iterací <iter_count> (např. prostřednictvím openssl pkcs12 -export -iter <iter_count>) a chcete importovat objekt blob PFX, nastavte tuto hodnotu registru na hodnotu alespoň tak velkou, jako je součet všech očekávaných iterací. V praxi může rozhraní .NET Framework povolit, aby celkový počet iterací mírně překročil jakýkoli explicitní limit nakonfigurovaný zde.

  • Nastavení registru závisí na architektuře. Pokud chcete zajistit, aby aplikace dodržovaly nakonfigurovanou hodnotu bez ohledu na cílovou architekturu, nezapomeňte upravit 32bitový i 64bitový registr, jak je znázorněno níže.

reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:32 reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_DWORD /d 1000000 /reg:64

Pokud chcete další kontroly úplně potlačit, nastavte hodnotu registru na -1 z příkazového řádku se zvýšenými oprávněními, jak je znázorněno níže.

  • ⚠️ Upozornění: Hodnotu registru nastavte na -1 pouze v případě, že jste si jistí, že služby spuštěné na cílovém počítači nezpracováují nedůvěryhodný vstup certifikátu.

  • Pokud chcete nastavit sentinel -1, použijte místo typu REG_DWORD typ REG_SZ. Nastavení registru závisí na architektuře. Pokud chcete zajistit, aby aplikace dodržovaly nakonfigurovanou hodnotu bez ohledu na cílovou architekturu, nezapomeňte upravit 32bitový i 64bitový registr, jak je znázorněno níže.

reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:32 reg add "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /t REG_SZ /d -1 /reg:64

Pokud chcete vrátit změny registru, odstraňte hodnotu reg Pkcs12UnspecifiedPasswordIterationLimit z příkazového řádku se zvýšenými oprávněními.

reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:32 reg delete "HKLM\Software\Microsoft\.NETFramework" /v Pkcs12UnspecifiedPasswordIterationLimit /reg:64

Poznámky specifické pro Windows

Ve Windows importuje .NET Framework certifikáty prostřednictvím funkce PFXImportCertStore. Tato funkce provádí vlastní ověření, včetně vlastního omezení maximálního povoleného počtu iterací objektu blob PFX. Tyto kontroly se budou provádět i při importu PFX. Tá. Proměnné prostředí specifické pro net a klíče registru popsané výše nemají vliv na to, jak PFXImportCertStore provádí tyto kontroly.

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.