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

197

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

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

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

ленивый демон
источник

Ответы:

292

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

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

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

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
Нилеш
источник
7
команды работают, но закрытый ключ экспортируется в формате PKCS1, и мне нужен PKCS8 ... Есть ли какой-то вариант, который мне не хватает, чтобы получить это? Например, он экспортирует '----- BEGIN RSA PRIVATE KEY -----', но мне нужен '----- BEGIN PRIVATE KEY -----'
edthethird
4
Для этого вы можете попробоватьopenssl rsa -in privateKey.pem -out private.pem
Франсуа
30
@edthethird: Чтобы получить PKCS8, добавьте флаг -nodes
Кристофер К.
7
Для экспорта без пароля добавьте -passout pass:. Ожидается, что параметр будет иметь вид pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas 07
2
@ChristopherK. Благодарность! это было хорошо для меня. добавление -nodesэкспортирует ключ правильно
TecHunter
85

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

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

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
frzng
источник
Для чего | openssl rsaнужен материал?
Snekse
1
@Snekse гарантирует, что на выходе будет только закрытый ключ. В моем случае он создает файл идентичности ( ~/.ssh/id_rsa) с некоторыми «бесполезными» атрибутами типа Bag без `| 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

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

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Али Алимохаммади
источник
1
При ответах на вопросы это помогает выделить команды. Вы можете сделать это, добавив три обратных кавычки до и после команды, так что «эхо привет» превратится в echo hello.
PatS 01
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>
Gvlax
источник
3
Добавление некоторых пояснений сделало бы этот ответ более полезным.
mx0
0

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

господин
источник
0

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

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

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Арвинд Сачдева
источник
1
Это должен быть комментарий к принятому ответу, а не ответ.
Styx