nginx SSL没有开始线:期望:可信任证书

时间:2018-08-17 16:50:54

标签: ssl nginx openssl docker-compose

我没有主意,需要帮助!

我使用Openssl创建SSL:

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out cert.pem -days 3650

cert.pem看起来像这样:

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

key.pem看起来像这样:

-----BEGIN PRIVATE KEY-----
key
-----END PRIVATE KEY-----

在docker-compose中,我已将证书/密钥发送到etc / nginx / ssl /...

volumes:
  - ./sites:/etc/nginx/conf.d
  - ./conf/nginx.conf:/etc/nginx/nginx.conf
  - ./ssl/cert.pem:/etc/nginx/ssl/cert.pem
  - ./ssl/key.pem:/etc/nginx/ssl/key.pem

在nginx中,我像这样添加了它:

  listen    443 ssl;
  server_name       localhost;
  ssl_certificate   ssl/cert.pem;
  ssl_certificate_key   ssl/key.pem;

当我启动docker-compose时,出现了Nginx错误:

web_1    | 2018/08/17 16:38:47 [emerg] 1#1: PEM_read_bio_X509_AUX("/etc/nginx/ssl/cert.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)
web_1    | nginx: [emerg] PEM_read_bio_X509_AUX("/etc/nginx/ssl/cert.pem") failed (SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE)

我已经为此工作了几天,但我不确定为什么会不断收到此错误。我尝试使它成为crt / key而不是.pem,并且出现相同的错误。如果我只是一起删除ssl,则服务器工作正常,但我非常需要SSL。 Pleeeaaase帮助!

3 个答案:

答案 0 :(得分:2)

一旦以PEM编码,“正常”证书将如下所示:

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

...DER结构的Base64编码)

这通常是(具有关联的密钥,通常在单独的文件中)任何启用了TLS的应用程序想要向远端显示其身份时所需的东西。

作为一个旁注,由于它似乎很流行(错误),因此文件名本身(包括扩展名)对内容的正常工作(或不正常)没有任何影响。您可以为文件foobar.42buzz.666命名,如果它们的内容有效,它们也可以正常工作...当然,人工维护会比较困难,因此惯例通常将.crt用于证书(对于非基于DOS的受约束环境,通常使用.cert;对于密钥文件,则使用.key);通常使用网站名称(对于网站)或其中的一部分它的名称,例如example.com.crt。 但是,这些只是一组可能的约定,需要这些文件的任何程序都不关心名称,而只关心内容。 有些人也在使用.pem扩展名。

以上所有内容,请参见https://en.wikipedia.org/wiki/X.509#Certificate_filename_extensions,其中对选项进行了很好的讨论/介绍。

现在,在您的情况下,错误消息告诉您它应该具有这样的内容:

-----BEGIN TRUSTED CERTIFICATE-----
...
-----END TRUSTED CERTIFICATE-----

唯一的区别是添加了TRUSTED关键字。但是为什么?何时发生?

证书由一个“证书颁发机构”通过一个或多个中间体签名。这样就建立了一个根证书的信任链,在该证书的颁发者等于主题的情况下,该证书会对其进行签名。

您自己生成了证书,因此这是一个“自签名”证书,从技术上讲与CA证书没有区别,只是默认情况下没有任何系统(包括您自己的系统)会在没有特定配置的情况下信任该证书。

这基本上是错误消息告诉您的内容:应用程序说它正在根据您无法验证(因为它是自签名)的配置加载证书,与此同时,您也没有明确配置它以信任它。

根据应用程序或其版本,这可能有所不同,因为https://www.digitalocean.com/community/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-16-04上的指南与您所做的基本上相同,但是它没有显示证书的内容。

在您的openssl呼叫中,如果添加-trustout,它将生成BEGIN TRUSTED CERTIFICATE而不是BEGIN CERTIFICATE。默认情况下,也可能会发生这种情况,具体取决于系统上openssl的安装/配置方式。相反,您有-clrtrust。 请参见https://www.openssl.org/docs/man1.1.0/apps/x509.html

openssl x509命令的“信任设置”部分

答案 1 :(得分:2)

只是扩展@patrick 的答案,此命令可用于将 trusted 证书转换为 normal 证书。

public function columns_renderer()
{
    $allowedBlocks = ["acf/theme-column"];
    $template = array(
        array('acf/biore-column', []),
    );
    $column_count = get_field("columns-count");
    ?>
    <div class="row py-4">
        <?php for($i = 0; $i < $column_count; $i++): ?>
        <div class="col">
            <InnerBlocks allowedBlocks="<?= esc_attr(wp_json_encode($allowedBlocks)); ?>" template="<?= esc_attr(wp_json_encode($template)); ?>" />
        </div>
        <?php endfor; ?>
    </div>
    <?php
}

注意:如果您的源文件中有多个证书(上例中的 $ openssl x509 -in trusted.pem -clrtrust -out normal.pem ),那么您必须对所有证书执行相同的操作。

答案 2 :(得分:1)

我今天偶然发现了“ Expecting: TRUSTED CERTIFICATE”问题,发现就我而言,这是由于文件编码引起的。

我删除了从PFX到PEM转换的标题行,因此文件将以-----BEGIN CERTIFICATE-----开头。 默认情况下,Powershell Out-File将文件存储为 UTF8NoBOM

此后,OpenSSL无法读取文件,直到我将其更改为 ASCII 编码(通过使用Out-File -Encoding ascii