KB5025823 .NET lietojumprogrammu X.509 sertifikātu importēšanas veida izmaiņas

Attiecas uz
.NET

Piezīme. Pārskatīts 2023. gada 22. jūnijā, lai atjauninātu risinājumu un risinājumus

Piezīme. Pārskatīts 2023. gada 15. jūnijā, lai atjauninātu 4. un 5. opcijas risinājumu

Vispārīga informācija

2023. gada 13. jūnijā Microsoft izlaida .NET Framework un .NET drošības atjauninājumu, kas ietekmē to, kā izpildlaiks importē X.509 sertifikātus. Šīs izmaiņas var izraisīt X.509 sertifikāta importēšanas darbību CryptographicException tādos scenārijos, kuros importēšana būtu bijusi veiksmīga pirms atjaunināšanas.

Šajā dokumentā aprakstītas ietekmēto lietojumprogrammu izmaiņas un pieejamie risinājumi.

Ietekmētā programmatūra

  • .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

Ietekmētie API

Izmaiņu apraksts

Pirms 2023. gada 13. jūnija izmaiņām, kad .NET Framework un .NET importēšanai tiek piedāvāts binārais sertifikāta BLOB, .NET Framework un .NET parasti deleģē BLOB validāciju un importēšanu pamatā esošajai operētājsistēmai. Piemēram, operētājsistēmā Windows ..NET Framework un .NET validācijai un importēšanai parasti izmanto PFXImportCertStore API.

Sākot ar 2023. gada 13. jūnija izmaiņām, kad .NET Framework un .NET importēšanai tiek piedāvāts binārais sertifikāta BLOB, .NET Framework un .NET dažos gadījumos veiks papildu validāciju pirms BLOB nodošanas pamatā esošajai operētājsistēmai. Šī papildu pārbaude veic virkni heiristisko pārbaužu, lai noteiktu, vai ienākošais sertifikāts importēšanas laikā ļaunprātīgi neizsmeļ resursus. Tā kā šī ir papildu validācija, kas pārsniedz pamatā esošās operētājsistēmas parasto veiktspēju, tā var bloķēt sertifikātu BLOB, kas būtu veiksmīgi importēti pirms 2023. gada 13. jūnija izmaiņām.

Zināmās regresijas

  1. Ja X.509 sertifikāts ir eksportēts kā PFX BLOB, izmantojot neparasti lielu paroļu iterāciju skaitu, tad sertifikātu, iespējams, neizdosies importēt. Lielākā daļa sertifikātu eksportēšanas iespēju izmanto iterāciju skaitu no 2,000 līdz 10,000. Pēc drošības atjauninājuma lietošanas importēšana neizdosies sertifikātiem, kuru iterāciju skaits ir lielāks par 600 000.

  2. Ja X.509 sertifikāts ir eksportēts, izmantojot null paroli [piem., izmantojot X509Certificate.Export(X509ContentType.Pfx, (string)null) vai bez X509Certificate.Export(X509ContentType.Pfx)]paroles, tad sertifikātu tagad var neizdoties importēt.
     

    Piezīme

    Iepriekš minētā regresija ir novērsta 2023. gada 22. jūnija atjauninājumā, kas tika apspriests KB5028608.

  3. Ja X.509 sertifikāts ir eksportēts kā PFX BLOB, izmantojot Windows iespēju aizsargāt SID privāto atslēgu, tad sertifikātu, iespējams, neizdosies importēt. Tas ietekmēs PFX BLOB, kas izveidoti šādos veidos:

    • Izmantojot Windows sertifikātu eksportēšanas vedni un vednī norādot, ka privātā atslēga ir jāaizsargā domēna lietotājam; vai
    • Izmantojot PowerShell Export-PfxCertificate cmdlet, kur ir sniegts skaidrs -ProtectTo arguments; vai
    • Izmantojot utilītu certutil , ja ir sniegts skaidrs -protectto arguments; vai
    • Izmantojot PFXExportCertStoreEx API, kur tiek nodrošināts PKCS12_PROTECT_TO_DOMAIN_SIDS karodziņš.

