Applies To.NET

Bemærk! Revideret 22. juni 2023 for at opdatere løsninger og løsninger

Bemærk! Revideret 15. juni 2023 for at opdatere løsningsmuligheder 4 og 5 

Baggrund

Den 13. juni 2023 udgav Microsoft en sikkerhedsopdatering til .NET Framework og .NET, som påvirker, hvordan runtime importerer X.509-certifikater. Disse ændringer kan medføre, at X.509-certifikatimport udløser KryptografiskeException i scenarier, hvor importen ville være lykkedes før opdateringen.

I dette dokument beskrives de ændringer og løsninger, der er tilgængelige for påvirkede programmer.

Berørt 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

Berørte API'er

Beskrivelse af ændring

Før 13. juni 2023 ændres, når .NET Framework og .NET præsenteres for et binært certifikat blob til import, vil .NET Framework og .NET typisk uddelegere validering og import af blob til det underliggende operativsystem. På Windows ville .NET Framework og .NET typisk være afhængige af PFXImportCertStore API til validering og import.

Fra og med den 13. juni 2023 vil .NET Framework og .NET under visse omstændigheder udføre yderligere validering, når .NET Framework og .NET præsenteres for et binært certifikat blob til import, før bloben gives til det underliggende operativsystem. Denne yderligere validering udfører en række heuristiske kontroller for at afgøre, om det indgående certifikat vil udtømme ressourcer ved import. Da dette er yderligere validering ud over, hvad det underliggende operativsystem normalt ville udføre, kan det blokere certifikat-blobs, som ville være blevet importeret før ændringen den 13. juni 2023.

Kendte regressioner

  1. Hvis et X.509-certifikat er blevet eksporteret som en PFX-blob ved hjælp af et ualmindeligt højt antal adgangskoder, kan det pågældende certifikat nu ikke importeres. De fleste certifikateksportfaciliteter bruger en gentagelsestælling et sted mellem 2.000 - 10.000. Når sikkerhedsopdateringen er installeret, vil importen mislykkes for certifikater, der indeholder et antal gentagelser, der er større end 600.000.

  2. Hvis et X.509-certifikat er blevet eksporteret ved hjælp af en null-adgangskode [f.eks. viaX509Certificate.Export(X509ContentType.Pfx, (string)null)eller den adgangskodeløseX509Certificate.Export(X509ContentType.Pfx)], kan certifikatet nu muligvis ikke importeres.  

    Bemærk!: Ovenstående regression er blevet behandlet i opdateringen for 22. juni 2023, der blev diskuteret i KB5028608.

  3. Hvis et X.509-certifikat er blevet eksporteret som en PFX-blob ved hjælp af Windows-funktionalitet til at beskytte den private nøgle til et SID, kan certifikatet nu muligvis ikke importeres. Dette påvirker PFX-blobs, der er oprettet på følgende måder:

    • Via Guiden Certifikateksport i Windows og i guiden angiver, at den private nøgle skal beskyttes af en domænebruger. Eller

    • Via PowerShells Export-PfxCertificate-cmdlet , hvor der angives et eksplicit -ProtectTo argument; Eller

    • Via værktøjet certutil , hvor der angives et eksplicit -protectto argument; Eller

    • Via PFXExportCertStoreEx API, hvor PKCS12_PROTECT_TO_DOMAIN_SIDS-flaget er angivet.

Løsning & løsninger

Der findes forskellige løsninger, afhængigt af om du vil foretage målrettede ændringer på individuelle opkaldswebsteder i din kode, eller du vil ændre funktionsmåden for et enkelt program, eller du vil foretage ændringer for hele computeren.

Mulighed 1 (foretrukket) – Installér en opdateret programrettelse

Bemærk!: Dette er den foretrukne indstilling, da den løser ofte rapporterede kunderegressioner og ikke kræver nogen kodeændringer i programmet.

Anvendelse: Denne indstilling gælder for alle versioner af .NET Framework og .NET.

Dette problem er blevet løst i opdateringen for 22. juni 2023, der diskuteres i KB5028608.

Microsoft anbefaler, at kunder, der oplever regressioner, der blev introduceret i 13. juni 2023, skal prøve at installere denne opdaterede programrettelse, før de forsøger de løsninger, der er angivet senere i dette dokument.

Mulighed 2 – Ændring af opkaldswebstedet

Anvendelse: Denne indstilling gælder for alle versioner af .NET Framework og .NET.

Overvej, om den blob, du importerer, er pålidelig. Blev blob'en f.eks. hentet fra en pålidelig placering, f.eks. en database eller konfigurationsfil under din kontrol, eller blev den leveret via en netværksanmodning fra en ikke-godkendt eller ikke-godkendt klient?

