【问题标题】:nginx fails to load ssl certificatenginx 加载 ssl 证书失败
【发布时间】:2014-03-19 04:51:32
【问题描述】:

我必须为网站添加 ssl (https),​​我得到了一个 SSL.CSR 和一个 SSL.KEY 文件。我对它们进行了“dos2unix”处理(因为它们有尾随 ^M)并将它们复制到服务器(CSR -> mywebsite.crt,KEY -> mywebsite.key)。我对 nginx.conf 做了如下修改:

@@ -60,8 +60,13 @@
        }

     server {
-       listen       80;
+       listen       443;
         server_name  ...;
+       ssl                 on;
+       ssl_certificate     mywebsite.crt;
+       ssl_certificate_key mywebsite.key;
+       ssl_session_cache   shared:SSL:10m;
+       ssl_session_timeout 10m;
        # Set the max size for file uploads to 500Mb

        client_max_body_size 500M;

重启nginx时发生错误:

nginx: [emerg] PEM_read_bio_X509_AUX("/etc/nginx/mywebsite.crt") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)

我认为这是因为 mywebsite.crt 文件的第一行包含“REQUEST”,所以我从第一行和最后一行中删除了“REQUEST”,然后再次重新启动 nginx,并遇到另一个错误:

nginx: [emerg] PEM_read_bio_X509_AUX("/etc/nginx/mywebsite.crt") failed (SSL: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:Field=algorithm, Type=X509_ALGOR error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:Field=signature, Type=X509_CINF error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:Field=cert_info, Type=X509 error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib)

有什么想法吗?

【问题讨论】:

  • 您可以从StartCom 获得免费的 1 类服务器证书。提交 CSR,并取回 CRT(签名证书)。将 CRT 转换为 PEM,并将 StartCom 的 Class 1 Server Intermediate 证书与您刚刚转换的 PEM 编码证书连接到文件中。正如马克所说,扔掉那把钥匙。
  • 顺便说一下,openssl req -in mycsr.csr -noout -text 打印 CSR。您的 CSR 格式不正确 - 因为它有一个通用名称 (CN),所以需要将相同的主机名列为主题替代名称 (SAN)。 CN 已弃用,您应该将 *.example.net 列为 SAN(并省略 CN)。请参阅 CA/浏览器论坛中的公共信任证书的颁发和管理的基线要求。
  • @noloader 感谢您的回答!实际上我使用了错误的文件,我得到了一个 nginx 接受的 CertB64.cer 文件。现在我还有两个问题:1)Firefox 抱怨证书没有“颁发者链”2)由于 Chrome 和 IE 抱怨证书(为 *.aaa.mywebsite.com 发布)不适用于asset.bbb.aaa.mywebsite.com,只有手动打开图片 URL 并确认安全异常才能打开图片。我想我需要为 ..aaa.mywebsite.com 颁发另一个证书,其中包含颁发者链?
  • 我在 macOS 上遇到了这个问题。我错误地导出了链中每个证书的Public Key,而不是证书文件。一旦我导出了 Cert 文件(作为 PEM 文件)并将它们链接在一起,一切正常。

标签: ssl nginx https openssl ssl-certificate


【解决方案1】:

我遇到了同样的问题,原因是一个证书的-----END CERTIFICATE-----和另一个证书的-----BEGIN CERTIFICATE-----恰好在同一行,所以基本上:

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

这发生在我通过命令行将几个 crt 文件合并到一个包中之后,并且在文件之间没有添加换行符,这损坏了整个 crt 文件。

通过分割线修复它

【讨论】:

    【解决方案2】:

    the NGINX site 上用于将公共证书与中间证书组合的步骤使用cat 来组合这两个文件。但是如果您的公共证书文件没有以新行结尾,则中间证书的-----BEGIN CERTIFICATE----- 行将附加到公共证书的-----END CERTIFICATE----- 行的末尾,从而导致链接证书文件无效。手动分离这两行可以解决问题。

    【讨论】:

    • 多谢了,拉了我半个小时的头发:)
    • 这对我来说只是初始证书生成中的一个错字。我只需要重做证书。
    • 对我来说,连接两个证书的命令cat 以某种方式在合并的.crt 文件中创建了重复的内容。所以我手动连接两个证书来创建.crt 文件,然后Nginx 停止抱怨。
    【解决方案3】:

    我在gitlab.rb 文件中错误地配置了证书。 一个简单的错误花了很长时间才意识到。

    nginx['ssl_certificate'] = "/etc/gitlab/ssl/self-ssl.crt"
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/self-ssl.key"
    

    代替

    
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/self-ssl.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/self-ssl.key"
    

    【讨论】:

      【解决方案4】:

      仅供参考,您可以验证刚刚调用的键:

      openssl x509 -noout -text -in your.crt
      openssl rsa -noout -text -in your.key
      

      在我的例子中,这个错误被证明是相当微妙的:BEGIN 块以 4 个破折号开头,而不是 5 个。 ---- 与 -----。遗憾的是,验证工具的错误消息不是很具体。

      【讨论】:

      • 在我的情况下,BEGIN 之后和 END 虚线之前的换行符丢失了,我不得不将它们添加回来。
      • 谢谢@joseph-lust,我能够使用它来确定问题所在。我使用 openssl 从 .pem 生成了我的 .crt 文件,而 openssl 无法验证它。
      • 在我的情况下,复制粘贴时,我在每行的开头都有额外的空格。
      • 在我的情况下,文件是通过 slack 发送给我的,它转换 ----- 到 ——
      【解决方案5】:

      我在网上搜索 SSL 时遇到了这个问题:error:0906D06C:PEMroutines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE
      运行后出现此错误:

          nginx -t
      

      我遇到的问题是缺少 cert.pem 和 cert.key

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

      【讨论】:

      • nginx -t 让我知道我使用的 .crt 格式不正确。我仔细检查并在导入期间(我正在使用外部服务安装证书).crt 文件被破坏了。谢谢大佬。
      • 这里的情况相同。
      【解决方案6】:

      您永远不应该共享您的私钥。您应该认为您在此处发布的密钥已被泄露,并生成新的密钥和签名请求。

      您有一个证书请求,而不是一个实际签名的证书。您向签署方提供请求(“CSR”)。他们使用该请求来创建一个签名证书(“CRT”),然后将其提供给您。密钥永远不会透露给任何人。

      【讨论】:

      • 我如何获得 CSR?我得到了一个 CRT 和一个 KEY 文件。
      • @PaulKenjora CSR 可以使用 openssl 自行生成
      猜你喜欢
      • 2016-12-19
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多