Risinājums & risinājumi

Pastāv dažādi risinājumi atkarībā no tā, vai vēlaties veikt mērķtiecīgas izmaiņas atsevišķās zvanu vietnēs savā kodā, vai arī vēlaties mainīt vienas programmas darbību, vai arī vēlaties veikt izmaiņas datora mērogā.

1. iespēja (ieteicams) — instalējiet atjauninātu ielāpu

Piezīme

Šī ir vēlamā opcija, jo tā attiecas uz bieži uzrādītām klientu regresijām un nepieprasa koda izmaiņas lietojumprogrammā.

Pielietojums: Šī opcija attiecas uz visām .NET Framework un .NET versijām.

Šī problēma ir novērsta 2023. gada 22. jūnija atjauninājumā, kas tika apspriests KB5028608.

Microsoft iesaka klientiem, kuri saskaras ar regresijām, kas ieviestas ar 2023. gada 13. jūnija laidienu, izmēģināt instalēt šo atjaunināto ielāpu, pirms mēģināt veikt tālāk šajā dokumentā norādītos risinājumus.

2. opcija — zvana vietnes modificēšana

Pielietojums: Šī opcija attiecas uz visām .NET Framework un .NET versijām.

Apsveriet, vai importētais BLOB ir uzticams. Piemēram, vai BLOB tika izgūts no uzticamas atrašanās vietas, piemēram, datu bāzes vai konfigurācijas faila, kas atrodas jūsu kontrolē, vai arī tas tika nodrošināts, izmantojot tīkla pieprasījumu, ko veica neautentificēts vai nepriviliģēts klients?

Microsoft stingri iesaka neimportēt PFX BLOB, ko jums nodrošina neautentificēti vai nepriviliģēti klienti, jo šie BLOB var saturēt ļaunprātīgu resursu izsīkumu.

Ja vēlaties importēt publiskās atslēgas sertifikāta BLOB, ko jums piešķīrusi neuzticama puse, varat izmantot tālāk norādīto kodu, lai droši importētu šādu BLOB. Šajā parauga kodā tiek izmantota metode GetCertContentType , lai noteiktu, kāds ir sertifikāta BLOB tips, un tas noraida PFX BLOB gadījumos, kad ir paredzēts importēt tikai publiskās atslēgas sertifikāta BLOB. Konstruktors X509Certificate2(byte[]) ir drošs lietošanai, ja tiek doti neuzticami ne-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);
    }
} 

Ja jums ir nepieciešams importēt bezparoles privātās atslēgas sertifikāta BLOB un esat noteicis, ka BLOB ir uzticams, varat apturēt papildu validācijas pārbaudes, ko veic 2023. gada 13. jūnija drošības laidiens, izsaucot citu konstruktoru pārslodzi. Piemēram, var izsaukt konstruktora pārslodzi, kas pieņem virknes paroles argumentu un nodod nulli argumenta vērtībai.

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

3. opcija. Papildu validācijas modificēšana vai slāpēšana, izmantojot vides mainīgo

Pielietojums: Šī opcija attiecas tikai uz visām .NET Framework versijām.  Tas neattiecas uz .NET 6.0+.

Lai gan .NET Framework pēc noklusējuma ierobežo importēšanas operācijas, lai veiktu ne vairāk kā 600 000 paroles iterāciju, šo ierobežojumu var konfigurēt programmas vai datora mērogā, izmantojot vides mainīgo. Šis jaunais ierobežojums attieksies uz visām iepriekš norādīto ietekmēto API izsaukšanām.

