Freigeben über


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

In diesem Artikel können Sie Ausnahmen beheben, wenn Sie eine PFX-Datei mithilfe X509Certificate einer standardmäßigen .NET-Anwendung installieren.

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

Symptom

Eine .NET-Standardanwendung versucht, ein Zertifikat in einer PFX-Datei (PKCS12) programmgesteuert mithilfe der X509Certificate Oder X509Certificate2 Klasse mit Code wie dem folgenden Beispiel zu installieren:

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 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider.. ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
at System.Security.Cryptography.RSACryptoServiceProvider.. ctor(CspParameters-Parameter)
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 Klasse oder X509Certificate der X509Certificate2 Klasse installiert wird, X509Certificate oder X509Certificate2 erstellt standardmäßig einen temporären Container zum Importieren des privaten Schlüssels. Der private Schlüssel wird gelöscht, wenn kein Verweis mehr auf den privaten Schlüssel vorhanden ist.

Beschluss

Um einen dauerhaften 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);