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

sun*_*mes 16 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:
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,我使用在线证书解码器解码dev.cer,它运作良好.这是网址:

https://www.sslshopper.com/certificate-decoder.html
Run Code Online (Sandbox Code Playgroud)

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

Ash*_*eyS 25

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

-----END CERTIFICATE----
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

固定它.我了解到从终端复制证书文本时必须小心.


小智 22

额外注意:当pem文件包含CA和子CA链时,请确保----- END CERTIFICATE ---- ----- BEGIN CERTIFICATE -----不在同一行.


win*_*rrr 10

tl; dr的和标签-----周围必须有五个破折号。BEGINEND

证书格式

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

-----BEGIN CERTIFICATE-----
bGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3VtZXMg
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

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

  • 在行首恰好是五个破折号,在末尾恰好是五个破折号 。(因此,请确保在粘贴粘贴时没有意外省略破折号!)----- -----

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

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

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

cat end-user.crt <(echo) intermediate.pem <(echo) root.crt > bundled.crt
Run Code Online (Sandbox Code Playgroud)

只需将替换为end-user.crtintermediate.pem并替换root.crt为您的文件名即可。

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

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

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


Lan*_*eyo 8

令人惊讶的是,当我的链式证书出现如此愚蠢的错误时,我遇到了一个案例:

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

代替

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


Joh*_*hny 7

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

发生的情况是,一开始,因为我只是在测试,所以我并不担心格式化代码。经过测试后,我选择将密钥放入将在函数中返回的变量中。这样,在没有注意到的情况下,我最终在关键内容中插入了几个制表符,如图所示。最好将内容保存在单独的文件中,其中没有不必要/额外的字符

在此输入图像描述

  • 顺便说一句,将私钥嵌入到代码中似乎是一个非常糟糕的主意。 (4认同)

Jer*_*ado 5

朋友请!

请勿使用 “cat AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt > /tmp/commercial_ca.crt..

这会创建错误的 .crt 文件。

只是。

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

2以 root 用户身份使用文本编辑器 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
Run Code Online (Sandbox Code Playgroud)

以 Zimbra 用户身份部署在 /tmp/ 中

/opt/zimbra/bin/zmcertmgr deploycrt comm commercial.crt commercial_ca.crt
Run Code Online (Sandbox Code Playgroud)

zmcontrol restart
Run Code Online (Sandbox Code Playgroud)

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

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

chown zimbra.zimbra /opt/zimbra/ssl/zimbra/commercial/*.crt(作为根)

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