Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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);