Я знаю, есть много сообщений об этом, но все же я не могу найти решение, чтобы заставить его работать. Я произвел PFX -файл с OpenSSL на моей машине, как это:Прочтите закрытый ключ из PFX-файла
openssl x509 -req -days 365 -in "myReqest.csr" -signkey "myPrivateKey.pem" -out "myCertificate.crt"
openssl pkcs12 -export -out "myCertificate.pfx" -inkey "myPrivateKey.pem" -in "myCertificate.crt" -certfile "myCertificate.crt"
В моей C# приложение, получить доступ к закрытому ключу так:
var cert = new X509Certificate2("myCertificate.pfx", "myPassword");
cert.HasPrivateKey; // This is always true!
cert.PrivateKey; // Works on my machine (only)
Это работает прекрасно (на мой машина), но когда я запускаю тот же код на другой машина, она выбрасывает: «Набор ключей не найден», хотя HasPrivateKey
возвращает true
! Не следует ли включать закрытый ключ в файл * .pfx? Можете ли вы сказать мне:
Был сертификат/закрытый ключ как-то автоматически устанавливается на моей машине OpenSSL когда я его создал?
Как я могу прочитать закрытый ключ из * .PFX-файла (или, альтернативно, из файла * .PEM)?
StackTrace исключения:
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContaier)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContaier, 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()
Update:
Я узнал, что следующая работа делает:
// on my machine
// read certificate from file (exportable!)
X509Certificate2 cert = new X509Certificate2("filename.pfx", "password", X509KeyStorageFlags.Exportable)
// sign data etc.
((RSACryptoServiceProvider)cert.PrivateKey).SignData(...
// export private key to XML-file
File.WriteAllText("filename.xml", cert.PrivateKey.ToXmlString(true));
// on the other machine
// create new RSA object
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
// import private key from xml
rsa.FromXmlString(File.ReadAllText("filename.xml"));
// verify data etc.
rsa.VerifyData(...
Однако, чтобы я, это только обходной путь, я хотел бы сделать это более обычным/стандартным способом!
Wild догадка: это * частный * ключ, сгенерированный на * ваш * машина, поэтому * ваш * машина может использовать его (я злоупотреблял курсивом для выделения) – Alex
Вы также управляете командами openssl на другой машине? (все, что вы упомянули, было «кодом»). –
@Alex Это не очень полезно. Я думал, что закрытый ключ должен быть включен в файл сертификата, так как он находился в отдельном файле, который я создал заранее, и который я включил явно при создании сертификата с помощью openssl. – marsze