Я получаю одно из следующих исключений при попытке получить закрытый ключ из сертификата X509Certificate2:
System.Security.Cryptography.CryptographicException: указан недопустимый тип поставщика.
OR
System.Security.Cryptography.CryptographicException: ключ не существует в следующей строке кода: RSACryptoServiceProvider rsaKey = (RSACryptoServiceProvider) digiSignCert.PrivateKey;
Трассировки стека:
System.Security.Cryptography.CryptographicException: ключ не существует. на System.Security.Cryptography.Utils.GetKeyPairHelper (CspAlgorithmType KeyType, параметры CspParameters, булевой randomKeyContainer, Int32 dwKeySize, SafeProvHandle & safeProvHandle, SafeKeyHandle & safeKeyHandle) в System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair () в System.Security.Cryptography.RSACryptoServiceProvider. .ctor (Int32 dwKeySize, параметры CspParameters, логическое значение useDefaultKeySize) в System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey () в Api.CertificateUtil.GetSignedXml (String xml, X509Certificate2 private)
Код:
public static RSACryptoServiceProvider rsaKey = null;
public X509Certificate2 _PrivateCert;
public APISearch()
{
byte[] privateCert = null;//We get the actual certificate file data here
GetPrivateCerificate(privateCert, "abc@123");
GetSignedXml(_PrivateCert);
}
public void GetPrivateCerificate(byte[] privateCert, string pwd)
{
_PrivateCert = new X509Certificate2(privateCert, pwd, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
}
public void GetSignedXml(X509Certificate2 privateCert)
{
rsaKey = (RSACryptoServiceProvider)privateCert.PrivateKey; //Occassional Exception
}
Ожидаемый результат: (RSACryptoServiceProvider)privateCert.PrivateKey
всегда должен выдавать закрытый ключ.
Фактический результат: Иногда вышеупомянутые исключения выбрасываются в эту строку:
rsaKey = (RSACryptoServiceProvider)privateCert.PrivateKey;
а иногда закрытый ключ успешно извлекается из файла сертификата. На данный момент нам не удалось отследить характер этой проблемы.