SSL错误-无法从文件读取服务器证书


37

我今天一直在为我的域设置SSL,但遇到了另一个问题-我希望有人可以对此有所了解。

我不断收到以下错误消息:

[错误]初始化:无法从文件/etc/apache2/domain.com.ssl/domain.com.crt/domain.com.crt中读取服务器证书
[错误] SSL库错误:218529960错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记
[错误] SSL库错误:218595386错误:0D07803A:asn1编码例程:ASN1_ITEM_EX_D2I:嵌套的asn1错误

我正在运行Apache 2.2.16和Ubuntu 10.10。我的.crt文件具有Begin和End标记,并且完全从我收到的确认电子邮件中复制而来,非常令人沮丧!

干杯!

编辑>>尝试验证.crt时,它似乎不起作用:

>> openssl x509 -noout -text -in domain.com.crt 
无法加载证书
16851:错误:0906D06C:PEM例程:PEM_read_bio:无起始行:pem_lib.c:650:期望中:受信任的证书

还>>

>> openssl x509 -text -inform PEM -in domain.com.crt
无法加载证书
21321:错误:0906D06C:PEM例程:PEM_read_bio:无起始行:pem_lib.c:650:期望中:受信任的证书
>> openssl x509 -text -inform DER -in domain.com.crt
无法加载证书
21325:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误标签:tasn_dec.c:1316:
21325:错误:0D07803A:asn1编码例程:ASN1_ITEM_EX_D2I:嵌套的asn1错误:tasn_dec.c:380:Type = X509

编辑>>(顺便为您提供帮助)

>> grep'^ -----'domain.com.crt
----- BEGIN证书-----
-----结束证书-----

刚刚通过电子邮件将提供证书的公司发送给了他们,他们回复了>

我已经检查了您提供的CSR文件,并且可以确保已正确生成了该文件。由于您使用错误的命令行安装CSR,导致当前遇到的错误。您将需要在命令行中使用域的相应名称来修改domain.com.crt。

  • 目前crt设置为mysite.com.crt-我以domain.com.crt为例

您能告诉我们的输出grep '^-----' domain.com.crt吗?
量子

Williamsowen,证书的要点将显示给连接到您的Web服务器的任何人。这不是私人的事情。鉴于此,您是否会考虑在此处附加或发布整个证书,以便我们可以直接查看而不需要猜测?
MadHatter

等等,我看到你刚刚接受了我的回答。这是否意味着导致问题的原因是终端Windows换行符?
MadHatter在2011年

MadHatter-抱歉!这是新手,但我刚刚开始使用,我收到的电子邮件中的格式已关闭,不能谢谢你们!
williamsowen

Answers:


49

这些行是否可能以^ M终止?从Windows将文件移动到UNIX系统时,这是一个潜在的问题。一种简单的检查方法是vi在“显示二进制”模式下使用vi -b /etc/apache2/domain.ssl/domain.ssl.crt/domain.com.crt

如果每行以Control-M结尾,则像这样

-----BEGIN CERTIFICATE-----^M
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM^M
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg^M
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x^M

您有Windows行终止格式的文件,而apache不喜欢这些文件。

您的选择包括重新移动文件,请多加注意。或使用dos2unix命令将其删除;如果您小心的话,也可以在vi中删除它们。


编辑:感谢@ dave_thompson_085,他指出此答案在2019年不再适用。也就是说,Apache / OpenSSL现在可以接受^ M终止的行,因此它们不会引起问题。也就是说,其他格式错误(在注释中出现了几个不同的示例)仍然会导致问题;如果证书已跨系统移动,请仔细检查这些内容。


对我来说,这是一个复制粘贴错误,省略了标题的前几个字符-----BE...感谢您仔细检查!
cfi 2012年

谢谢,这是我的问题!在Windows的notepad ++中,您可以使用EDIT-EOL转换对话框来更改设置为正确的LF格式。您可以使用“查看-显示符号”菜单来实际查看Windows CR LF行的结尾。
比约恩

1
我的证书最终只是一个空文件。我猜这世代发生了什么事。这个答案鼓励我打开它并看到它。
flickerfly 2014年

Windows用户注意事项:即使您在Windows上,也可能需要将行格式转换为UNIX。DOS2UNIX不是Windows命令,而是Linux命令。好消息是,适用于Windows的Git提供了它。CigWin可能也这样做,但不确定。
伊格纳西奥(Ignacio Segura)2015年

Windows用户请注意:使用Cygwin的cp从网络共享中复制受限权限文件后,Windows资源管理器的“属性/安全性”选项卡中的权限列表会混乱。例如,我看到一个“ NUL SID”,一个禁用的所有人和域用户条目。
eel ghEEz

19

对于试图读取证书签名请求(CSR)时到达此页面并出现类似错误的任何人(请注意OP正在读取证书):确保使用正确的OpenSSL命令。x509适用于证书和reqCSR:

openssl req -in server.csr -text -noout

openssl x509 -in server.crt -text -noout

17

只是一圈又一圈地转了一圈,结果证明我的证书是错误的,例如

SSLCertificateFile    /etc/apache2/ssl/server.key
SSLCertificateKeyFile /etc/apache2/ssl/server.crt

代替:

SSLCertificateFile    /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key

检查您是否遇到此错误的方法。


