无法加载私钥。(PEM例程:PEM_read_bio:无起始行:pem_lib.c:648:期望:任何私钥)


94

我有一个.key文件,它是PEM格式的私钥文件。我没有制作这个文件,但是我从某个地方得到的。

我想使用以下命令使用openssl工具查看其MD5哈希值。

openssl rsa -in server.key -modulus -noout

但这会产生以下错误。

unable to load Private Key
13440:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib.c:648:Expecting: ANY PRIVATE KEY

这是.key文件的asn1parse。

openssl asn1parse -in server.key
0:d=0  hl=4 l= 603 cons: SEQUENCE
4:d=1  hl=2 l=   1 prim: INTEGER           :00
7:d=1  hl=3 l= 129 prim: INTEGER           :C141201603899993919CBAA56985E9C7
C6A2AF713A02F5FE88D38CEFBED9304599689280B84B0AB577A9719CA20DDA1246A894AF397A2C57
EE5A582B036CC367E3667454DCD82DBDBF187C35FE39F61C71B517DDDF576F5471B4EC2E045E0F9D
619F5616C4E832F00CBD0DBF41B4BA3CBC4B4B603AE1FE61965917DA732E0DEF
139:d=1  hl=2 l=   3 prim: INTEGER           :010001
144:d=1  hl=3 l= 128 prim: INTEGER           :1687B9AE67562CEDEBDD7A531B84CDB7
093CE138519B93C34B7F626076FF0A262B16EA71904ACB6251A39307C04ADE202055BA13DD9F1539
6123EE408183361A9BC08B9413FA360EA928E48CC3F52B33ACF2980758F02BA2139F652F30A257C2
2E45D7C25835FC4D22B9ECECC12AB632318D4F47E1EBDAD9781B96BCFF03A2D1

 ...

还有什么可以尝试的吗?


2
PEM文件的确切页眉/页脚是什么?如果您要发送公共密钥,则会收到此错误。同样,您列出的命令不会提供MD5哈希值。它将给出密钥的模数。
gtrig

我曾经scp将文件从Windows复制到Ubuntu。为了修复它,我删除了Ubuntu上的文件,在其中创建了一个新的空文件,然后使用vim并粘贴了正确的内容。
瑞安

Answers:


73

在记事本++中打开密钥文件,然后验证编码。如果显示UTF-8-BOM,则将其更改为UTF-8。保存文件,然后重试。


2
如果我使用的是Mac,该怎么办?
欧内斯特·扎默尔奇克

6
使用Visual Studio Code-您可以使用底部的工具栏轻松更改编码!
卡·格西

2
我的天哪!谢谢!我永远不会通过反复试验弄清楚,为我解决了这个问题!
Mikael Dyreborg Hansen

这是给我的。谢谢!
Freeman Helmuth

4
GoDaddy生成带有BOM表前缀的私钥“ generate-private-key.txt”,这会导致此问题。至少在Mac上,用cat来转储关键文本不会显示BOM,但是却能显示较少的BOM。我使用BBEdit删除了BOM,但是任何可以更改格式或砍掉前四个字节的材料都可以使用。
Seth Noble

55

我将PEM文件的页眉和页脚更改为

-----BEGIN RSA PRIVATE KEY-----

-----END RSA PRIVATE KEY-----

最后,它起作用了!


1
您还可以添加-inform pem到命令以获取相同的结果。例如openssl rsa -in server.key -modulus -noout -inform pem
西蒙·伍德赛德'18

1
检查stackoverflow.com/questions/54994641/…如果它解决了您的问题
qstack

某些东西已经可以正确使用“坏”格式(即标头未更改),因此,这是一个临时解决方案,势必会破坏一些已经可以正常使用的东西,例如反向代理不会因为缺少手动代理而崩溃编辑的页眉和页脚。是的!
alejandrob

33

您的.key文件包含非法字符。您可以这样检查.key文件:

# file server.key

输出“ server.key:UTF-8 Unicode(带BOM)文本”表示它是纯文本,而不是密钥文件。正确的输出应为“ server.key:PEM RSA私钥”。

使用以下命令删除非法字符:

# tail -c +4 server.key > new_server.key

new_server.key应该正确。

有关更多详细信息,请单击此处,感谢您的帖子。


1
file server.key这个命令帮助我解决了这个问题。谢谢。
itsHarshad

tail命令似乎在我的密钥文件中添加了奇怪的格式字符。不知道为什么会这样。
ryanwebjackson

与@tkpl答案结合使用似乎为我消除了错误。
ryanwebjackson

这节省了我几个小时,也节省了很多头发。
Felipe Gusmao

7

创建CA证书

openssl genrsa -out privateKey.pem 4096
openssl req -new -x509 -nodes -days 3600 -key privateKey.pem -out caKey.pem

6
> I have a .key file which is PEM formatted private key file.
> ...
> Here's some asn1parse of the .key file...

看来可以,这asn1parse使我相信它不是PEM编码的。


还有什么可以尝试的吗?

由于它似乎是ASN.1,请尝试:

$ openssl rsa -in server.key -inform DER -modulus -noout

注意-inform DER在编码之间切换。




2

我在Windows 10上,我使用Windows1252编码保存了密钥,并且对我有用。关于另一个StackOverflow问题,有人用带有BOM的UTF-8修复了此问题。

换句话说,它可能是文件编码。



1

如果您尝试使用公共密钥而不是私有密钥来创建证书,则可能会发生这种情况。您应该使用私钥


0

今天发生了同样的问题,并注意到当文件的所有者/组不是正在运行的读取密钥的应用程序时,就会发生这种情况。也许也是您的问题。


0

在我的情况下,其他答案似乎都不正确,但是我在这里找到了真正的答案

我的id_rsa文件已经是PEM格式,我只需要将.pem扩展名添加到文件名即可。

谢谢

openssl rsa -inform参数的可能选项是以下之一:PEM DER

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

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

WhileDER是二进制编码格式。


0

在我们的案例中,导致该问题的原因是,我们尝试使用的私钥已通过密码加密。

我们必须先使用解密私钥,ssh-keygen -p然后才能使用openssl命令行工具使用私钥。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.