Microsoft anbefaler på det kraftigste, at du ikke importerer PFX-blobs, der leveres til dig af ikke-godkendte eller ikke-godkendte klienter, da disse blobs kan indeholde skadelig ressource udmattelse.

Hvis du har brug for at importere et blob for en offentlig nøgle, der er givet til dig af en part, der ikke er tillid til, kan du bruge følgende kode til sikkert at importere en sådan blob. Denne eksempelkode bruger metoden GetCertContentType til at bestemme, hvilken underliggende type certifikat-blob der er, og den afviser PFX-blobs i tilfælde, hvor du kun forventer at importere et blob for et offentligt nøglecertifikat. DenX509Certificate2(byte[]) konstruktør er sikker til brug, når der gives upålidelige ikke-PFX-blobs.

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);
    }
} 

Hvis du har brug for at importere et privat nøglecertifikat uden adgangskode, og du har fastslået, at blob'en er troværdig, kan du undertrykke de yderligere valideringskontroller, der udføres af sikkerhedsudgivelsen fra d. 13. juni 2023, ved at kalde en anden konstruktøroverbelastning. Du kan f.eks. kalde konstruktøren for overbelastet, som accepterer et strengadgangskodeargument og overfører null for argumentværdien. 

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);

Mulighed 3 – Ændring eller undertrykkelse af yderligere validering ved hjælp af en miljøvariabel

Anvendelse: Denne indstilling gælder kun for alle versioner af .NET Framework.  Den gælder ikke for .NET 6.0+.

Selvom .NET Framework som standard begrænser importhandlinger til højst 600.000 gentagelser af en adgangskode, kan denne grænse konfigureres på app- eller maskinbasis ved hjælp af en miljøvariabel. Denne nye grænse gælder for alle aktiveringer af de berørte API'er, der er angivet ovenfor.

Hvis du vil ændre grænsen, skal du angive miljøvariablenCOMPlus_Pkcs12UnspecifiedPasswordIterationLimittil værdien af, hvad den nye grænse skal være. Hvis du f.eks. vil angive grænsen til 1.000.000 (en million) gentagelser, skal du angive miljøvariablen som vist nedenfor.

  • Dette tal styrer den samlede gentagelsesgrænse, som er summen af ANTAL MAC-gentagelser, krypteret sikkert indhold og indhyllet taskes gentagelsesantal. Hvis du manuelt har eksporteret en PFX ved hjælp af et eksplicit gentagelsesantal <iter_count> (f.eks. via openssl pkcs12 -export -iter <iter_count>) og ønsker at importere denne PFX-blob, skal du angive denne miljøvariabel til en værdi, der er mindst lige så stor som summen af alle forventede gentagelser. I praksis kan .NET Framework og .NET tillade, at det samlede antal gentagelser overskrider en vilkårlig eksplicit grænse, der er konfigureret her.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Hvis du helt vil undertrykke de ekstra kontroller, skal du indstille miljøvariablen til den særlige kontrolværdi -1, som vist nedenfor.

  • ⚠️ Advarsel: Indstil kun miljøvariableværdien til -1, hvis du er sikker på, at destinationsprogrammet ikke håndterer certifikatinput, der ikke er tillid til.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

Mulighed 4 – Ændring eller skjulning af yderligere validering ved hjælp af AppContext

Anvendelighed: Denne indstilling gælder kun for .NET 6.0+.  Den gælder ikke for .NET Framework

Selvom .NET som standard begrænser importhandlinger til højst 600.000 gentagelser af en adgangskode, kan denne grænse konfigureres for hele programmet ved hjælp af AppContext-parameteren. Denne nye grænse gælder for alle aktiveringer af de berørte API'er, der er angivet ovenfor.

Hvis du vil ændre grænsen, skal du indstille AppContext-parameteren System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit til værdien af, hvad den nye grænse skal være. Hvis du f.eks. vil angive grænsen til 1.000.000 (en million) gentagelser, skal du angive parameteren som vist nedenfor.

  • Dette tal styrer den samlede gentagelsesgrænse, som er summen af ANTAL MAC-gentagelser, krypteret sikkert indhold og indhyllet taskes gentagelsesantal. Hvis du manuelt har eksporteret en PFX ved hjælp af et eksplicit gentagelsesantal <iter_count> (f.eks. via openssl pkcs12 -export -iter <iter_count>) og ønsker at importere denne PFX-blob, skal du angive denne miljøvariabel til en værdi, der er mindst lige så stor som summen af alle forventede gentagelser. I praksis kan .NET tillade, at det samlede antal gentagelser overskrider en vilkårlig eksplicit grænse, der er konfigureret her.

