Извлечение открытого / закрытого ключа из файла PKCS12 для последующего использования в SSH-PK-Authentication
Я хочу извлечь открытый и закрытый ключ из моего файла PKCS#12 для последующего использования в SSH-Public-Key-Authentication.
Прямо сейчас я генерирую ключи через ssh-keygen, который я помещаю в .ssh/ авторизованный_ключ, соответствующий где-то на стороне клиента.
В будущем я хочу использовать ключи из контейнера PKCS#12, поэтому мне нужно сначала извлечь открытый ключ из PKCS#12, а затем поместить их в файл.ssh/ authorized_keys-file. Есть ли шанс заставить это работать через openssl? Совместимы ли ключи в PKCS#12 для аутентификации ssh-public-key?
6 ответов
Вы можете использовать следующие команды для извлечения открытого / закрытого ключа из контейнера PKCS#12:
PKCS # 1 Закрытый ключ
openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Сертификаты:
openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
Это возможно с небольшим преобразованием формата.
Для распаковки закрытого ключа в формате 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
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
Решение 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
Принятый ответ - правильная команда, я просто хочу добавить еще одну вещь, при извлечении ключа, если вы оставите пароль PEM ("Введите пароль PEM:") пустым, тогда полный ключ не будет извлечен, а будет только localKeyID быть извлеченным. Чтобы получить полный ключ, вы должны указать пароль PEM, выполнив следующую команду.
Обратите внимание, что когда дело доходит до пароля импорта, вы можете указать действительный пароль для "Введите пароль импорта:" или можете оставить этот пароль пустым.
openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Обновление: я заметил, что мой ответ был просто плохой дубликат хорошо объясненного вопроса на 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>
Насколько я знаю, PKCS#12 - это просто хранилище сертификатов / открытых / закрытых ключей. Если вы извлекли открытый ключ из файла PKCS#12, OpenSSH сможет использовать его, если он извлечен в формате PEM. Вы, вероятно, уже знаете, что вам также нужен соответствующий закрытый ключ (также в PEM), чтобы использовать его для аутентификации ssh-public-key.