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

laz*_*mon 184 ssh openssl certificate pkcs#12 x509

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

现在,我通过ssh-keygen生成密钥,我将它放在.ssh/authorized_key中,分别位于客户端的某个地方.

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

Nil*_*esh 273

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

  • @edthethird:要获取PKCS8,请添加-nodes标志 (25认同)
  • 命令工作,但私钥导出为PKCS1格式,我需要PKCS8 ...有没有我想要的选项来获得这个?例如,它输出'----- BEGIN RSA PRIVATE KEY -----'但我需要'----- BEGIN PRIVATE KEY -----' (7认同)
  • 要在没有密码的情况下导出,请添加`-passout pass:`.它希望参数的格式为pass:mypassword.http://stackoverflow.com/a/27497899/206277 (7认同)
  • 要做到这一点,你可以尝试`openssl rsa -in privateKey.pem -out private.pem` (4认同)
  • @ChristopherK.谢谢!这对我来说是个好人.添加`-nodes`正确导出密钥 (2认同)

rya*_*anc 82

通过一些格式转换可以实现这一点.

要以openssh格式提取私钥,可以使用:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa
Run Code Online (Sandbox Code Playgroud)

要将私钥转换为公钥:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8
Run Code Online (Sandbox Code Playgroud)

要以openssh格式提取公钥,可以使用:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!第一行是我需要的.只是密钥,未加密,所以它可以通过大多数CDN自动化系统安装. (2认同)
  • @PhilipRego 我认为您混淆了公钥和私钥。RSA 公钥是两个值,“e”是公共指数,“n”是模数——这两个值都与密钥的私有部分一起存储。 (2认同)

frz*_*zng 16

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
Run Code Online (Sandbox Code Playgroud)

我强烈建议用密码加密私钥:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

显然,在命令行上写一个纯文本密码也不安全,所以你应该从历史记录中删除最后一个命令,或者只是确保它没有到达那里.不同的贝壳有不同的方式.您可以在命令前加上空格,以防止它在Bash和许多其他shell中保存到历史记录中.以下是如何在Bash中从历史记录中删除命令:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用不同的方式将私钥密码传递给OpenSSL - 请参阅OpenSSL文档以获取密码参数.

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

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)


小智 6

解决方案1:

从jks提取P12

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12
Run Code Online (Sandbox Code Playgroud)

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

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt
Run Code Online (Sandbox Code Playgroud)

从jks提取密钥

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key
Run Code Online (Sandbox Code Playgroud)

解决方案2:

将PEM和encryptedPrivateKey提取到txt文件中

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt
Run Code Online (Sandbox Code Playgroud)

解密私钥

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Run Code Online (Sandbox Code Playgroud)