Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx-仅在存在SSL证书时启用SSL_Ssl_Nginx_Https - Fatal编程技术网

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

Nginx-仅在存在SSL证书时启用SSL,ssl,nginx,https,Ssl,Nginx,Https,我有一个问题,我正在构建一个nginx反向代理,用于指向不同url路径上的多个微服务 该系统完全基于docker,因此开发和生产使用相同的环境。这给我在安装SSL时带来了一个问题,因为SSL证书仅在生产环境中可用,因此当我使用SSL配置NGINX时,开发环境不再工作,因为SSL证书不存在 以下是我的conf文件的相关部分- server { listen 80; listen 443 default_server ssl; server_name atvcap.serv

我有一个问题,我正在构建一个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_文件(“/etc/nginx/certs/atvcap_cabundle.crt”)失败(SSL:错误:0201002:系统库:fopen:无此类文件或目录:fopen('/etc/nginx/certs/atvcap_cabundle.crt','r')错误:2006D080:BIO例程:BIO_new_文件:无此类文件)

只有当“/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\u certificate”指令在中不允许在此处使用 /etc/nginx/conf.d/default.conf:7

有人对如何实现这样的目标有什么想法吗


谢谢

您可以创建一个附加文件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*;

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

的@super\p答案是正确的。但是为了回答@AbdolHosein的评论,如果不清楚,我在这里添加我的答案

您需要在包含的文件中包含
ssl\u证书
指令

# 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
是否存在。这要感谢
include/ssl/ssl.conf*中的
*
所述的代码>目录作为临时解决方案,我刚刚创建了两个nginx.conf文件——一个用于开发,一个用于生产。当我们处于开发模式时,开发模式会覆盖生产模式。理想情况下,我不想让两个文件做几乎相同的事情。我正在寻找相同的解决方案。不管这种技术有助于解决这个问题,但是如果有合适的
.crt
文件,有没有办法启用ssl文件?