Lai mainītu ierobežojumu, iestatiet vides mainīgo COMPlus_Pkcs12UnspecifiedPasswordIterationLimit uz vērtību, kāda jābūt jaunajam ierobežojumam. Piemēram, lai iestatītu ierobežojumu uz 1 000 000 (viens miljons) iterāciju, iestatiet vides mainīgo, kā parādīts tālāk.

  • Šis skaitlis kontrolē kopējo iterāciju ierobežojumu, kas ir MAC iterāciju skaita, šifrētā drošā satura un apvalka maisiņa iterāciju skaita summa. Ja esat manuāli eksportējis PFX, izmantojot skaidru iterāciju skaita <iter_count> (piemēram, izmantojot openssl pkcs12 -export -iter <iter_count>) un vēlaties importēt šo PFX BLOB, iestatiet šo vides mainīgo uz vērtību, kas ir vismaz tikpat liela kā visu paredzamo iterāciju summa. Praksē .NET Framework un .NET var atļaut kopējam iterāciju skaitam nedaudz pārsniegt jebkuru šeit konfigurēto ierobežojumu.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Lai pilnībā izslēgtu papildu pārbaudes, iestatiet vides mainīgo uz īpašo kontrolvērtību -1, kā parādīts tālāk.

  • ⚠️ Brīdinājums: iestatiet vides mainīgā vērtību uz -1 tikai tad, ja esat pārliecināts, ka mērķa programma neapstrādā neuzticamu sertifikātu ievadi.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

4. opcija — papildu validācijas modificēšana vai slāpēšana, izmantojot AppContext

Lietojums: Šī opcija attiecas tikai uz .NET 6.0+.  Tas neattiecas uz .NET Framework

Lai gan .NET pēc noklusējuma ierobežo importēšanas operācijas, kas nepārsniedz 600 000 paroles iterāciju, šo ierobežojumu var konfigurēt visā lietojumprogrammā, izmantojot slēdzi AppContext. Šis jaunais ierobežojums attieksies uz visām iepriekš norādīto ietekmēto API izsaukšanām.

Lai mainītu ierobežojumu, iestatiet AppContext slēdzi System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit uz jaunā ierobežojuma vērtību. Piemēram, lai iestatītu ierobežojumu uz 1 000 000 (viens miljons) iterācijām, iestatiet slēdzi, kā parādīts tālāk.

  • Šis skaitlis kontrolē kopējo iterāciju ierobežojumu, kas ir MAC iterāciju skaita, šifrētā drošā satura un apvalka maisiņa iterāciju skaita summa. Ja esat manuāli eksportējis PFX, izmantojot skaidru iterāciju skaita <iter_count> (piemēram, izmantojot openssl pkcs12 -export -iter <iter_count>) un vēlaties importēt šo PFX BLOB, iestatiet šo vides mainīgo uz vērtību, kas ir vismaz tikpat liela kā visu paredzamo iterāciju summa. Praksē .NET var atļaut kopējam iterāciju skaitam nedaudz pārsniegt jebkuru šeit konfigurēto ierobežojumu.

Lai iestatītu slēdzi lietojumprogrammas projekta failā (.csproj vai .vbproj):

<!--

  • Šis slēdzis darbojas tikai tad, ja pašreizējais projekta fails atbilst lietojumprogrammai. Nav ietekmes, ja pašreizējais projekta fails atbilst koplietojamai bibliotēkai.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="1000000" />

</ItemGroup>

Vai arī varat ievietot failu ar nosaukumu runtimeconfig.template.json ar šādu saturu tajā pašā direktorijā, kurā atrodas jūsu pieteikuma projekta fails:

{

     "configProperties": {

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

      }

}

Papildinformāciju par .NET izpildlaika konfigurācijas iestatījumu mainīšanu skatiet dokumentācijas lapā .NET izpildlaika konfigurācijas iestatījumi.

Lai pilnībā izslēgtu papildu pārbaudes, iestatiet konfigurācijas slēdzi īpašo kontrolvērtību -1, kā parādīts tālāk.

⚠️ Brīdinājums: iestatiet slēdzi AppContext uz -1 tikai tad, ja esat pārliecināts, ka mērķa programma neapstrādā neuzticamu sertifikātu ievadi.

Pieteikuma projekta failā (.csproj vai .vbproj):

<!--

  • Šis slēdzis darbojas tikai tad, ja pašreizējais projekta fails atbilst lietojumprogrammai. Nav ietekmes, ja pašreizējais projekta fails atbilst koplietojamai bibliotēkai.

