PEM例程:PEM_read_bio:错误的结束行

时间:2017-07-12 05:08:23

标签: openssl x509certificate

我试图解析embedded.mobileprovision文件中的开发人员证书。首先我用

security cms -D -i embedded.mobileprovision

获取base64开发人员证书字符串。

然后我每隔64个字符拆分字符串并存储在名为dev.cer的文件中。

最后在第一行添加-----BEGIN CERTIFICATE-----,在文件末尾添加-----END CERTIFICATE-----

在我的Mac计算机上,我右键单击dev.cer文件,开发人员信息就在那里。但是,当我使用openssl x509 -in dev.cer -text -noout时,会出现错误:

unable to load certificate
69721:error:0906D066:PEM routines:PEM_read_bio:bad end line:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.50.6/src/crypto/pem/pem_lib.c:747:

dev.cer文件如下:

-----BEGIN CERTIFICATE-----
MIIFljCCBH6gAwIBAgIIIP7GMO9cWzYwDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js
ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3
aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
HhcNMTcwNDI5MDMzMDA4WhcNMTgwNDI5MDMzMDA4WjCBiTEaMBgGCgmSJomT8ixk
AQEMCk1ENFA0UTg1WlExMzAxBgNVBAMMKmlQaG9uZSBEZXZlbG9wZXI6IGFtbW1p
IGFtbW1pIChXM1BSS1JDVDRRKTETMBEGA1UECwwKVktRNTZVQ0c4ODEUMBIGA1UE
CgwLYW1tbWkgYW1tbWkxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAwudboPuPnImOssBCw9vISRnnivreVwOuDAu77u47zIU8uTag
bzktX6pF54YToSLQHeOaNNQfZ7idccU2DKVBr3etz/++ca4HNadeUaEm2VWW4kEq
3iKIo1wZZhJJR6bQl4q797U0+f7eEXLKD4fjfidEF+ceAxAsX5YIuokq3K/B+XW3
tKk7D4nCaaCyJ9/+aJkFKT/oOxWRD0NYi5vXpni/3Plj5Qu3kDGrTUQaGCXXjRrA
E3mOVS4M2W5sFoOUpBxcfK7ajs+HUZNp0Gvb04OeD4O0lLTxcNu6omhG3MzOo81F
T+bkdxLM7XkIbNlIjYhyxGRynpgAKmiR9B/oeQIDAQABo4IB8TCCAe0wPwYIKwYB
BQUHAQEEMzAxMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5hcHBsZS5jb20vb2Nz
cDAzLXd3ZHIwMTAdBgNVHQ4EFgQUF8T1dPnBmZfKfG0+lHtczMuGy9owDAYDVR0T
AQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCAR0GA1Ud
IASCARQwggEQMIIBDAYJKoZIhvdjZAUBMIH+MIHDBggrBgEFBQcCAjCBtgyBs1Jl
bGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMg
YWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJkIHRlcm1z
IGFuZCBjb25kaXRpb25zIG9mIHVzZSwgY2VydGlmaWNhdGUgcG9saWN5IGFuZCBj
ZXJ0aWZpY2F0aW9uIHByYWN0aWNlIHN0YXRlbWVudHMuMDYGCCsGAQUFBwIBFipo
dHRwOi8vd3d3LmFwcGxlLmNvbS9jZXJ0aWZpY2F0ZWF1dGhvcml0eS8wDgYDVR0P
AQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMDMBMGCiqGSIb3Y2QGAQIB
Af8EAgUAMA0GCSqGSIb3DQEBCwUAA4IBAQA1//RUQ+hnCxfzSKO13qtuSb4IUrY5
bjkRKIAUlxN5aYVN5NIzCGxmahlDA/Rjw8MLVA8dWbT0QMSqx5IXC+Ov3JNZlkL0
5+RBuZEtZL7IZp0L3ZrCFtuizaunH9fZWbyFyfLACIYqZqP40N1+wIx1l4Es65Zu
WSeDeQMutda8DpmtCJhrnod9B1vfvDc3FUSmbJbvkLFh2UCgqtE9moLYI8qFMzqe
CQUJdPGdE+2WNv0wM8/cFIG/audSvEADKg1DgO+j6oP+urUe1gLsyzyv10J7/XA4
nmDuP1UNG7O7ADbdEOxhRiB96ZNwgcw9Q0wv9H9jMa+NNti6SxLud2+B
-----END CERTIFICATE----

顺便说一下,我使用在线证书解码器解码dev.cer,效果很好。这是网址:

https://www.sslshopper.com/certificate-decoder.html

本网站建议使用openssl,但失败了。

11 个答案:

答案 0 :(得分:20)

我和sunnycomes有同样的问题,他的评论是正确的。我缺少一个' - '在文件最后一行的最后。在我之前:

-----END CERTIFICATE----

并将其更改为:

-----END CERTIFICATE-----

修好了。我已经了解到从终端复制证书文本时必须小心。

答案 1 :(得分:15)

额外说明: 当pem文件包含CA和子CA链时,请确保 -----结束证书---- -----开始证书----- 不在同一条线上。

答案 2 :(得分:6)

令人惊讶的是,我遇到了一个情况,就是我的链接证书有一个愚蠢的错误:

-----END CERTIFICATE----------BEGIN CERTIFICATE-----

代替

