Applies To.NET

Hinweis: Überarbeitet am 22. Juni 2023, um die Auflösung und Problemumgehungen zu aktualisieren

Hinweis: Überarbeitet am 15. Juni 2023, um die Aufgaben zu den Optionen 4 und 5 zu aktualisieren 

Hintergrund

Am 13. Juni 2023 hat Microsoft ein Sicherheitsupdate für .NET Framework und .NET veröffentlicht, das sich darauf auswirkt, wie die Runtime X.509-Zertifikate importiert. Diese Änderungen können dazu führen, dass der X.509-Zertifikatimport CryptographicException in Szenarien auslöst, in denen der Import vor dem Update erfolgreich gewesen wäre.

In diesem Dokument werden die Änderungen und Problemumgehungen beschrieben, die für die betroffenen Anwendungen verfügbar sind.

Betroffene 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

Betroffene APIs

Beschreibung der Änderung

Vor dem 13. Juni 2023 ändert sich, wenn .NET Framework und .NET ein binäres Zertifikatblob für den Import angezeigt wird, .NET Framework und .NET in der Regel die Überprüfung und den Import des Blobs an das zugrunde liegende Betriebssystem delegieren. Unter Windows würden .NET Framework und .NET z. B. in der Regel die PFXImportCertStore-API zum Überprüfen und Importieren verwenden.

Wenn ab dem 13. Juni 2023 .NET Framework und .NET ein binäres Zertifikatblob für den Import angezeigt wird, führen .NET Framework und .NET unter bestimmten Umständen eine zusätzliche Überprüfung durch, bevor das Blob an das zugrunde liegende Betriebssystem übergeben wird. Diese zusätzliche Überprüfung führt eine Reihe von heuristischen Überprüfungen durch, um zu bestimmen, ob das eingehende Zertifikat ressourcen beim Import böswillig aufgebraucht würde. Da dies eine zusätzliche Überprüfung ist, die über die normale Leistung des zugrunde liegenden Betriebssystems hinausgeht, können Zertifikatblobs blockiert werden, die vor der Änderung vom 13. Juni 2023 erfolgreich importiert wurden.

Bekannte Regressionen

  1. Wenn ein X.509-Zertifikat als PFX-Blob mit einer ungewöhnlich hohen Anzahl von Kennwortiterationen exportiert wurde, kann dieses Zertifikat jetzt möglicherweise nicht mehr importiert werden. Die meisten Zertifikatexporteinrichtungen verwenden eine Iterationsanzahl zwischen 2.000 und 10.000. Nachdem das Sicherheitsupdate angewendet wurde, schlägt der Import für Zertifikate mit einer Iterationsanzahl von mehr als 600.000 fehl.

  2. Wenn ein X.509-Zertifikat mit einem NULL-Kennwort [z. B. überX509Certificate.Export(X509ContentType.Pfx, (string)null)oder das kennwortloseX509Certificate.Export(X509ContentType.Pfx)]exportiert wurde, kann dieses Zertifikat jetzt möglicherweise nicht mehr importiert werden.  

    Hinweis: Die obige Regression wurde im Update vom 22. Juni 2023 behoben, das in KB5028608 erläutert wird.

  3. Wenn ein X.509-Zertifikat als PFX-Blob mithilfe der Windows-Funktion zum Schützen des privaten Schlüssels für eine SID exportiert wurde, kann dieses Zertifikat jetzt möglicherweise nicht mehr importiert werden. Dies wirkt sich auf PFX-Blobs aus, die wie folgt erstellt wurden:

    • Über den Zertifikatexport-Assistenten von Windows und angabe im Assistenten, dass der private Schlüssel für einen Domänenbenutzer geschützt werden soll; Oder

    • Über das PowerShell-Cmdlet Export-PfxCertificate , bei dem ein explizites -ProtectTo -Argument bereitgestellt wird; Oder

    • Über das Hilfsprogramm certutil , bei dem ein explizites -protectto Argument bereitgestellt wird; Oder

    • Über die PFXExportCertStoreEx-API , in der das PKCS12_PROTECT_TO_DOMAIN_SIDS-Flag bereitgestellt wird.