11
>> openssl x509 -noout -text -in domain.com.crt 
unable to load certificate
16851:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: TRUSTED CERTIFICATE

我怀疑您的证书格式有问题。

运行以下两个命令,并向我们提供输出:

openssl x509 -text -inform DER -in domain.com.crt 
openssl x509 -text -inform PEM -in domain.com.crt 

感谢您的回答。我能够确定我的SA作为“ .cer”提供的格式已经是“ .pem” 隐身了
javafueled

10

就我而言,我发现我的证书具有不同的“-”字符。一定是管理员将证书放置到服务器上的复制/粘贴问题,其中文本编辑器一路替换为Unicode字符。

这花了几个小时来诊断,最后我只是猜对了,然后在vi中编辑了证书,并删除了现有的“-”字符,然后重新输入了它们。

希望这对某人有帮助。


8

就我而言,我遇到了OP的错误,因为首先为我创建.crt文件的人实际上确实创建了.PEM格式的文件,并将其命名为.crt。

我是通过参考以下有用指南来发现这一点的:https : //support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how转换它们

我要做的就是将.crt重命名为.pem,我就完成了!该指南指出,来自OP问题的错误意味着输入文件已被PEM格式化,因此无法尝试将其从DER格式转换为.pem,实际上是不必要的。


4

确保您的文件在证书文件中没有尾部或前导空格。通过选择整个文本并在纯文本编辑器中查找空格,仔细确保证书文件中没有空格或空格。

还要检查确实所有配置的文件都存在并且正确。

例如:在另一篇文章中,您说您的.key文件名为my domain.com.crt,而在vhost配置中,您具有domain.com.crt

SSLCertificateFile /etc/apache2/domain.ssl/domain.ssl.crt/domain.com.crt
SSLCertificateKeyFile /etc/apache2/domain.ssl/domain.ssl.key/domain.com.key
SSLCertificateChainFile /etc/apache2/domain.ssl/ca.crt
SSLCACertificateFile /etc/apache2/domain.ssl/gs_intermediate_ca.crt

再次检查上述所有文件是否确实存在并且有效。


1
还要检查您的破折号是破折号。微软文字编辑喜欢--变成; 故障排除并不是一件很有趣的事情。
Shane Madden

是的,因为您使用的是Ubuntu,所以只需打开一个终端并使用nano等即可。这样您就可以确定。
乔治·塔西乌利斯2011年

嗨,谢谢您的反馈-我检查了所有内容,一切都很好。我尝试验证crt文件,但得到:sudo openssl x509 -noout -text -in domain.com.crt unable to load certificate 16851:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: TRUSTED CERTIFICATE
williamsowen

1
您domain.com.crt文件的第一行是否以开头,-----BEGIN CERTIFICATE-----最后一行以结束-----END CERTIFICATE-----
乔治·塔西乌里斯

1

如果其他人遇到此问题,并且您的apache错误日志中显示类似以下内容:

初始化:无法从文件/etc/apache2/domain.com.ssl/domain.com.crt/domain.com.crt中读取服务器证书

确保您没有在apache配置的声明中交换密钥和证书文件。我已将密钥指向我的证书文件,并将证书指向我的密钥文件。这篇文章帮助我找出了问题所在,但我想指出这是另一个潜在的问题/解决方案。


0

我的问题(在使用Apache 2.4安装新服务器时出现相同的错误)是Apache(2.4)无法读取二进制.crt文件。我将其导入到我的个人证书存储区(使用mmc)中,并导出为以base-64编码的X.509(.cer)。将导出的文件重命名为相同的名称(.crt)(用在我的httpd-ssl.conf中),它再次起作用!在我的旧服务器上使用了相同的证书,也许Apache 2.4比2.2更严格?祝好运。


0

就我而言,这与文件中存在BOM有关。一个人可以这样剥离它:

tail -c +4 ssl.crt > ssl2.crt

不知道它是否总是占用3个字节,因此更好的方法必须是:

vi -c 'se nobomb' -c wq ssl.crt

0

我遇到了同样的错误,因为我用.crt文件名切换了.key


0

当我在apache配置中不小心使用了客户提供的p7b类型IIS证书时,我遇到了类似的问题。将证书转换为x509格式可修复错误。两种类型在表面上看起来相同,但在内部上显然不同。


0

我遇到了这个问题,因为向我发送了粘贴到电子邮件中的IIS样式.p7b文件的内容。像.pem一样,它具有“ ----- BEGIN CERTIFICATE -----”和“ ----- END CERTIFICATE -----”标签,内容使用类似外观的base64编码。我将其转换为* .pem文件,如下所示:

openssl pkcs7 -print_certs -in cert.p7b -out cert.cer

之后,Apache 2.2很高兴。


0

我最近在Windows上使用Lets Encrypt(letencrypt)遇到了这个问题。证书以编码为UTF-16LE的形式返回。将其转换为UTF-8(使用dos2unix)解决了该问题。


0

就我而言,只是空行。当我在nano中从ntepad或notepad ++粘贴crt文件时,总是像

sdgrgrgr rgregegreg rgrgreg
rgregreg rggregregr rgregrg

删除行中的空白处和putig全部解决了问题Eg:

sdgrgrgr
rgregegreg
rgrgreg
rgregreg
rggregregr
rgregrg
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.