Извлечение открытого / закрытого ключа из файла PKCS12 для последующего использования в SSH-PK-Authentication - PullRequest
174 голосов
/ 29 февраля 2012

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

Прямо сейчас я генерирую ключи через ssh-keygen, который помещаю в .ssh / авторизованный_ключ , соответствующий где-нибудь на стороне клиента.

В будущем я хочу использовать ключи из контейнера PKCS # 12, поэтому мне нужно сначала извлечь открытый ключ из PKCS # 12, а затем поместить их в .ssh / authorized_keys -файл. Есть ли шанс заставить это работать через openssl? Совместимы ли ключи в PKCS # 12 для аутентификации ssh-public-key?

Ответы [ 7 ]

262 голосов
/ 01 марта 2012

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

  • PKCS # 1 Закрытый ключ

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

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
79 голосов
/ 15 марта 2012

Это возможно с небольшим преобразованием формата.

Чтобы извлечь закрытый ключ в формате, openssh может использовать:

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

Для извлечения открытого ключа в формате openssh можно использовать:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
14 голосов
/ 06 июня 2014

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, который можно добавить в файл author_keys:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
4 голосов
/ 22 февраля 2018

Решение 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 и encryptedPrivateKey в текстовый файл```

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

Расшифровать privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
1 голос
/ 15 ноября 2018

Обновление: Я заметил, что мой ответ был просто плохой дубликат хорошо объясненного вопроса по 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>
0 голосов
/ 18 апреля 2019

Принятый ответ - правильная команда, я просто хочу добавить еще одну вещь, при извлечении ключа, если вы оставите пароль PEM («Введите пароль PEM:») пустым, тогда полный ключ не будет извлечен, а только localKeyID будет извлечен. Чтобы получить полный ключ, вы должны указать пароль PEM, выполнив следующую команду.

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

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
0 голосов
/ 01 марта 2012

Насколько я знаю, PKCS # 12 - это просто хранилище сертификатов / открытых / закрытых ключей. Если вы извлекли открытый ключ из файла PKCS # 12, OpenSSH сможет использовать его, если он был извлечен в формате PEM . Вы, вероятно, уже знаете, что вам также нужен соответствующий закрытый ключ (также в PEM ), чтобы использовать его для аутентификации ssh-public-key.

...