从PKCS12文件中提取公钥/私钥,以便以后在SSH-PK-Authentication中使用

时间:2012-02-29 10:53:06

标签: ssh openssl certificate x509 pkcs#12

我想从PKCS#12文件中提取公钥和私钥,以便以后在SSH-Public-Key-Authentication中使用。

现在,我正在通过ssh-keygen生成密钥,我将其放入 .ssh / authorized_key ,分别位于客户端的某个位置。

将来,我想使用PKCS#12容器中的密钥,所以我先从PKCS#12中提取公钥,然后将它们放入 .ssh / authorized_keys -file。有没有机会通过openssl实现这一点? PKCS#12中的密钥是否与ssh-public-key身份验证兼容?

7 个答案:

答案 0 :(得分:262)

您可以使用以下命令从PKCS#12容器中提取公钥/私钥:

  • PKCS#1私钥

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • 证书:

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

答案 1 :(得分:78)

这可以通过一些格式转换来实现。

要以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 :(得分:14)

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和许多其他shell中保存到历史记录中。以下是如何在Bash中从历史记录中删除命令:

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

或者,您可以使用不同的方式将私钥密码传递给OpenSSL - 请咨询OpenSSL documentation for pass phrase arguments

然后,创建一个可以添加到authorized_keys文件的OpenSSH公钥:

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

答案 3 :(得分:4)

解决方案1:

从jks中提取P12

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

从P12中提取PEM并从crt文件中编辑文件和pem

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解压缩为txt文件```

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

解密privateKey

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

答案 4 :(得分:1)

更新:我注意到我的答案只是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>

答案 5 :(得分:0)

据我所知,PKCS#12只是一个证书/公钥/私钥存储。如果从PKCS#12文件中提取公钥,只要以 PEM 格式提取,OpenSSH就应该能够使用它。您可能已经知道您还需要相应的私钥(也在 PEM 中),以便将其用于ssh-public-key身份验证。

答案 6 :(得分:0)

可接受的答案是正确的命令,我只想添加一件事,在提取密钥时,如果将PEM密码(“输入PEM密码:”为空)留空,则不会提取完整的密钥,而仅提取将提取localKeyID。要获取完整的密钥,您必须运行以下命令来指定PEM密码。

请注意,在导入密码时,您可以为“输入导入密码:”指定实际密码,也可以将此密码留空。

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