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

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

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

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


person lazydaemon    schedule 29.02.2012    source источник


Ответы (7)


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

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

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

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
person Nilesh    schedule 01.03.2012
comment
команды работают, но закрытый ключ экспортируется в формате PKCS1, и мне нужен PKCS8 ... Есть ли какой-то вариант, который мне не хватает, чтобы получить это? Например, он экспортирует '----- BEGIN RSA PRIVATE KEY -----', но мне нужен '----- BEGIN PRIVATE KEY -----' - person edthethird; 27.08.2015
comment
Для этого вы можете попробовать openssl rsa -in privateKey.pem -out private.pem - person Francois; 12.11.2015
comment
@edthethird: чтобы получить PKCS8, добавьте флаг -nodes - person Christopher K.; 19.11.2015
comment
Для экспорта без пароля добавьте -passout pass:. Ожидается, что параметр будет иметь вид pass: mypassword. stackoverflow.com/a/27497899/206277 - person nidheeshdas; 07.02.2016
comment
@ChristopherK. Благодарность! это было хорошо для меня. добавление -nodes экспортирует ключ правильно - person TecHunter; 17.02.2017
comment
Чтобы получить сертификат CA, используйте openssl pkcs12 -in yourP12File.pfx -cacerts -nokeys -out caCert.pem - person mlerley; 17.10.2019
comment
Это экспортирует только первый сертификат. - person Philip Rego; 04.03.2020

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

Чтобы извлечь закрытый ключ в формате, 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
person ryanc    schedule 15.03.2012
comment
Спасибо! Первая строчка была той, которая мне была нужна. Просто ключ, незашифрованный, поэтому его можно установить через большинство автоматизированных систем CDN. - person BTC; 26.01.2017
comment
@PhilipRego Я думаю, вы перепутали открытый и закрытый ключи. Открытый ключ RSA - это два значения: «e» - публичная экспонента и «n» - модуль, оба из которых хранятся вместе с частными частями ключа. - person ryanc; 20.07.2017

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

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
person F4-Z4    schedule 05.06.2014
comment
Для чего этот | openssl rsa материал? - person Snekse; 17.09.2015
comment
@Snekse гарантирует, что на выходе будет только закрытый ключ. В моем случае он создает файл идентичности (~/.ssh/id_rsa) с некоторыми «бестолковыми» атрибутами вроде Bag Attributes без `| openssl rsa`. Я предполагаю, что OpenSSH и другие утилиты, использующие файл идентификации, могут справиться с этим мусором (я не пробовал), но я просто привык предоставлять только необходимые данные и ничего более, особенно если это что-то связано с безопасностью. - person F4-Z4; 23.09.2015
comment
Этот ответ помог мне получить доступ к закрытому ключу в формате PEM в терминале, который я смог скопировать / вставить: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts - person BillyRayCyrus; 30.09.2015

Решение 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
person Ali Alimohammadi    schedule 22.02.2018
comment
При ответах на вопросы это помогает выделить команды. Вы можете сделать это, добавив три обратных кавычки до и после команды, чтобы `` echo hello`` превратилось в echo hello. - person PatS; 01.06.2018

Обновление: я заметил, что мой ответ был просто плохой копией хорошо объясненного вопроса на https://unix.stackexchange.com/questions/367220/how-to-export-ca-certificate-chain-from-pfx-in-pem-format-without-bag-attributes?rq=1 от 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>
person gvlax    schedule 15.11.2018
comment
Добавление некоторых пояснений сделало бы этот ответ более полезным. - person mx0; 15.11.2018

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

person sirgeorge    schedule 29.02.2012

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

Обратите внимание, что когда дело доходит до импорта пароля, вы можете указать фактический пароль для "Enter Import Password:" или оставить этот пароль пустым:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
person Arvind Sachdeva    schedule 18.04.2019
comment
Это должен быть комментарий к принятому ответу, а не ответ. - person Styx; 18.04.2019