как мне создать pfx совместимый с X509Certificate2 с openssl - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь создать пару ключей RSA, которую я могу использовать с System.Security.Cryptography.X509Certificates.X509Certificate2, используя OpenSSL.

PFX, который мне удалось сгенерировать, дает мне эту трассировку стека

создатьзакрытый ключ, незашифрованный (я понимаю, что это не лучшая практика)

openssl genrsa -out private.pem 2048

создать открытый ключ из закрытого ключа

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

создать файл сертификата из закрытого ключа openssl req -x509 -key private.pem -out cert.pem -days 365 -nodes -subj "/ C = US / ST = Колорадо / L = Колорадо-Спрингс / O = Contoso / OU= Security / CN = mypurpose.contoso.org "

создать файл pfx, используя самозаверяющий сертификат

openssl pkcs12 -in cert.pem -inkey private.pem -export -out combined.pfx

запрашивает пароль дляЗащищаем pkcs

Попытка создать экземпляр X509Certificate2 с помощью

new X509Certificate2(@"C:\path\to\combined.pfx", "password", X509KeyStorageFlags.Exportable);

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
   at Program.Main()

1 Ответ

0 голосов
/ 25 апреля 2018

Трассировка стека говорит мне все.

at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)

Это означает, что в моем файле PFX нет СЕРТИФИКАТА, потому что я использовал -nocerts в команде openssl pkcs12.

В криптографии PKCS # 12 определяетформат файла архива для хранения множества криптографических объектов в виде одного файла.Он обычно используется для связывания закрытого ключа с его сертификатом X.509 или для связывания всех членов цепочки доверия. PKCS 12

Файл pkcs12 действительно хочет содержать что-то, кроме частного / открытого ключа, ему нужен сертификат X.509;а именно:

  • Версия сертификата
  • Серийный номер
  • Алгоритм подписи
  • Эмитент
  • Срок действия не ранее
  • Срок действия не после.

Это последняя команда, которая работала так, как я хотел:

openssl pkcs12 -in cert.pem -inkey private.pem -export -clcerts -out combined.pfx -passout pass:

Это позволяет мне создать экземпляр с использованием этого кода:

new X509Certificate2(@"C:\path\to\combined.pfx", (string)null, X509KeyStorageFlags.Exportable);

Есть некоторый дополнительный код, который я использую для загрузки private.pem и public.pem, сгенерированных openssl genrsa и openssl rsa здесь: https://stackoverflow.com/a/32243171/26877. Этот код загружаетсянеобработанные данные PEM (только закрытые / открытые ключи) в экземпляр RSACryptoServiceProvider, который можно использовать для шифрования и дешифрования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...