Nginx配置问题:通过IP访问时无法使用自签名证书
解决Nginx IP访问返回错误证书的问题
问题根源
当通过IP直接访问服务器时,若请求未携带匹配域名的Host头(比如使用openssl s_client默认方式发起请求),Nginx会自动选择第一个监听对应端口的server块作为默认服务器,因此返回了配置Let's Encrypt证书的域名server块内容。
解决步骤
1. 将IP对应的Server块设为默认服务器
修改IP访问的Server块,在listen指令后添加default_server参数,确保无匹配Host头的请求会命中这个块:
server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name 149.154.150.134; ssl_certificate /path/to/cert/fullchain.pem; ssl_certificate_key /path/to/cert/privkey.pem; location / { allow 214.107.49.66; deny all; } }
2. 修正原有域名Server块的server_name写法
原有配置中使用逗号分隔多个域名是错误的,Nginx要求用空格分隔域名列表,修正后:
server { root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; # 替换逗号为空格 location / { proxy_pass http://localhost:6000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } listen [::]:443 ssl http2 ipv6only=on; listen 443 ssl http2; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; }
3. 验证配置并重启Nginx
- 先检查配置语法是否合法:
nginx -t - 确认无误后重启Nginx使配置生效:
systemctl restart nginx
验证结果
再次执行openssl s_client -connect 149.154.150.134:443测试,应该会返回你的自签名证书。若要测试带IP Host头的请求,可使用:
openssl s_client -connect 149.154.150.134:443 -servername 149.154.150.134
内容的提问来源于stack exchange,提问作者gb_spectrum
相关产品推荐
相关产品推荐

