Nginx反向代理Node服务出现net::ERR_SSL_PROTOCOL_ERROR问题排查
Nginx反向代理出现SSL协议错误的排查与修复
问题描述
我为Node服务配置了Nginx作为反向代理,证书由Let's Encrypt Certbot生成。当Node服务直接监听443并使用该证书时一切正常,但改用Nginx监听443并使用相同证书时,浏览器出现错误:(failed)net::ERR_SSL_PROTOCOL_ERROR。对应的Nginx site-available配置如下:
server{ listen 443 ssl; server_name xxxxxx.hstgr.cloud; ssl_certificate /...path.../fullchain.pem; ssl_certificate_key /...path.../privkey.pem; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; location /.well-known/acme-challenge/ { autoindex on; root /...path.../.well-known/acme-challenge; } } }
配置问题分析
嵌套location结构错误
你把/.well-known/acme-challenge/的location嵌套在了/的location内部,这会导致Nginx处理ACME挑战请求时,优先走反向代理的逻辑,而非直接读取文件。这种嵌套结构可能干扰SSL握手的正常流程,甚至导致证书验证相关的请求无法正确响应。缺少基础SSL兼容配置
仅指定证书和监听443 ssl不足以保证SSL协商正常完成,缺少SSL协议版本、加密套件等必要配置时,浏览器可能无法和Nginx建立有效的SSL连接。ACME挑战的root路径配置错误
root指令应该指向包含.well-known/acme-challenge目录的上级目录,而不是该目录本身。当前配置会导致Nginx在/...path.../.well-known/acme-challenge/.well-known/acme-challenge/路径下去找文件,显然无法找到。
修正后的配置
server{ listen 443 ssl; server_name xxxxxx.hstgr.cloud; ssl_certificate /...path.../fullchain.pem; ssl_certificate_key /...path.../privkey.pem; # 添加基础SSL配置,确保与主流浏览器兼容 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 单独处理ACME挑战请求,避免嵌套 location /.well-known/acme-challenge/ { autoindex on; root /...path...; # 指向包含.well-known的上级目录 } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
额外排查步骤
- 验证配置有效性:执行
nginx -t检查配置是否有语法错误,同时确认证书文件路径正确、Nginx进程有读取权限。 - 检查端口占用:用
netstat -tulpn | grep 443确认443端口仅被Nginx监听,避免端口冲突。 - 查看错误日志:查看
/var/log/nginx/error.log,里面会记录SSL握手失败的具体原因,比如证书损坏、协议不兼容等。
内容的提问来源于stack exchange,提问作者Jean-Loup
相关产品推荐
相关产品推荐

