Преобразование сертификата 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'
KMX
источник
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.

Colin
источник
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())
KVISH
источник
Есть ли причина открывать файл используя 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.

KTCO
источник
0

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

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

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

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

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

Yeya
источник