Installieren einer PFX-Datei mithilfe von X509Certificate aus einer .NET-Standardanwendung

Dieser Artikel hilft Ihnen beim Beheben von Ausnahmen, wenn Sie eine PFX-Datei mithilfe X509Certificate einer standardmäßigen .NET-Anwendung installieren.

Ursprüngliche Produktversion:   .NET Framework
Ursprüngliche KB-Nummer:   950090

Problembeschreibung

Eine .NET-Standardanwendung versucht, ein Zertifikat in einer PFX-Datei (PKCS12) programmgesteuert mithilfe des X509Certificate Codes oder der Klasse zu X509Certificate2 installieren, wie im folgenden Beispiel gezeigt:

X509Certificate2 cert = new X509Certificate2("a.pfx", "password");
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);

oder

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.MachineKeySet);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(xCertificate);

Der folgende Ausnahmetyp tritt auf, wenn Sie versuchen, den privaten Schlüssel des Zertifikats in einer anderen Anwendung zu verwenden:

Unbehandelte Ausnahme: System.Security.Cryptography.CryptographicException: Keyset ist nicht vorhanden
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 telemetrKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
unter System.Security.Cryptography.RSACryptoServiceProvider.. ctor(Int32 wetterKeySize, CspParameters parameters, Boolean useDefaultKeySize)
unter System.Security.Cryptography.RSACryptoServiceProvider.. ctor(CspParameters parameters)
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
at UseCertPrivateKey.Program.Main(String[] args) in C: \ UseCertPrivateKey\Program.cs:line 20

Ursache

Wenn das Zertifikat mithilfe der oder Klasse installiert wird X509Certificate X509Certificate2 oder standardmäßig ein X509Certificate X509Certificate2 temporärer Container zum Importieren des privaten Schlüssels erstellt wird. Der private Schlüssel wird gelöscht, wenn kein Verweis mehr auf den privaten Schlüssel vorhanden ist.

Lösung

Um einen permanenten Schlüsselcontainer für den privaten Schlüssel zu erstellen, muss das X509KeyStorageFlags.PersistKeySet Flag verwendet werden, um zu verhindern, dass .NET den Schlüsselcontainer löscht. Stattdessen sollte der folgende Code verwendet werden.

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.PersistKeySet);
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);

oder

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(xCertificate);