【问题标题】:Extract public/private key from PKCS12 file for later use in SSH-PK-Authentication从 PKCS12 文件中提取公钥/私钥供以后在 SSH-PK-Authentication 中使用
【发布时间】:2012-03-18 20:32:55
【问题描述】:

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

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

以后,我想使用来自PKCS#12 容器的密钥,所以我必须先从PKCS#12 中提取公钥,然后将它们放入.ssh/authorized_keys 文件中。有没有机会通过openssl 进行这项工作? PKCS#12 中的密钥是否兼容 ssh-public-key 身份验证?

【问题讨论】:

    标签: ssh openssl certificate x509 pkcs#12


    【解决方案1】:

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

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

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

    【讨论】:

    • 这应该是对已接受答案的评论,而不是答案。
    【解决方案2】:

    OpenSSH 无法直接使用 PKCS#12 文件。正如其他人建议的那样,您必须提取 PEM 格式的私钥,这将使您从 OpenSSL 的土地到 OpenSSH。这里提到的其他解决方案对我不起作用。我使用带有“预打包”实用程序(OpenSSL 0.9.8y、OpenSSH 6.2p2)的 OS X 10.9 Mavericks(目前为 10.9.3)。

    首先,提取一个 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
    

    显然,在命令行上编写纯文本密码也不安全,因此您应该从历史记录中删除最后一个命令,或者只是确保它没有到达那里。不同的shell有不同的方法。您可以在命令前加上空格,以防止它被保存到 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
    

    【讨论】:

    • | openssl rsa 是干什么用的?
    • @Snekse 它确保输出中只有私钥。就我而言,它会创建身份文件 (~/.ssh/id_rsa),其中包含一些“杂乱无章”的内容,例如不带 ` | 的 Bag Attributes。 openssl rsa`。我猜 OpenSSH 和其他使用身份文件的实用程序可以处理这个问题(我没有尝试过),但我只是用来提供必要的数据,仅此而已,尤其是在安全方面。
    • 这个答案对我有用,可以访问终端中的 PEM 格式私钥,我可以复制/粘贴:openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
    【解决方案3】:

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

    【讨论】:

    • 添加一些解释会使这个答案更有用。
    【解决方案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
    

    解密私钥

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

    【讨论】:

    • 在回答问题时,它有助于突出显示命令是什么。您可以通过在命令前后添加三个反引号来做到这一点,因此 ```echo hello``` 变为 echo hello
    【解决方案5】:

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

    • PKCS#1 私钥

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

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

    【讨论】:

    • 命令有效,但私钥以 PKCS1 格式导出,我需要 PKCS8... 有什么我缺少的选项吗?例如,它导出 '-----BEGIN RSA PRIVATE KEY-----' 但我需要 '-----BEGIN PRIVATE KEY-----'
    • 你可以试试openssl rsa -in privateKey.pem -out private.pem
    • @edthethird:要获取 PKCS8,请添加 -nodes 标志
    • 无密码导出,添加-passout pass:。它期望参数的格式为 pass:mypassword。 stackoverflow.com/a/27497899/206277
    • @ChristopherK。谢谢!那对我来说很好。添加-nodes 正确导出密钥
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      以 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
      

      【讨论】:

      • 谢谢!第一行是我需要的。只是密钥,未加密,因此可以通过大多数 CDN 自动化系统安装。
      • @PhilipRego 我认为您混淆了公钥和私钥。 RSA 公钥有两个值,“e”是公共指数,“n”是模数 - 两者都存储在密钥的私有部分旁边。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2019-12-13
      • 2013-09-03
      • 2017-12-15
      • 2011-07-31
      • 2016-12-28
      相关资源
      最近更新 更多