Как создать файл .pfx и .cer в Windows

Несколько лет назад я работал над проектом .NET Standard, в котором для подписи содержимого использовался закрытый ключ (в защищенном паролем файле .pfx) и соответствующий открытый ключ (в файле .cer) для проверки подписи.

В коде я использую .NET X509Certificate2, чтобы получить соответствующие ключи для подписи и проверки подписи.

Теперь я не могу вспомнить, чтобы спасти свою жизнь, какие инструменты я использовал для создания этих файлов в Windows. Может ли кто-нибудь указать мне в правильном направлении? Глядя на openssl, я могу генерировать пары открытого/закрытого ключей, но не в формате, который X509Certificate2 может прочитать.


44
1

Ответ:

Решено

Сертификат X.509 содержит является открытым ключом, но это не то же самое, что открытый ключ. X509Certificate2 может прочитать сертификат или PKCS7, который содержит сертификат, или PFX/PKCS12, который содержит сертификат и, соответствующий закрытый ключ и, возможно, любые связанные сертификаты «цепочки», но он не может читать (и, в более общем случае, может) не существует) с открытым ключом как таковым или с закрытым ключом отдельно. Для подписи вам нужен второй вариант (сертификат и закрытый ключ).

Программа openssl может создавать PFX/PKCS12 разными способами, с помощью различных комбинаций трех основных шагов:

  1. сгенерировать фактическую пару ключей (закрытый ключ и открытый ключ) в файле

  2. создать или получить сертификат для открытого ключа. Само по себе это можно сделать небольшими шагами в зависимости от того, используете ли вы сертификат от «настоящего» (внешнего) ЦС, такого как LetsEncrypt, GoDaddy, Digicert; или из частного или индивидуального ЦС, такого как Windows AD/CS, или самостоятельно; или «самозаверяющий» сертификат (один не из ЦС), который не является доверенным для большинства целей, но может быть полезен для тестирования или для приложения, которое использует сертификат только как формат контейнера для открытого ключа, а не для доверия , похоже, это может иметь место для вас.

  3. объедините закрытый ключ из 1 и сертификат из 2, а также любые «цепные» сертификаты, если требуется/желательно, в PFX/pkcs12

Для самоподписанного сертификата (самый простой случай, который, как я уже сказал, вам подходит), openssl может выполнять 1 и 2 в одной операции с

openssl req [-config conffile] -newkey $spec -keyout keyfile [-nodes] -x509 $otherfields -out certfile
# $spec can be rsa:$size or dsa:$paramfile or ecdsa:$paramfile
# $otherfields can include subject name (else it is prompted or set per the config)
# and/or -days $num -addext $type:$value -days $num -$hash; see the man page
# and/or many existing questions, or at least ask more specifically,
# but if you're not using the cert for trust probably none of these matter
#
# for all openssl commands except genpkey the flags may be given in any order
# but I show a sequence-based order that can be more easily compared 

или может выполнить 1 с использованием одного из нескольких методов, затем 2 с одной или двумя частями

# 1: old methods
openssl genrsa $size [-$cipher] >keyfile
openssl gendsa $size >keyfile
openssl ecparam -curve $name -genkey [-noout] >keyfile
# or 1: new method
openssl genpkey {-algorithm rsa | -paramfile $dsa_or_ecdsa_file} [-pkeyopt $name:$value]... >keyfile
#
# then 2: single step
openssl req [-config conffile] -new -key keyfile -x509 $otherfields >certfile
# or 2: two steps
openssl req [-config conffile] -new -key keyfile $someotherfields >reqfile
openssl x509 -req <reqfile -signkey keyfile [-extfile $file [-extsect $sect]] -days $num -$hash >certfile

или он может комбинировать 1 с первой частью 2, за которой следует вторая часть 2

openssl req [-config conffile] -newkey $spec -keyout keyfile [-nodes] $someotherfields >reqfile
openssl x509 -req <reqfile -signkey keyfile [-extfile $file [-extsect $sect]] -days $num $hash >certfile 

Для сертификата, выданного ЦС, шаг 1 и первая часть шага 2 (req -new[key]) по отдельности или в сочетании одинаковы, но вторая часть шага 2 (x509 -req -signkey) заменяется процессом отправки reqfile в ЦС и получения вернуть сертификат; это, в свою очередь, сильно различается, слишком много, чтобы можно было решить одним ответом, поэтому я не буду пытаться.

После любого из вышеперечисленных openssl шаг 3 (всегда и просто):

openssl pkcs12 -export -in certfile -inkey keyfile -out pfxfile
# add -certfile chaincerts if and as needed

Сравните Как сгенерировать самозаверяющий SSL-сертификат с помощью OpenSSL?, который показывает эволюцию в этой области за последнее десятилетие и включает в себя больше внимания к тому, чтобы сделать сертификат надежным, особенно для браузеров, но не излагает параметры систематически, как я сделал выше, и не включает шаг 3 (хотя многие другие вопросы покройте это отдельно: выполните поиск «преобразовать PEM в PKCS12» или «преобразовать PEM в PFX»). Если вы используете OpenSSL непосредственно в Windows (не WSL), например. от ShiningLight, справочные страницы доступны онлайн по адресу https://www.openssl.org/docs/manpages.html.

Наконец, в качестве альтернативы, powershell может сделать это с помощью Новый самоподписанный сертификат, по крайней мере, с Eight; У меня считать это было в Семерке, но сейчас не могу проверить. Он генерирует сертификат пары ключей и, соответствующий шагам 1 и 2, но (оба) в хранилище Windows вместо файлов, поэтому вы следуете Экспорт-PFXCertificate, чтобы получить их в файле PFX (или вы можете использовать задачу экспорта в MMC/certmgr.msc , но зачем заморачиваться, если ты и так в шикарном?).