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


194

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

现在,我正在通过ssh-keygen生成密钥,这些密钥.ssh/authorized_key分别放在客户端的某个地方。

将来,我想使用PKCS#12容器中的密钥,因此我必须首先从中提取公钥PKCS#12,然后将其放入.ssh/authorized_keys文件中。有没有机会使它通过openssl?密钥是否PKCS#12兼容ssh-public-key身份验证?

Answers:


282

您可以使用以下命令从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 RSA PRIVATE KEY ------”
edthethird

4
为此,您可以尝试openssl rsa -in privateKey.pem -out private.pem
Francois

27
@edthethird:要获取PKCS8,请添加-nodes标志
ChristopherK。

7
要不使用密码导出,请添加-passout pass:。它期望参数采用pass:mypassword的形式。 stackoverflow.com/a/27497899/206277
nidheeshdas,

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

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

我强烈建议使用密码对私钥进行加密:

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文档

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

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

有什么| openssl rsa用?
Snekse15年

1
@Snekse确保输出中只有私钥。在我的情况下,它创建~/.ssh/id_rsa带有一些“内容”的身份文件(),例如没有`|的Bag Attributes。openssl rsa`。我猜想OpenSSH和其他使用身份文件的实用程序可以处理这些问题(我还没有尝试过),但是我只是用来仅提供必要的数据而已,仅此而已,尤其是在安全性方面。
frzng

1
这个答案对我openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
有用

7

解决方案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和已加密的PrivateKey提取到txt文件中

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

解密私钥

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

1
回答问题时,有助于突出显示命令是什么。您可以通过在命令之前和之后添加三个反引号来做到这一点,从而使“ echo hello”成为echo hello
PatS

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>

3
添加一些解释会使此答案更有用。
mx0

0

据我所知PKCS#12只是一个证书/公钥/私钥存储。如果您从PKCS#12文件中提取了公共密钥,则只要它以PEM格式提取,OpenSSH就应该能够使用它。您可能已经知道,还需要相应的私钥(也在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.