Lösung & Problemumgehungen

Es gibt verschiedene Problemumgehungen, je nachdem, ob Sie gezielte Änderungen an einzelnen Aufrufwebsites in Ihrem Code vornehmen oder das Verhalten einer einzelnen Anwendung ändern oder computerweite Änderungen vornehmen möchten.

Option 1 (bevorzugt): Installieren eines aktualisierten Patches

Hinweis: Dies ist die bevorzugte Option, da sie häufig gemeldete Kundenregressionen behandelt und keine Codeänderungen an der Anwendung erfordert.

Anwendbarkeit: Diese Option gilt für alle Versionen von .NET Framework und .NET.

Dieses Problem wurde im Update vom 22. Juni 2023 behoben, das in KB5028608 erläutert wurde.

Microsoft empfiehlt Kunden, bei denen Regressionen auftreten, die im Release vom 13. Juni 2023 eingeführt wurden, diesen aktualisierten Patch zu installieren, bevor Sie die weiter unten in diesem Dokument aufgeführten Problemumgehungen versuchen.

Option 2: Ändern der Anrufwebsite

Anwendbarkeit: Diese Option gilt für alle Versionen von .NET Framework und .NET.

Überlegen Sie, ob das Blob, das Sie importieren, vertrauenswürdig ist. Wurde das Blob beispielsweise von einem vertrauenswürdigen Speicherort abgerufen, z. B. einer Datenbank oder Konfigurationsdatei unter Ihrer Kontrolle, oder wurde es über eine Netzwerkanforderung bereitgestellt, die von einem nicht authentifizierten oder nicht privilegierten Client durchgeführt wurde?

Microsoft empfiehlt dringend, keine PFX-Blobs zu importieren, die Ihnen von nicht authentifizierten oder nicht privilegierten Clients bereitgestellt werden, da diese Blobs schädliches Verhalten bei der Ressourcenauslastung enthalten können.

Wenn Sie ein Zertifikatblob mit öffentlichem Schlüssel importieren müssen, das Ihnen von einer nicht vertrauenswürdigen Partei zugewiesen wurde, können Sie den folgenden Code verwenden, um ein solches Blob sicher zu importieren. In diesem Beispielcode wird die GetCertContentType-Methode verwendet, um den zugrunde liegenden Typ des Zertifikatblobs zu bestimmen, und PFX-Blobs werden abgelehnt, wenn Sie nur ein Zertifikatblob mit öffentlichem Schlüssel importieren möchten. DerX509Certificate2(byte[]) -Konstruktor kann sicher verwendet werden, wenn nicht vertrauenswürdige Nicht-PFX-Blobs vorhanden sind.

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

Wenn Sie ein Kennwortloses Zertifikatblob für private Schlüssel importieren müssen und festgestellt haben, dass das Blob vertrauenswürdig ist, können Sie die zusätzlichen Überprüfungen unterdrücken, die bis zum Sicherheitsrelease vom 13. Juni 2023 durchgeführt werden, indem Sie eine andere Konstruktorüberladung aufrufen. Sie können beispielsweise die Konstruktorüberladung aufrufen, die ein Zeichenfolgenkennwortargument akzeptiert und NULL für den Argumentwert übergeben. 

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

Option 3: Ändern oder Unterdrücken der zusätzlichen Überprüfung mithilfe einer Umgebungsvariablen

Anwendbarkeit: Diese Option gilt nur für alle Versionen von .NET Framework.  Sie gilt nicht für .NET 6.0 und höher.

Während .NET Framework Importvorgänge standardmäßig auf maximal 600.000 Iterationen eines Kennworts beschränken, kann dieser Grenzwert app- oder computerweit mithilfe einer Umgebungsvariablen konfiguriert werden. Dieser neue Grenzwert gilt für alle Aufrufe der oben aufgeführten betroffenen APIs.

Um den Grenzwert zu ändern, legen Sie die UmgebungsvariableCOMPlus_Pkcs12UnspecifiedPasswordIterationLimitauf den Wert des neuen Grenzwerts fest. Um beispielsweise den Grenzwert auf 1.000.000 (eine Million) Iterationen festzulegen, legen Sie die Umgebungsvariable wie unten dargestellt fest.

  • Diese Zahl steuert den Gesamtiterationsgrenzwert, d. h. die Summe der MAC-Iterationsanzahl, verschlüsselten sicheren Inhalten und der Iterationsanzahl des umhüllten Beutels. Wenn Sie eine PFX mithilfe einer expliziten Iterationsanzahl <iter_count> manuell exportiert haben (z. B. über openssl pkcs12 -export -iter <iter_count>) und dieses PFX-Blob importieren möchten, legen Sie diese Umgebungsvariable auf einen Wert fest, der mindestens so groß ist wie die Summe aller erwarteten Iterationen. In der Praxis können .NET Framework und .NET zulassen, dass die Gesamtzahl der Iterationen alle hier konfigurierten expliziten Grenzwerte leicht überschreitet.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=1000000

Um die zusätzlichen Überprüfungen vollständig zu unterdrücken, legen Sie die Umgebungsvariable wie unten dargestellt auf den speziellen Sentinelwert -1 fest.

  • ⚠️ Warnung: Legen Sie den Wert der Umgebungsvariablen nur auf -1 fest, wenn Sie sicher sind, dass die Zielanwendung nicht vertrauenswürdige Zertifikateingaben verarbeitet.

COMPlus_Pkcs12UnspecifiedPasswordIterationLimit=-1

Option 4: Ändern oder Unterdrücken der zusätzlichen Überprüfung mithilfe von AppContext

Anwendbarkeit: Diese Option gilt nur für .NET 6.0 und höher.  Sie gilt nicht für .NET Framework

Während .NET importvorgänge standardmäßig auf maximal 600.000 Iterationen eines Kennworts beschränkt, kann dieser Grenzwert anwendungsweit mithilfe des AppContext-Schalters konfiguriert werden. Dieser neue Grenzwert gilt für alle Aufrufe der oben aufgeführten betroffenen APIs.

Um den Grenzwert zu ändern, legen Sie den AppContext-Schalter System.Security.Cryptography.Pkcs12UnspecifiedPasswordIterationLimit auf den Wert des neuen Grenzwerts fest. Um beispielsweise den Grenzwert auf 1.000.000 (eine Million) Iterationen festzulegen, legen Sie den Schalter wie unten dargestellt fest.

  • Diese Zahl steuert den Gesamtiterationsgrenzwert, d. h. die Summe der MAC-Iterationsanzahl, verschlüsselten sicheren Inhalten und der Iterationsanzahl des umhüllten Beutels. Wenn Sie eine PFX mithilfe einer expliziten Iterationsanzahl <iter_count> manuell exportiert haben (z. B. über openssl pkcs12 -export -iter <iter_count>) und dieses PFX-Blob importieren möchten, legen Sie diese Umgebungsvariable auf einen Wert fest, der mindestens so groß ist wie die Summe aller erwarteten Iterationen. In der Praxis lässt .NET möglicherweise zu, dass die Gesamtzahl der Iterationen alle hier konfigurierten expliziten Grenzwerte leicht überschreitet.

So legen Sie den Schalter in der Projektdatei Ihrer Anwendung (CSPROJ oder VBPROJ) fest:

<!--

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

Alternativ können Sie eine Datei namens runtimeconfig.template.json mit dem folgenden Inhalt im selben Verzeichnis platzieren, das die Projektdatei Ihrer Anwendung enthält:

{

     "configProperties": {

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

      }

}

Weitere Informationen zum Ändern der Konfigurationseinstellungen für die .NET-Runtime finden Sie auf der Dokumentationsseite .NET Runtime-Konfigurationseinstellungen.

Um die zusätzlichen Überprüfungen vollständig zu unterdrücken, legen Sie den Konfigurationsschalter auf den speziellen Sentinel-Wert -1 fest, wie unten gezeigt.

⚠️ Warnung: Legen Sie den Schalter AppContext nur auf -1 fest, wenn Sie sicher sind, dass die Zielanwendung nicht vertrauenswürdige Zertifikateingaben verarbeitet.

Innerhalb der Projektdatei der Anwendung (CSPROJ oder 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>

Oder in der Datei runtimeconfig.template.json:

{

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

     }

}

