无法使用 openssl 获取私钥(无起始行:pem_lib.c:703:Expecting: ANY PRIVATE KEY)

Posted

技术标签:

【中文标题】无法使用 openssl 获取私钥(无起始行:pem_lib.c:703:Expecting: ANY PRIVATE KEY)【英文标题】:Can't get private key with openssl (no start line:pem_lib.c:703:Expecting: ANY PRIVATE KEY) 【发布时间】:2015-10-16 07:23:02 【问题描述】:

我有一个 .key 文件,当我这样做时

openssl rsa -text -in file.key

我明白了

unable to load Private Key
140000419358368:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: ANY PRIVATE KEY

我还有一个 .cer 文件,当我这样做时

openssl x509 -text -in file.cer

我明白了

unable to load certificate
140387178489504:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE

但如果像 here 指出的那样,我会运行如下命令:

openssl x509 -text -inform DER -in file.cer

我明白了

Certificate:
    Data:
        Version: 3 (0x2)
        Some more information
        ...
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjcwDQYJKoZIhvcNAQEF
...
-----END CERTIFICATE-----

但这似乎不适用于密钥,因为当我运行时

openssl rsa -text -inform DER -in aaa010101aaa__csd_10.key

我明白了

unable to load Private Key
140004844304032:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1337:
140004844304032:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:849:
140004844304032:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:769:Field=version, Type=RSA
140004844304032:error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib:rsa_ameth.c:115:
140004844304032:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1337:
140004844304032:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:849:
140004844304032:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:769:Field=version, Type=PKCS8_PRIV_KEY_INFO

如何获取私钥及其证书?

【问题讨论】:

【参考方案1】:

我在 Windows 上使用 openssl 时遇到了“期望:任何私钥”错误(Ubuntu Bash 和 Git Bash 也有同样的问题)。

问题的原因是我使用 UTF8 将密钥和证书文件保存在记事本中。以 ANSI 格式重新保存这两个文件解决了这个问题。

【讨论】:

这里也一样。我尝试了很多东西,比如更改许可、路径和标题 - 但没有考虑编码...... 谢谢,这有帮助!对于转换,我使用了这个命令: iconv -f utf-8 -t ascii -c server.key > server.key2 F*&&% &*^%。这消耗了几个宝贵的时间。任何地方都没有讨论这个问题。确实,我从 GoDaddy 下载的私钥文件中包含了字节序标记(BOM),导致 expressjs.https 加载私钥失败。 iconv -c -f UTF8 -t ASCII cert.key > cert2.key 转换 对@dps 的小修正——输入格式应为-f UTF-8 而不是-f UTF8【参考方案2】:

您似乎拥有DER 格式的证书,而不是PEM。这就是为什么当您提供 -inform PEM 命令行参数(它告诉 openssl 期望的输入格式)时它可以正常工作的原因。

您的私钥很可能使用了相同的编码。看起来openssl rsa 命令也接受-inform 参数,所以试试:

openssl rsa -text -in file.key -inform DER

PEM 编码文件是一种纯文本编码,类似于:

-----BEGIN RSA PRIVATE KEY-----
MIGrAgEAAiEA0tlSKz5Iauj6ud3helAf5GguXeLUeFFTgHrpC3b2O20CAwEAAQIh
ALeEtAIzebCkC+bO+rwNFVORb0bA9xN2n5dyTw/Ba285AhEA9FFDtx4VAxMVB2GU
QfJ/2wIRANzuXKda/nRXIyRw1ArE2FcCECYhGKRXeYgFTl7ch7rTEckCEQDTMShw
8pL7M7DsTM7l3HXRAhAhIMYKQawc+Y7MNE4kQWYe
-----END RSA PRIVATE KEY-----

DER 是一种二进制编码格式。

更新

有时密钥以 PKCS#8 格式(可以是 PEM 或 DER 编码)分发。试试这个,看看你会得到什么:

openssl pkcs8 -in file.key -inform der

【讨论】:

你必须向我们展示私钥文件的样子,否则我们只是猜测。 好的,但是它是二进制的,我怎样才能显示密钥的内容?我尝试在二进制模式下使用 vi (vi -b),但显示几乎不可读的输出 先看我的更新。如果您的私钥确实您可以与我们分享的东西(在这种情况下它不再是真正的“私有”),您可以使用od -x 生成一个十六进制转储。如果您想保密,您可能需要联系密钥的来源以获取更多信息。【参考方案3】:

我的两分钱: 在使用根 CA 证书运行 openssl 命令时,在 RHEL7.3 中遇到了相同的错误消息。原因是,在从 AD 服务器下载证书时,Encoding 被选择为 DER 而不是 Base64。一旦为新证书下载选择了正确的编码版本,错误就解决了

希望这对新用户有所帮助:-)

【讨论】:

【参考方案4】:

在执行openssl pkcs12 -export -out cacert.pkcs12 -in testca/cacert.pem 时,我收到以下消息:

无法加载私钥 140707250050712:error:0906D06C:PEM 例程:PEM_read_bio:无起始行:pem_lib.c:701:期望:任何 私钥`

通过提供密钥文件和命令解决了这个问题。开关是-inkey inkeyfile.pem

【讨论】:

【参考方案5】:

您需要使用-m PEM 选项重新加密 ssh 密钥文件。

ssh-keygen -p -f keyfile -m PEM

.

详情:

这个问题是由于某些版本的 ssh-keygen 生成的加密文件格式不是 openssl 想要的。

当我使用ssh-keygen -p -f keyfile 加密密钥文件时,我遇到了同样的问题,结果会是这样的

-----BEGIN OPENSSH PRIVATE KEY-----

然后我遇到了这个问题:openssl rsa < keyfile does not work with the same error as the questioner.

前几天我碰巧发现另一个加密的密钥文件就像

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,xxxxxxxxx..

这个文件可以被openssl rsa < keyfile解密。

原来不同的ssh-keygen生成不同的加密格式,需要各自的openssl版本解密。

似乎对于现代的openssl(我的是1+),它需要后一种格式。

所以我最终得到了以下解决方案:使用 -m PEM 选项重新加密 ssh 密钥文件。

ssh-keygen -p -f keyfile -m PEM

然后输入旧密码和新密码。

-m PEM 选项将生成

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,xxxxxxxxx..

然后我可以使用openssl rsa < keyfile 稍后解密文件。 (当然如果你在上面的 ssh-keygen 命令中输入空密码,你也会得到解密的结果,但这可能不是你想要的,因为你不想在磁盘上保存解密的密钥文件。

【讨论】:

以上是关于无法使用 openssl 获取私钥(无起始行:pem_lib.c:703:Expecting: ANY PRIVATE KEY)的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 OpenSSL 的 EVP_PKEY 结构中的原始 ECDH 公钥、私钥和参数?

如何为使用 OpenSSL 创建客户端证书指定 CA 私钥密码

openssl命令行验证签名

使用openssl 生成RSA公钥和私钥

为啥 openssl 无法读取 OSX 上由 openssh 创建的 ssh 私钥

openssl生成RSA公钥和私钥对