Nginx - 仅在SSL证书存在时启用SSL

时间:2017-11-30 14:06:03

标签: ssl nginx https

我有一个问题,我正在构建一个nginx反向代理,用于指向不同url路径的多个微服务。

系统完全基于docker,因此相同的环境用于开发和生产。这在安装SSL时会给我带来问题,因为SSL证书只能在生产中使用,因此当我使用SSL配置NGINX时,开发环境不再有效,因为ssl证书不存在。

以下是我的conf文件的相关部分 -

server {
 listen 80;
 listen 443 default_server ssl;

 server_name          atvcap.server.com;
 ssl_certificate      /etc/nginx/certs/atvcap_cabundle.crt;
 ssl_certificate_key  /etc/nginx/certs/atvcap.key;
 ...
}

但是在开发模式下运行我的应用程序时会抛出以下内容 -

  

nginx:[emerg] BIO_new_file(" /etc/nginx/certs/atvcap_cabundle.crt")失败(SSL:错误:02001002:系统库:fopen:没有这样的文件或目录:fopen(& #39; /etc/nginx/certs/atvcap_cabundle.crt',' r')错误:2006D080:BIO例程:BIO_new_file:没有这样的文件)

如果" /etc/nginx/certs/atvcap_cabundle.crt"是否可以仅打开SSL;可以吗?

我曾尝试过以下内容 -

if (-f /etc/nginx/certs/atvcap_cabundle.crt) {
  ssl_certificate      /etc/nginx/certs/atvcap_cabundle.crt;
  ssl_certificate_key  /etc/nginx/certs/atvcap.key;
}

但是引发了以下错误 -

  

nginx:[emerg]" ssl_certificate"这里不允许使用指令   /etc/nginx/conf.d/default.conf:7

任何人对如何实现这样的事情都有任何想法?

由于

2 个答案:

答案 0 :(得分:3)

您可以创建其他文件 ssl.conf 并将ssl配置放在此处:

ssl_certificate      /etc/nginx/certs/atvcap_cabundle.crt;
ssl_certificate_key  /etc/nginx/certs/atvcap.key;

然后在主配置中包含:

server_name          atvcap.server.com;

include /somepath/ssl.conf*;

确保包括*符号-当文件在开发模式下不存在时,该符号不会中断。

答案 1 :(得分:2)

@super_p 的回答是正确的。但是要回答@AbdolHosein 评论,如果不清楚,我会在此处添加我的答案。

您需要在包含的文件中包含您的 ssl_certificate 指令。

# sample nginx config
http {
    server {
        listen 80 deferred;
        server_name _;

        include /ssl/ssl.conf*;

        client_body_timeout 5s;
        client_header_timeout 5s;

        root /code;
    }
}

然后在您的 /ssl/ssl.conf 中您可以做任何您想做的事情,例如启用 HTTPS:

# this is the /ssl/ssl.conf file
listen 443 ssl http2;
listen [::]:443 ssl http2;

ssl_certificate /ssl/cert.cer;
ssl_certificate_key /ssl/key.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

诀窍是我们不查看证书是否存在,而是检查 /ssl/ssl.conf 是否存在。这要归功于@super_p

所述的 * 目录中的 include /ssl/ssl.conf*;