Как экспортировать цепочку сертификатов CA из PFX в формат PEM без атрибутов bag

Как экспортировать цепочку сертификатов CA из PFX в формат PEM без атрибутов bag

У меня есть файл PKCS12, содержащий полную цепочку сертификатов и закрытый ключ. Мне нужно разбить его на 3 файла для приложения. Мне нужны следующие 3 файла (в формате PEM):

  • незашифрованный ключевой файл
  • файл сертификата клиента
  • файл сертификата CA (корневой и все промежуточные)

Это обычная задача, которую мне приходится выполнять, поэтому я ищу способ сделать это без ручного редактирования вывода.

Я попробовал следующее:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.cer>

Это работает нормально, однако выходные данные содержат атрибуты сумки, с которыми приложение не знает, как работать.

После некоторых поисков я нашел предлагаемое решение — передать результаты через x509, чтобы удалить атрибуты сумки.

openssl x509 -in <clientcert.cer> -out <clientcert.cer>

Это работает, но я столкнулся с проблемой в файле cacert. Выходной файл содержит только один из 3 сертификатов в цепочке.

Есть ли способ избежать включения атрибутов bag в вывод команды pkcs12 или способ сделать так, чтобы вывод команды x509 включал все сертификаты? Кроме того, если запуск через x509 является самым простым решением, есть ли способ перенаправить вывод из pkcs12 в x509 вместо того, чтобы записывать файл дважды?

решение1

В конце концов я пришел к решению пропустить его через sed.

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>

решение2

Другое решение без sed:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | openssl pkcs8 -nocrypt -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | openssl x509 -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>

решение3

Однострочник с awk:

openssl pkcs12 -in key.pfx -nodes -out - | awk '/-----BEGIN/{a=1}/-----END/{print;a=0}a'

Это отбрасывает все выходные данные, которые не находятся между строками начала и конца PEM. Заслуга за AWK принадлежитhttps://stackoverflow.com/q/17988756#comment29487454_17988834

решение4

Только что попробовал использовать

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>

чтобы экспортировать цепочку в простом формате без заголовков для каждого элемента в цепочке. На этом сервере Windows NT я экспортировал только первый элемент цепочки, а не два элемента, которые я ожидал. Вместо этого я просто использовал

openssl pkcs12 -in <filename.pfx> -cacerts -chain -nokeys -nodes -out <cacerts.cer>

и редактирование файлов с помощью Блокнота для удаления ненужного текста. Неэлегантно? Да, но это дало нужный результат.

Связанный контент