Sådan angives parameteren i programmets projektfil (.csproj eller .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>

Du kan også placere en fil med navnet runtimeconfig.template.json med følgende indhold i den samme mappe, som indeholder programmets projektfil:

{

     "configProperties": {

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

      }

}

Du kan få mere at vide om at ændre konfigurationsindstillinger for .NET runtime på dokumentationssiden .NET Runtime-konfigurationsindstillinger.

Hvis du helt vil undertrykke de ekstra kontroller, skal du indstille konfigurationsskiftet til den særlige kontrolværdi -1, som vist nedenfor.

⚠️ Advarsel: Indstil kun AppContext-kontakten til -1, hvis du er sikker på, at destinationsprogrammet ikke håndterer upålideligt certifikatinput.

I programmets projektfil (.csproj eller .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>

Eller i filen runtimeconfig.template.json:

{

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

     }

}

Mulighed 5 – Ændring eller undertrykkelse af den yderligere valideringsmaskine i hele registreringsdatabasen (kun Windows for .NET Framework)

Anvendelse: Denne indstilling gælder kun for alle versioner af .NET Framework.  Den gælder ikke for .NET 6.0+.

Selvom .NET Framework som standard begrænser importhandlinger til højst 600.000 gentagelser af en adgangskode, kan denne grænse konfigureres for hele computeren ved hjælp af HKLM-registreringsdatabasen. Denne nye grænse gælder for alle aktiveringer af de berørte API'er, der er angivet ovenfor.

Hvis du vil ændre grænsen, skal du angive værdienPkcs12UnspecifiedPasswordIterationLimitden nye grænse under registreringsdatabasenøglenHKLM\Software\Microsoft\.NETFramework. Hvis du f.eks. vil angive grænsen til 1.000.000 (en million) gentagelser, skal du køre kommandoerne som vist nedenfor fra en kommandoprompt med administratorrettigheder.

  • Dette tal styrer den samlede gentagelsesgrænse, som er summen af ANTAL MAC-gentagelser, krypteret sikkert indhold og indhyllet taskes gentagelsesantal. Hvis du manuelt har eksporteret en PFX ved hjælp af et eksplicit gentagelsesantal <iter_count> (f.eks. via openssl pkcs12 -export -iter <iter_count>) og ønsker at importere pfx-bloben, skal du angive denne registreringsdatabaseværdi til en værdi, der er mindst lige så stor som summen af alle forventede gentagelser. I praksis kan .NET Framework tillade, at det samlede antal gentagelser overskrider en vilkårlig eksplicit grænse, der er konfigureret her.

  • Indstillingen i registreringsdatabasen er arkitekturafhængig. For at sikre, at programmer overholder din konfigurerede værdi uanset deres målarkitektur, skal du huske at ændre både 32-bit- og 64-bit-registreringslisterne, som vist nedenfor.

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

Hvis du vil undertrykke de ekstra kontroller helt, skal du indstille registreringsdatabaseværdien til -1 fra en kommandoprompt med administratorrettigheder, som vist nedenfor.

  • ⚠️ Advarsel: Angiv kun værdien i registreringsdatabasen til -1, hvis du er sikker på, at de tjenester, der kører på destinationscomputeren, ikke håndterer certifikatinput, der ikke er tillid til.

  • Hvis du vil angive sentinel -1, skal du bruge den REG_SZ type i stedet for den REG_DWORD type. Indstillingen i registreringsdatabasen er arkitekturafhængig. For at sikre, at programmer overholder din konfigurerede værdi uanset deres målarkitektur, skal du huske at ændre både 32-bit- og 64-bit-registreringslisterne, som vist nedenfor.

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

Hvis du vil gendanne registreringsdatabaseændringerne, skal du slette Pkcs12UnspecifiedPasswordIterationLimit-regværdien fra en kommandoprompt med administratorrettigheder.

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

Windows-specifikke noter

I Windows .NET Framework importere certifikater via funktionen PFXImportCertStore. Denne funktion udfører sin egen validering, herunder at sætte sine egne grænser for en PFX-blobs maksimale tilladte gentagelsesantal. Disse kontroller vil stadig blive gennemført ved PFX-import. . NET-specifikke miljøvariabler og registreringsdatabasenøgler, der er beskrevet ovenfor, påvirker ikke, hvordan PFXImportCertStore udfører disse kontroller.

Har du brug for mere hjælp?

Vil du have flere indstillinger?

Udforsk abonnementsfordele, gennemse kurser, få mere at vide om, hvordan du sikrer din enhed og meget mere.

Communities hjælper dig med at stille og besvare spørgsmål, give feedback og høre fra eksperter med omfattende viden.