Перетворення сертифіката 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 повинні бути дозволені для переповнення стека" Я підтримаю, тому що відповідь відповідала моїм потребам (хоча, для мене, я не програмував, я міг легко включити відповідь у програму, якщо хотів)
розміщення

Відповіді:


536

Спробуйте:

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
Gee-Bee

2
запитувати імпорт пароля. що це ?
Саурабх Чандра Патель

4
@SaurabhChandraPatel ви повинні знати пароль для свого сертифіката. Це не спосіб відновити забутий пароль
Дін Макгрегор

2
пропускаючи -ноди, приватний ключ не витягується.
Мейкснер

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().
KVISH

2
Якщо ви використовуєте python 3, ви, ймовірно, захочете записати вміст у файли: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))написати cert та 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

Чому "навіть простіше" створити файл, ввести код, зберегти його та запустити його, а не просто виконати одну команду?
Torben Gundtofte-Bruun

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.