无法使用openssl获取私钥(没有起始行:pem_lib.c:703:期望:任何私钥)

43

我有一个 .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

但是如果像这里所指出的那样,我运行以下命令:

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

我如何获取私钥及其证书?

6个回答

31

在Windows上使用openssl时(Ubuntu Bash和Git Bash都遇到了同样的问题),我遇到了“Expecting: ANY PRIVATE KEY”错误。

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


1
我也是。我尝试了很多事情,比如更改权限、路径和标题,但没有考虑编码... - Tobias
3
谢谢,这很有帮助!我使用了以下命令进行转换:iconv -f utf-8 -t ascii -c server.key > server.key2。 - Robert Lujo
6
使用命令iconv -c -f UTF8 -t ASCII cert.key > cert2.key来进行转换。 - a2f0
2
@dps 的小修正 - 输入格式应该是 -f UTF-8 而不是 -f UTF8 - Saites
@Saites 看起来 UTF8 和 UTF-8 是可以互换的,你可以尝试 iconv --list | grep UTF - a2f0
显示剩余3条评论

25

看起来您拥有的证书格式是 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

你需要向我们展示私钥文件的样子,否则我们只能猜测。 - larsks
好的,但它是二进制的,我怎么能向您展示密钥的内容呢?我尝试使用二进制模式下的vi(vi -b),但显示的输出几乎无法阅读。 - helado
请先查看我的更新。如果您的私钥确实是可以与我们共享的内容(这种情况下它就不再是“私有”的了),您可以使用“od -x”生成十六进制转储。如果您想保持私密性,您可能需要联系密钥来源以获取更多信息。 - larsks

12

您需要使用-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 的使用有同样的错误,就像提问者那样。

前几天我发现另一个加密的密钥文件是这样的:

-----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 命令中输入了空密码,您也会获得解密结果,但这可能不是您想要的,因为您不希望将解密后的密钥文件保存到磁盘上)。


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

无法加载私钥140707250050712:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: ANY PRIVATE KEY`

通过在命令中提供密钥文件来解决此问题。开关是-inkey inkeyfile.pem

3

我的建议:

在使用root CA证书运行openssl命令时,我曾在RHEL7.3中遇到过同样的错误信息。原因是,在从AD服务器下载证书时,选择了DER编码而不是Base64编码。一旦为新证书下载选择了正确的编码版本,错误就得以解决。

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


1

尝试在您要运行的任何命令中指定-pubin标志,当您将参数传递给一个默认假定您正在提供私钥而实际上您正在提供公钥的命令时,通常会出现无法加载私钥非零错误消息。

例如:

openssl rsautl -encrypt -pubin -inkey public.pem -in data.txt > encrypted_data.enc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接