Преобразование сертификата PKCS # 12 в PEM с использованием OpenSSL


212

У меня есть OpenSSL x64 в Windows 7, который я скачал из openssl-for-windows в Google Code . Я пытаюсь запустить:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

но я получаю ошибку.

unable to load private key

Как извлечь сертификат в PEM из хранилища PKCS # 12 с помощью OpenSSL?


@jww Я думаю, с учетом того, что этому вопросу уже более 3 лет, что уже немного поздно сигнализировать о не по теме флаг.
Дин МакГрегор,

Просто формальность, чтобы люди знали, что это не по теме. Люди задают одни и те же не по теме вопросы и цитируют этот вопрос. Если людям не говорят, что это не по теме, они продолжат спрашивать о переполнении стека.
jww

2
@jww в ответе на мета-вопрос, на который вы ссылаетесь, написано: «Вопросы DevOps должны быть разрешены при переполнении стека». Я буду голосовать, потому что ответ отвечал моим потребностям (хотя для меня я не программировал, я мог бы легко включить ответ в программу, если бы захотел)
dcorking

Ответы:


538

Пытаться:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

После этого у вас есть:

  • сертификат в newfile.crt.pem
  • закрытый ключ в newfile.key.pem

Чтобы поместить сертификат и ключ в один файл, используйте следующую

openssl pkcs12 -in path.p12 -out newfile.pem

Если вам нужно ввести пароль PKCS # 12 непосредственно из командной строки (например, из скрипта), просто добавьте -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'

2
Возможно ли, что закрытый ключ и сертификат будут храниться в одном файле * .pem?
Рамис

18
да, это:openssl pkcs12 -in path.p12 -out newfile.pem
Джи-Би

2
запрашивая пароль для импорта. что это такое ?
Саурабх Чандра Патель

4
@SaurabhChandraPatel вы должны знать пароль для вашего сертификата. Это не средство для восстановления забытого пароля
Дин МакГрегор

2
Опуская -nodes, закрытый ключ не извлекается.
Meixner

22

Вам просто нужно ввести пароль. Вы можете сделать это в одной командной строке со следующим синтаксисом:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

Затем вам будет предложено ввести пароль для шифрования закрытого ключа в выходном файле. Включите параметр «узлы» в строку выше, если вы хотите экспортировать закрытый ключ в незашифрованном виде (в виде открытого текста):

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

Дополнительная информация: http://www.openssl.org/docs/apps/pkcs12.html.


16

Если вы можете использовать Python, это будет еще проще, если у вас есть pyopensslмодуль. Вот:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())

Есть ли причина открывать файл используя fileи нет open? Я просто хочу понять, как я собираюсь использовать его в будущем (чтобы упростить свое решение, вызывая openssh в качестве команды)
Ян Влчинский

Нет, нет разницы. Вы можете просто сделать open("push.p12", 'rb').read().
КВИШ

2
Если вы используете Python 3, вы, вероятно, захотите записать содержимое в файлы: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))написать сертификат и with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))ключ.
Адам Паркин

Я использую Python 3.7, при запуске приведенного выше примера, я получаю следующее: "TypeError: инициализатор для ctype 'char' должен быть байтов длиной 1, а не str" Есть ли что-то не так с моим паролем
getaglow

Почему «еще проще» создать файл, ввести код, сохранить его и запустить его, а не просто выполнить одну команду?
Торбен Гундтофте-Брюн

3

У меня был файл PFX, и мне нужно было создать файл KEY для NGINX, поэтому я сделал это:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

Затем мне пришлось отредактировать файл KEY и удалить все содержимое до -----BEGIN PRIVATE KEY-----. После этого NGINX принял файл KEY.


0

Если вам нужен файл PEM без пароля, вы можете использовать это решение.

Просто скопируйте и вставьте закрытый ключ и сертификат в тот же файл и сохраните как .pem.

Файл будет выглядеть так:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

Это единственный способ загрузить сертификаты на устройства Cisco для HTTPS.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.