我想从PKCS#12文件中提取公钥和私钥,以便以后在SSH-Public-Key-Authentication中使用。
现在,我通过ssh-keygen生成密钥,我把它放在。ssh/authorized_key中,分别放在客户端的某个地方。
以后,我想使用PKCS#12容器中的密钥,因此我必须首先从PKCS#12中提取公钥,然后将它们放入.ssh/authorized_keys文件中。有没有机会让这个工作通过openssl?PKCS#12中的密钥是否与ssh-public-key身份验证兼容?
解决方案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
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文档。
然后,创建一个OpenSSH公钥,可以添加到authorized_keys文件中:
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub