【问题标题】:PEM routines:PEM_read_bio:bad end linePEM 例程:PEM_read_bio:bad end line
【发布时间】:2017-12-16 08:39:44
【问题描述】:

我正在尝试解析 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,但失败了。

【问题讨论】:

  • 我知道问题出在哪里:-----END CERTIFICATE----,此行末尾缺少一个“-”。

标签: openssl x509certificate


【解决方案1】:

我遇到了和sunnycomes一样的问题,他的评论是正确的。我在文件最后一行的末尾缺少一个“-”。在我拥有之前:

-----END CERTIFICATE----

并将其更改为:

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

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

【讨论】:

  • 多么愚蠢的错误,上帝保佑你这个答案;)
【解决方案2】:

补充说明: 当 pem 文件包含 CA 和子 CA 链时,请确保 -----END CERTIFICATE---- -----BEGIN CERTIFICATE----- 不在同一行。

【讨论】:

    【解决方案3】:

    朋友们请!

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

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

    只是。

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

    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
    

    部署为 /tmp/ 中的 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(作为根用户)

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

    【讨论】:

    • 什么是zimbra,有必要吗?
    • 看起来这只是他在那台机器上的用户名。
    【解决方案4】:

    它的工作原理如下:tls.crt

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

    【讨论】:

      【解决方案5】:

      tl;博士

      确保有五个破折号-----围绕开始和结束标记。

      关于 PEM 证书的更多信息

      正确的证书格式

      关于证书文本编码的官方RFC 7468文档规定了以下规则:

      • 每个证书的内容必须用BEGIN CERTIFICATEEND CERTIFICATE 标签包围,如下所示:

        -----BEGIN CERTIFICATE-----
        bGlhbmNlIG9uIHRoaXMgY2VydGlmaWNhdGUgYnkgYW55IHBhcnR5IGFzc3Vt...
        -----END CERTIFICATE-----
        
      • 标签本身必须在行首的前面正好有五个破折号 -----,最后在它们后面正好有五个破折号 -----行的

      常见错误

      • 复制粘贴时在证书的开头或结尾意外省略了一个破折号

      • 同一行有两个封装边界,如下所示:

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

        (在同一行结束并直接启动新证书将不起作用,因为那样会有十个而不是五个破折号,并且证书解析器将无法再正确检测标签)

      • 开始标签后或结束标签前有一个空行

      正确链接证书

      一些网络服务器需要一个文件中的所有 SSL/TLS(根、中间和最终用户)证书,但 CA 通常会分开发送所有证书,因此您需要手动连接它们。但是在连接它们时要注意,因为它们的顺序很重要!

      链式证书的正确顺序是:

      1. 最终用户证书
      2. 所有中间证书
      3. 根证书

      要正确连接所有证书,您可以使用以下 bash 命令:

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

      确保将 end-user.crtintermediate.pemroot.crt 替换为您的文件名。

      顺便说一下:.pem.crt 都是有效的 SSL 证书文件结尾/编码。您可以阅读有关 SSL 文件的更多信息here

      【讨论】:

        【解决方案6】:

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

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

        :%s/^M$//
        

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

        (要获得 ^M,您需要按住 Ctrl+Shift,然后连续按住 v 和 m)

        【讨论】:

          【解决方案7】:

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

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

          .

          【讨论】:

          • 顺便说一句,将私钥嵌入到代码中似乎是一个非常糟糕的主意。
          • 谢谢,帮我节省了几个小时!
          【解决方案8】:

          如果你通过以下命令生成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】:

            我正在从.env 文件中读取密钥。用双引号将键括起来解决了这个问题。

            给出错误:

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

            作品:

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

            【讨论】:

            • 我可以在其中看到一些换行符,这是故意的吗?如果不将密钥保留在一行上,这是否也有效?
            【解决方案10】:

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

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

            而不是

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

            【讨论】:

            • 您节省了 3 天的头痛
            【解决方案11】:

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

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

            要解决,请删除空行:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-04-25
              • 2020-10-12
              • 2018-11-01
              • 2020-10-19
              • 2014-04-30
              • 1970-01-01
              • 1970-01-01
              • 2020-07-16
              相关资源
              最近更新 更多