Option 5: Ändern oder Unterdrücken des zusätzlichen Validierungscomputers über die Registrierung (nur Windows für .NET Framework)

Anwendbarkeit: Diese Option gilt nur für alle Versionen von .NET Framework.  Sie gilt nicht für .NET 6.0 und höher.

Obwohl .NET Framework Importvorgänge standardmäßig auf maximal 600.000 Iterationen eines Kennworts beschränken, kann dieser Grenzwert mithilfe der HKLM-Registrierung computerweit konfiguriert werden. Dieser neue Grenzwert gilt für alle Aufrufe der oben aufgeführten betroffenen APIs.

Um den Grenzwert zu ändern, legen Sie unter dem RegistrierungsschlüsselHKLM\Software\Microsoft\.NETFrameworkden WertPkcs12UnspecifiedPasswordIterationLimitauf den neuen Grenzwert fest. Um beispielsweise den Grenzwert auf 1.000.000 (eine Million) Iterationen festzulegen, führen Sie die Befehle wie unten gezeigt an einer Eingabeaufforderung mit erhöhten Rechten aus.

  • Diese Zahl steuert den Gesamtiterationsgrenzwert, d. h. die Summe der MAC-Iterationsanzahl, verschlüsselten sicheren Inhalten und der Iterationsanzahl des umhüllten Beutels. Wenn Sie eine PFX mithilfe einer expliziten Iterationsanzahl <iter_count> manuell exportiert haben (z. B. über openssl pkcs12 -export -iter <iter_count>) und dieses PFX-Blob importieren möchten, legen Sie diesen Registrierungswert auf einen Wert fest, der mindestens so groß ist wie die Summe aller erwarteten Iterationen. In der Praxis können .NET Framework zulassen, dass die Gesamtzahl der Iterationen alle hier konfigurierten expliziten Grenzwerte leicht überschreitet.

  • Die Registrierungseinstellung ist architekturabhängig. Um sicherzustellen, dass Anwendungen Ihren konfigurierten Wert unabhängig von ihrer Zielarchitektur beobachten, denken Sie daran, sowohl die 32-Bit- als auch die 64-Bit-Registrierungen wie unten dargestellt zu ändern.

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

Um die zusätzlichen Überprüfungen vollständig zu unterdrücken, legen Sie den Registrierungswert an einer Eingabeaufforderung mit erhöhten Rechten auf -1 fest, wie unten gezeigt.

  • ⚠️ Warnung: Legen Sie den Registrierungswert nur auf -1 fest, wenn Sie sicher sind, dass die auf dem Zielcomputer ausgeführten Dienste nicht vertrauenswürdige Zertifikateingaben verarbeiten.

  • Um den Sentinel -1 festzulegen, verwenden Sie den REG_SZ-Typ anstelle des REG_DWORD-Typs. Die Registrierungseinstellung ist architekturabhängig. Um sicherzustellen, dass Anwendungen Ihren konfigurierten Wert unabhängig von ihrer Zielarchitektur beobachten, denken Sie daran, sowohl die 32-Bit- als auch die 64-Bit-Registrierungen wie unten dargestellt zu ändern.

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

Um die Registrierungsänderungen zu rückgängig machen, löschen Sie den Registrierungswert Pkcs12UnspecifiedPasswordIterationLimit aus einer Eingabeaufforderung mit erhöhten Rechten.

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

Windows-spezifische Hinweise

Unter Windows .NET Framework Zertifikate über die PFXImportCertStore-Funktion importieren. Diese Funktion führt eine eigene Überprüfung durch, einschließlich des Festlegens eigener Grenzwerte für die maximal zulässige Iterationsanzahl eines PFX-Blobs. Diese Überprüfungen werden beim PFX-Import weiterhin durchgeführt. Das. Die oben beschriebenen NET-spezifischen Umgebungsvariablen und Registrierungsschlüssel wirken sich nicht darauf aus, wie PFXImportCertStore diese Überprüfungen durchführt.

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.

In den Communities können Sie Fragen stellen und beantworten, Feedback geben und von Experten mit umfassendem Wissen hören.