Ubuntu 上排查 Nginx SSL 问题的系统化流程
一 快速自检清单
二 定位步骤与命令
三 常见错误与修复对照表
| 症状 | 可能原因 | 快速修复 |
|---|---|---|
| 浏览器报 ERR_SSL_PROTOCOL_ERROR | 443 端口未启用 SSL(写成 listen 443) | 改为 listen 443 ssl;(IPv6 加 listen [::]:443 ssl;) |
| 启动/重载报错 “no ‘ssl_certificate’ is defined …” | 证书/密钥指令缺失或路径错误 | 在监听 443 的 server 块中正确设置 ssl_certificate /path/fullchain.pem; 与 ssl_certificate_key /path/privkey.pem; |
| 部分客户端不信任 | 证书链不完整 | 使用 fullchain.pem(含中间证书)作为 ssl_certificate |
| 握手失败或 “wrong version number” | 协议/套件不匹配 | 设置 ssl_protocols TLSv1.2 TLSv1.3; 与 ssl_ciphers HIGH:!aNULL:!MD5;,并启用 ssl_prefer_server_ciphers on; |
| 私钥无法读取 | 权限过宽/错误 | 私钥权限设为 600(如:chmod 600 /path/privkey.pem) |
| 端口不通 | 防火墙/安全组未放行 | sudo ufw allow 443/tcp 或放行云安全组 443 |
| 出现 “SSL_do_handshake() failed” | 证书问题/套件不匹配/依赖缺失 | 查 error.log,核对证书有效性与链,调整协议/套件,确保依赖与模块正常 |
| 系统策略导致握手失败 | 加密策略过严(如 FUTURE) | 临时切回 DEFAULT:sudo update-crypto-policies --set DEFAULT 后重载 Nginx |
四 最小可用 SSL 配置与一键部署
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 可选:HTTP 自动跳转 HTTPS
# return 301 https://$host$request_uri;
}
校验与生效:sudo nginx -t && sudo systemctl reload nginx。五 仍未解决时的进阶检查