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

Pep*_*ict 2 ssl openssl nginx docker-compose

我没有主意,请帮忙!

我使用Openssl创建SSL:

openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout key.pem -out cert.pem -days 3650
Run Code Online (Sandbox Code Playgroud)

cert.pem看起来像这样:

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

key.pem看起来像这样:

-----BEGIN PRIVATE KEY-----
key
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

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

在nginx中,我添加了这样的内容:

  listen    443 ssl;
  server_name       localhost;
  ssl_certificate   ssl/cert.pem;
  ssl_certificate_key   ssl/key.pem;
Run Code Online (Sandbox Code Playgroud)

当我启动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)
Run Code Online (Sandbox Code Playgroud)

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

vik*_*027 6

只是扩展@patrick的答案,此命令可用于将受信任的证书转换为普通证书。

$ openssl x509 -in trusted.pem -clrtrust -out normal.pem
Run Code Online (Sandbox Code Playgroud)

注意:如果您的源文件中有多个证书(trusted.pem在上面的示例中),那么您必须对所有证书执行相同的操作。

  • 根据 Patrick Mevzek 的评论,对我有用的是使用“trustout”,如下所示:“openssl x509 -in trust.pem -trustout -out normal.pem” (2认同)

Pat*_*zek 5

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

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

(结构的...Base64编码DER

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

附带说明一下,由于它似乎是一种流行的(错误的)信念,因此文件名本身(包括扩展名)对内容的工作(或不工作)状态没有任何影响。您可以命名文件foobar.42buzz.666并且如果它们的内容有效,它们也可以正常工作...当然,人工维护会更加困难,因此通常使用.crt证书(或.cert基于非DOS的受限环境)的约定.key密钥文件,通常使用网站名称(对于网站)或部分名称作为名称,例如example.com.crt。但是,这些只是一组可能的约定,需要这些文件的任何程序都不关心名称,而只关心内容。有些人也在使用.pem扩展名。

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

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

-----BEGIN TRUSTED CERTIFICATE-----
...
-----END TRUSTED CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

唯一的区别是添加的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命令的“信任设置”部分


小智 5

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

我删除了源自 PFX 到 PEM 转换的标题行,因此文件将以-----BEGIN CERTIFICATE-----. Powershell默认Out-File将文件存储为UTF8NoBOM 。

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