Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PKCS12文件中提取公钥/私钥,以便以后在SSH PK身份验证中使用_Ssh_Openssl_Certificate_X509_Pkcs#12 - Fatal编程技术网

从PKCS12文件中提取公钥/私钥,以便以后在SSH PK身份验证中使用

从PKCS12文件中提取公钥/私钥,以便以后在SSH PK身份验证中使用,ssh,openssl,certificate,x509,pkcs#12,Ssh,Openssl,Certificate,X509,Pkcs#12,我想从我的PKCS#12文件中提取公钥和私钥,以便以后在SSH公钥身份验证中使用 现在,我正在通过ssh-keygen生成密钥,我将其放入.ssh/authorized_-key,分别放在客户端的某个地方 将来,我想使用PKCS#12容器中的密钥,因此我必须首先从PKCS#12中提取公钥,然后将它们放入.ssh/authorized#u keys文件中。是否有机会通过openssl实现此功能?PKCS#12中的密钥是否与ssh公钥身份验证兼容?据我所知,PKCS#12只是一个证书/公钥/私钥存储

我想从我的
PKCS#12
文件中提取公钥和私钥,以便以后在SSH公钥身份验证中使用

现在,我正在通过ssh-keygen生成密钥,我将其放入
.ssh/authorized_-key
,分别放在客户端的某个地方


将来,我想使用
PKCS#12
容器中的密钥,因此我必须首先从
PKCS#12
中提取公钥,然后将它们放入
.ssh/authorized#u keys
文件中。是否有机会通过
openssl
实现此功能?
PKCS#12
中的密钥是否与ssh公钥身份验证兼容?

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

您可以使用以下命令从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 pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
要将私钥转换为公钥,请执行以下操作:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8
要以openssh可以使用的格式提取公钥:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa
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。这里提到的其他解决方案对我不起作用。我使用OSX10.9Mavericks(目前为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-consult

然后,创建一个OpenSSH公钥,该公钥可以添加到授权密钥文件中:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
解决方案1:

从jks中提取P12

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12
openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key
从P12中提取PEM并编辑文件和crt文件中的PEM

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt
从jks中提取密钥

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12
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
解密私钥

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

更新:我注意到我的答案只是一个很好地重复了上一个问题的答案

以下是它的摘录:

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>
opensslpkcs12-in-nocerts-nodes | sed-ne'/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p'>
openssl pkcs12-in-clcerts-nokeys | sed-ne'/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'>
openssl pkcs12-in-cacerts-nokeys-chain | sed-ne'/-BEGIN-CERTIFICATE-/,/-END-CERTIFICATE-/p'>

接受的答案是正确的命令,我只想补充一点,在提取密钥时,如果您将PEM密码(
“输入PEM密码短语:
)留空,则不会提取完整的密钥,而只提取
localKeyID
。要获取完整密钥,必须在运行以下命令时指定PEM密码

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

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

命令工作,但私钥导出为PKCS1格式,我需要PKCS8。。。有没有什么选择我错过了得到这个?例如,它导出'--BEGIN RSA PRIVATE KEY.'',但我需要'--BEGIN PRIVATE KEY.'',您可以尝试
openssl RSA-in privateKey.pem-out PRIVATE.pem
@edthird:要获取PKCS8,请添加-nodes标志以便在不使用密码的情况下导出,添加
-passout pass:
。它希望参数的格式为pass:mypassword@克里斯托弗。谢谢这对我来说是个好消息。添加
-nodes
正确导出密钥
|openssl rsa
用于什么?@Snekse它确保输出中只有私钥。在我的例子中,它创建了一个身份文件(
~/.ssh/id\u rsa
),其中包含一些类似于“cruft”的包属性,而没有“openssl rsa”。我猜OpenSSH和其他使用身份文件的实用程序可以处理这个问题(我没有尝试过),但我只是习惯于只提供必要的数据,而不提供更多,特别是在涉及安全性的情况下。这个答案让我能够访问终端中的PEM格式私钥,我可以复制/粘贴它:
opensslpkcs12-in filename.p12-clcerts-nodes-nocerts
谢谢!第一行是我需要的。只有密钥,未加密,因此可以通过大多数CDN自动系统安装。@PhilipRego我认为您混淆了公钥和私钥。RSA公钥是两个值,“e”是公共指数,“n”是模,这两个值都存储在密钥的私有部分旁边。回答问题时,它有助于突出显示命令是什么。您可以在命令前后添加三个反引号,使“echo hello”变成
echo hello
。添加一些解释将使此答案更有用。这应该是对已接受答案的注释,而不是答案。