-----END CERTIFICATE----- -----BEGIN CERTIFICATE-----

答案 3 :(得分:5)

tl; dr -----BEGIN标签周围必须有五个破折号END

证书格式

确保每个证书的内容都被BEGINEND标签包围,如下所示:

-----BEGIN CERTIFICATE-----
bGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMg
-----END CERTIFICATE-----

请注意:根据官方的RFC 7468文件,有关证书的文本编码,需要:

    在行的开头
  • 恰好是五个破折号 -----,最后是五个破折号 -----。 (因此,请确保在粘贴粘贴时没有意外省略破折号!)

  • ,因此同一行上没有两个封装边界,例如:----END CERTIFICATE----------BEGIN CERTIFICATE-----。 (因此,在同一行上结束并直接启动新证书将不起作用,因为那样的话,将有十个破折号而不是五个破折号。)

在一个文件中正确添加证书

某些Web服务器需要一个文件中的所有SSL / TLS(root,中间用户和最终用户)证书,但是CA通常会将所有证书分开发送。要正确连接所有证书,可以使用以下命令:

cat end-user.crt <(echo) intermediate.pem <(echo) root.crt > bundled.crt

只需用文件名替换end-user.crtintermediate.pemroot.crt

请注意:证书的顺序很重要!从最终用户证书开始,然后是所有中间证书,然后以根证书结束。

顺便说一句: .pem.crt都是有效的SSL证书文件结尾/编码。

您可以找到有关SSL文件here的更多信息。

答案 4 :(得分:1)

朋友们请!

不要使用&#34; cat AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt&gt; /tmp/commercial_ca.crt ..

这会创建错误的.c​​rt文件..

<强>刚

以root身份

1 使用Vi,nano或记事本将证书复制并粘贴到文本文件(另存为commercial.crt )中。将此文件放在以下目录 / opt / zimbra / ssl / zimbra / commercial /

以root身份

2 使用文本编辑器nano或Vi打开您在ZIP文件上收到的CAbundle,并将其另存为( commercial_ca.crt )。将此文件放在以下目录/ opt / zimbra / ssl / zimbra / commercial /

验证为/ opt / zimbra / ssl / zimbra / commercial /

中的Zimbra用户
/opt/zimbra/bin/zmcertmgr verifycrt comm commercial.key commercial.crt commercial_ca.crt
中作为Zimbra用户

部署

/opt/zimbra/bin/zmcertmgr deploycrt comm commercial.crt commercial_ca.crt

zmcontrol restart

玩得开心! 从 https://ssl.comodo.com/support/certificate-installation---zimbra-server.php

  • 如果您获得权限错误,请验证您是否拥有* .crt文件 用。

chown zimbra.zimbra /opt/zimbra/ssl/zimbra/commercial/*.crt(以root身份)

chmod 700 /opt/zimbra/ssl/zimbra/commercial/*.crt(作为zimbra用户)

答案 5 :(得分:1)

它的工作方式如下:tls.crt

-----BEGIN CERTIFICATE-----
the content of certificate.crt
the content of ca_bundle.crt
-----END CERTIFICATE-----

答案 6 :(得分:0)

将证书从Windows计算机复制到RHEL 7时,我也遇到类似的问题。 中间证书和根证书似乎在每一行的末尾都有一个“ ^ M”,仅当在vim中查看证书时才可见。

我发现的解决方法是编辑证书并在vim中运行:

:%s​​ / ^ M $ //

这将删除每行末尾的所有^ M。

(要获取^ M,您需要先按住Ctrl + Shift,然后依次按住v和m)

答案 7 :(得分:0)

在存储私钥(在swiftmailer中签名电子邮件)时,我遇到了同样的问题。 它正在工作,突然停止工作。

发生的事情是,在一开始,就像我刚刚进行的测试一样,我并不担心格式化代码。经过测试之后,我选择将键值放在一个变量中,该变量将在函数中返回。有了这个,我没有注意到,我最终在关键内容中插入了几个制表符,如您在图像中看到的。最好将内容保存在一个单独的文件中,在文件中不要有多余/多余的字符

enter image description here

答案 8 :(得分:0)

如果通过以下命令生成crt文件,则会生成错误输出。

cat yourdomain.crt yourdomain.ca-bundle >> cert_chain.crt

您需要执行的操作,复制那些文件内容并手动粘贴。

-----BEGIN CERTIFICATE-----
the content of yourdomain.crt
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
the content of yourdomain.ca_bundle.crt
-----END CERTIFICATE-----

完成后,通过以下命令测试

openssl x509 -text -noout -in cert_chain.crt

答案 9 :(得分:0)

我正在从.env文件中读取密钥。用双引号引起来的键可以解决此问题。

给出错误:

KEY=-----BEGIN PRIVATE KEY-----\nMIIJQgIB.....\n-----END PRIVATE KEY-----\n

作品:

KEY="-----BEGIN PRIVATE KEY-----\nMIIJQgIB.....\n-----END PRIVATE KEY-----\n"

答案 10 :(得分:0)

另一个可能导致此错误的变化是在页眉之后或页脚之前有一个空白行。例如:

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

base64-encoded-stuff-here

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

要解决,请删除空白行:

-----BEGIN PRIVATE KEY-----
base64-encoded-stuff-here
-----END PRIVATE KEY-----