-->

<ItemGroup>

  • <RuntimeHostConfigurationOption include="System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit" value="-1" />

</ItemGroup>

Vai runtimeconfig.template.json failā:

{

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

     }

}

5. opcija — papildu validācijas mašīnas modificēšana vai apslāpēšana, izmantojot reģistru (tikai Windows sistēmai .NET Framework)

Pielietojums: Šī opcija attiecas tikai uz visām .NET Framework versijām.  Tas neattiecas uz .NET 6.0+.

Lai gan .NET Framework pēc noklusējuma ierobežo importēšanas operācijas, lai veiktu ne vairāk kā 600 000 paroles iterāciju, šo ierobežojumu var konfigurēt datora mērogā, izmantojot HKLM reģistru. Šis jaunais ierobežojums attieksies uz visām iepriekš norādīto ietekmēto API izsaukšanām.

Lai mainītu ierobežojumu, reģistra atslēgā HKLM\Software\Microsoft\.NETFrameworkiestatiet vērtību Pkcs12UnspecifiedPasswordIterationLimit uz jauno ierobežojumu. Piemēram, lai iestatītu 1 000 000 (viens miljons) iterāciju ierobežojumu, izpildiet komandas, kā parādīts tālāk, no privileģētās komandu uzvednes.

  • Šis skaitlis kontrolē kopējo iterāciju ierobežojumu, kas ir MAC iterāciju skaita, šifrētā drošā satura un apvalka maisiņa iterāciju skaita summa. Ja esat manuāli eksportējis PFX, izmantojot skaidru iterāciju skaita <iter_count> (piemēram, izmantojot openssl pkcs12 -export -iter <iter_count>) un vēlaties importēt šo PFX BLOB, iestatiet šo reģistra vērtību vismaz tikpat lielu kā visu paredzamo iterāciju summa. Praksē .NET Framework var atļaut kopējam iterāciju skaitam nedaudz pārsniegt jebkuru šeit konfigurēto ierobežojumu.
  • Reģistra iestatījums ir atkarīgs no arhitektūras. Lai nodrošinātu, ka lietojumprogrammas ievēro jūsu konfigurēto vērtību neatkarīgi no to mērķa arhitektūras, atcerieties modificēt gan 32 bitu, gan 64 bitu reģistru, kā parādīts tālāk.

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

Lai pilnībā izslēgtu papildu pārbaudes, iestatiet reģistra vērtību uz -1 no privileģētās komandu uzvednes, kā parādīts tālāk.

  • ⚠️ Brīdinājums: iestatiet reģistra vērtību uz -1 tikai tad, ja esat pārliecināts, ka mērķa datorā palaistie pakalpojumi neapstrādā neuzticamu sertifikātu ievadi.
  • Lai iestatītu -1 sentinel, izmantojiet tipu REG_SZ, nevis tipu REG_DWORD. Reģistra iestatījums ir atkarīgs no arhitektūras. Lai nodrošinātu, ka lietojumprogrammas ievēro jūsu konfigurēto vērtību neatkarīgi no to mērķa arhitektūras, atcerieties modificēt gan 32 bitu, gan 64 bitu reģistru, kā parādīts tālāk.

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

Lai atgrieztu reģistra izmaiņas, izdzēsiet Pkcs12UnspecifiedPasswordIterationLimit reģistra vērtību no privileģētās komandu uzvednes.

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

Windows piezīmes

Operētājsistēmā Windows .NET Framework importē sertifikātus, izmantojot funkciju PFXImportCertStore. Šī funkcija veic pati savu validāciju, ieskaitot savu ierobežojumu noteikšanu PFX BLOB maksimālajam pieļaujamajam iterāciju skaitam. Šīs pārbaudes joprojām notiks PFX importēšanas laikā. . NET specifiskie vides mainīgie un reģistra atslēgas, kas aprakstīti iepriekš, neietekmē to, kā PFXImportCertStore veic šīs pārbaudes.