Витягніть відкритий / приватний ключ з файлу PKCS12 для подальшого використання в SSH-PK-аутентифікації


194

Я хочу витягнути відкритий і приватний ключ з мого PKCS#12файлу для подальшого використання в SSH-Public-Key-Authentication.

Зараз я генерую ключі за допомогою ssh-keygen, який я вкладаю .ssh/authorized_key, відповідно десь на стороні клієнта.

Надалі я хочу використовувати ключі від PKCS#12контейнера, тому я повинен витягнути спочатку відкритий ключ, PKCS#12а потім укласти їх у .ssh/authorized_keysфайл. Чи є шанс налагодити це openssl? Чи PKCS#12сумісні ключі для аутентифікації ssh-відкритого ключа?

Відповіді:


284

Ви можете використовувати наступні команди для витягування відкритого / приватного ключа з контейнера PKCS # 12:

  • ПКС №1 Приватний ключ

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Сертифікати:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
команди працюють, але приватний ключ експортується у форматі PKCS1, і мені потрібен PKCS8 ... Чи є якийсь варіант, який я пропускаю, щоб отримати це? Наприклад, він експортує "-----
НАЧАЙТЕ РОЗВ'ЯЗАННЯ КЛЮЧА

4
Для цього можна спробуватиopenssl rsa -in privateKey.pem -out private.pem
Франсуа

28
@edthethird: Щоб отримати PKCS8, додайте прапор -nodes
Крістофер К.

7
Щоб експортувати без пароля, додайте -passout pass:. Він очікує, що параметр буде у формі переходу: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK. Дякую! це було для мене гарним. -nodesправильно додавши експорт ключа
TecHunter

85

Це можливо за допомогою трохи перетворення формату.

Для вилучення приватного ключа у форматі opensh можна використовувати:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Щоб перетворити приватний ключ у відкритий:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Для вилучення відкритого ключа у форматі opensh можна використовувати:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
Дякую! Перший рядок був потрібний мені. Просто ключ, незашифрований, тому його можна встановити через більшість автоматизованих систем CDN.
BTC

1
@PhilipRego Я думаю, що у вас заплутані публічні та приватні ключі. Публічний ключ RSA - це два значення, 'e' відкритий показник, і 'n' модуль - обидва вони зберігаються поряд з приватними частинами ключа.
ryanc

17

OpenSSH не може використовувати файли PKCS # 12 поза коробкою. Як запропонували інші, ви повинні витягнути приватний ключ у форматі PEM, який доставить вас із землі OpenSSL до OpenSSH. Інші рішення, згадані тут, не працюють для мене. Я використовую OS X 10.9 Mavericks (10.9.3 на даний момент) з "попередньо упакованими" утилітами (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Спочатку витягніть приватний ключ у форматі PEM, який безпосередньо використовуватиме OpenSSH:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Я настійно пропоную зашифрувати приватний ключ паролем:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Очевидно, що написання просто-текстового пароля в командному рядку також не є безпечним, тому слід видалити останню команду з історії або просто переконатися, що вона туди не потрапила. У різних оболонок є різні способи. Ви можете приєднати свою команду пробілом, щоб запобігти її збереженню до історії в Bash та багатьох інших оболонках. Ось також, як видалити команду з історії в Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Крім того, ви можете використовувати інший спосіб передачі пароля приватного ключа OpenSSL - зверніться до документації OpenSSL щодо аргументів про фразу .

Потім створіть відкритий ключ OpenSSH, який можна додати до файлу санкціонованих ключів:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

Для чого потрібні | openssl rsaречі?
Снексе

1
@Snekse це гарантує, що у виході є лише приватний ключ. У моєму випадку він створює файл ідентичності ( ~/.ssh/id_rsa) з деяким "суворим", як атрибути сумки без `| openssl rsa`. Я думаю, що OpenSSH та інші утиліти, які використовують файл посвідчення, можуть обробляти цю суть (я не пробував), але я просто використовується для надання лише необхідних даних і нічого більше, особливо якщо це щось навколо безпеки.
frzng

1
Ця відповідь допомогла мені отримати доступ до приватного ключа формату PEM у терміналі, який я зміг скопіювати / вставити: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

Рішення 1:

Витяг P12 з jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Витягніть PEM з P12 та редагуйте файл та pem з файлу crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Витягнути ключ з jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Рішення 2:

Витягніть PEM та зашифрованийPrivateKey до файлу txt```

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Розшифруйте приватний ключ

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
Відповідаючи на запитання, це допомагає виділити, що таке команди. Ви можете зробити це, додавши три зворотні котировки до та після команди, так що `` echo hello`` стає echo hello.
PatS

2

Оновлення: я помітив, що моя відповідь була лише поганим дублікатом добре поясненого питання на https: //unix.stackexchange.com / ... автор BryKKan

Ось витяг з нього:

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>

3
Додавання якихось пояснень зробить цю відповідь кориснішою.
mx0

0

Наскільки мені відомо, PKCS №12 - це лише сертифікат / відкритий / приватний ключ. Якщо ви витягли відкритий ключ з файлу PKCS # 12, OpenSSH повинен мати можливість користуватися ним, доки він був вилучений у форматі PEM . Ви, напевно, вже знаєте, що вам також потрібен відповідний приватний ключ (також у PEM ) для того, щоб використовувати його для аутентифікації ssh-відкритого ключа.


0

Прийнята відповідь - це правильна команда, я просто хочу додати ще одну додаткову річ, коли виймаєте ключ, якщо ви залишаєте пароль PEM ( "Enter PEM pass phrase:") порожнім, тоді повний ключ не буде вилучений, а буде вилучено лише те, що localKeyIDбуде. Для отримання повного ключа потрібно вказати PM-пароль для пароля, який виконує наступну команду.

Зауважте, що якщо мова йде про пароль імпорту, ви можете вказати фактичний пароль "Enter Import Password:"або залишити цей пароль порожнім:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

1
Це має бути коментар до прийнятої відповіді, а не відповідь.
Styx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.