HTTPS 在 Docker-Nginx 上不起作用

HTTPS 在 Docker-Nginx 上不起作用

我通过生成 CSR 获得了 *.domain.no 的通配符 SSL 证书,并从 SSL 提供商处收到了 .pem 文件。现在我拥有以下密钥文件:

服务器密钥

certificates.pem(包括中级证书和 SSL 证书)

我想在包含一些子域的 docker-nginx 上使用此证书,我的配置文件如下所示:

/etc/nginx/conf.d/默认.conf

server 
{
   listen      443 ssl;
   server_name     test.domain.no;
   access_log  /var/log/nginx/nginx.access.log;
   error_log   /var/log/nginx/nginx.error.log;
   ssl    on;
   ssl_certificate    /etc/ssl/certificates.pem;
   ssl_certificate_key    /etc/ssl/server.key;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   location /
   {
      proxy_pass         {dockerEndpoint};
      proxy_redirect     off;

    ##proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;

     }
}

Nginx-Dockerfile:

FROM nginx
VOLUME /etc/nginx/conf.d
COPY default.conf /etc/nginx/conf.d/
COPY certificates.pem /etc/ssl
COPY server.csr /etc/ssl
COPY server.key /etc/ssl

https 不起作用,浏览器中出现以下错误:

This site can’t be reached
Try:
Checking the connection
Checking the proxy and the firewall

由于我在 docker-logs 中收到以下错误,因此我将 Dockerfile 更改为:

错误:

BIO_new_file("/etc/ssl/certificates.pem") failed (SSL: error:02001014:system library:fopen:Not a   directory:fopen('/etc/ssl/certificates.pem','r') error:2006D002:BIO   routines:BIO_new_file:system lib)
nginx: [emerg] BIO_new_file("/etc/ssl/certificates.pem") failed (SSL:  error:02001014:system library:fopen:Not a   directory:fopen('/etc/ssl/certificates.pem','r') error:2006D002:BIO   routines:BIO_new_file:system lib)

修改后的Dockerfile:

FROM nginx

COPY default.conf /etc/nginx/conf.d/
#CMD ["nginx", "-g", "daemon off;"]
RUN mkdir /etc/nginx/ssl
RUN chown -R root:root /etc/nginx/ssl
RUN chmod -R 600 /etc/nginx/ssl
COPY certificates.pem /etc/nginx/ssl
COPY server.key /etc/nginx/ssl

现在它不会在 docker-logs 中给出错误,但它仍然无法与 HTTPS 一起使用。:(

我尝试通过连接到 nginx-container 来检查 /var/log/nginx 中的 error.log 并 cat 该文件,但文件中没有任何内容。

任何帮助,将不胜感激。

更新:

我已将 Nginx docker 容器端口修改为 443(-p 443:443),并将 /etc/nginx/ssl 的权限更改为 644,现在如果我使用 https 打开 url,则会出现以下错误:

There are issues with the site's certificate chain (net::ERR CERT COMMON_NAME_INVALID)

尽管它说它是由我的 ssl 提供商颁发的。

答案1

我认为它可能第一次就起作用了,但是你忘记了 docker 命令行中的 -p 443:443。

进行更改后,您将证书复制到了错误的路径。

它期望在以下位置有一个证书文件: /etc/ssl/certificates.pem 并且您要将其复制到:/etc/nginx/ssl

因此,尝试将 docker 文件改回最初的状态,然后使用 -p 443:443 运行它。

出于测试目的,另一种运行方式是以交互方式运行。

docker run --net=host -ti yourcontainername /bin/bash

这将在容器中创建一个 shell。您可以通过检查路径和 cat 配置文件来仔细检查配置。

然后使用 nginx -g“daemon off”以交互方式运行它,检查它是否正常工作,如果一切正常,则进行必要的更改并再次运行。

答案2

文件中缺少另一个证书。ssl_certificate 文件 (certificates.pem) 应包含三个证书:

“中级证书”、“主要证书”和“根证书”。

因此,我要求 SSL 提供商向我发送根证书,并通过将该证书添加到 .pem 文件,HTTPS 就可以正常工作了。

certificates.pem 文件如下所示:

-----BEGIN CERTIFICATE----- 
(Your Primary SSL certificate: your_domain_name.crt) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
(Your Intermediate certificate: DigiCertCA.crt) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
(Your Root certificate: TrustedRoot.crt) 
-----END CERTIFICATE-----

相关内容