如何在Nginx中同时使用自签名证书与Let's Encrypt Certbot SSL证书
故障根本原因
Nginx的端口匹配优先级高于server_name匹配优先级,当多个server块监听同一个443 SSL端口时:
- 如果请求的
Host头无法匹配任何一个server块的server_name,Nginx会默认把请求转发给该端口下第一个被加载的server块处理 - 你大概率是把域名对应的443
server块放在了IP对应的443server块之前,所以访问IP的时候,请求被转发到了域名的server块,使用的是Let's Encrypt颁发的、仅对example.com/www.example.com生效的SSL证书,证书和访问的IP不匹配,浏览器就会提示连接未加密、证书无效。
修复方案
- 调整配置文件中
server块的顺序,把IP对应的443 SSLserver块放在域名对应的443server块之前,确保IP请求能被正确匹配到对应自签名证书的server块 - 也可以给IP对应的443
server块显式加上default_server标识,强制它成为443端口的默认匹配块,配置修改参考:
server { listen 443 ssl default_server; listen [::]:443 ssl default_server; # 剩余原有IP配置保持不变 include /etc/nginx/snippets/self-signed.conf; include /etc/nginx/snippets/ssl-params.conf; server_name 123.123.12.123; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/user/djangotemplates; } location / { include /etc/nginx/proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }
- 修改完成后执行
nginx -t测试配置语法无误,再执行systemctl reload nginx重载配置即可生效。
内容的提问来源于stack exchange,提问作者mic
相关产品推荐
相关产品推荐

