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

hel*_*ado 25 linux openssl ssl-certificate private-key

我有一个.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
Run Code Online (Sandbox Code Playgroud)

我也有一个.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
Run Code Online (Sandbox Code Playgroud)

但如果在这里指出我运行命令,如:

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

我明白了

Certificate:
    Data:
        Version: 3 (0x2)
        Some more information
        ...
-----BEGIN CERTIFICATE-----
MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjcwDQYJKoZIhvcNAQEF
...
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

但这似乎与关键不起作用,因为当我跑

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
Run Code Online (Sandbox Code Playgroud)

如何获取私钥及其证书?

lar*_*sks 13

看起来你有DER格式证书而不是PEM.这就是当你提供-inform PEM命令行参数(告诉openssl期望什么输入格式)时它正常工作的原因.

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

openssl rsa -text -in file.key -inform DER
Run Code Online (Sandbox Code Playgroud)

一个PEM编码文件是一个纯文本的编码,看起来像:

-----BEGIN RSA PRIVATE KEY-----
MIGrAgEAAiEA0tlSKz5Iauj6ud3helAf5GguXeLUeFFTgHrpC3b2O20CAwEAAQIh
ALeEtAIzebCkC+bO+rwNFVORb0bA9xN2n5dyTw/Ba285AhEA9FFDtx4VAxMVB2GU
QfJ/2wIRANzuXKda/nRXIyRw1ArE2FcCECYhGKRXeYgFTl7ch7rTEckCEQDTMShw
8pL7M7DsTM7l3HXRAhAhIMYKQawc+Y7MNE4kQWYe
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

虽然DER是二进制编码格式.

更新

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

openssl pkcs8 -in file.key -inform der
Run Code Online (Sandbox Code Playgroud)


Aar*_*nan 12

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

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

  • `iconv -c -f UTF8 -t ASCII cert.key > cert2.key` 进行转换 (3认同)
  • 谢谢,这有所帮助!为了进行转换,我使用了以下命令:iconv -f utf-8 -t ascii -c server.key> server.key2 (2认同)
  • 对 @dps 的小修正 - 输入格式应该是“-f UTF-8”而不是“-f UTF8”。 (2认同)

ose*_*003 12

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

ssh-keygen -p -f keyfile -m PEM
Run Code Online (Sandbox Code Playgroud)

细节:

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

当我用来ssh-keygen -p -f keyfile加密密钥文件时,我遇到了同样的问题,结果如下

-----BEGIN OPENSSH PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

然后我遇到了这个问题:openssl rsa < keyfile无法与提问者相同的错误一起工作。

有一天我偶然发现另一个加密的密钥文件就像

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,xxxxxxxxx..
Run Code Online (Sandbox Code Playgroud)

并且该文件可以通过 解密openssl rsa < keyfile

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

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

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

ssh-keygen -p -f keyfile -m PEM
Run Code Online (Sandbox Code Playgroud)

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

-m PEM选项将生成

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,xxxxxxxxx..
Run Code Online (Sandbox Code Playgroud)

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