Nginx 在 Ubuntu 上的 SSL 调试技巧
一 快速自检与最小可用配置
sudo nginx -V 2>&1 | grep -o with-http_ssl_module(应返回 with-http_ssl_module)sudo nginx -t(应提示 syntax is ok / test is successful)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;
}
ssl_certificate;私钥权限设为 600
sudo chmod 600 /etc/nginx/ssl/*.keysudo nginx -t,再 sudo systemctl reload nginx,避免直接 restart 造成中断。二 日志与证书核验
sudo tail -f /var/log/nginx/error.log | grep -i sslopenssl x509 -in /path/cert.pem -text -nooutssl_trusted_certificate 指定中间证书路径。三 连接层与协议套件测试
curl -Iv https://example.com(关注 TLS 版本、证书链、握手结果)openssl s_client -connect example.com:443 -tls1_2 或 -tls1_3ssl_protocols/ssl_ciphers四 常见错误与修复对照表
| 症状 | 快速定位 | 修复建议 |
|---|---|---|
| 浏览器报 ERR_SSL_PROTOCOL_ERROR | 配置仅 listen 443; 未加 ssl |
改为 listen 443 ssl; 并 sudo nginx -t && sudo systemctl reload nginx |
| 启动/重载报错 “no ‘ssl_certificate’ is defined …” | 443 的 server 块未设置证书或路径错误 | 在 443 server 块中正确设置 ssl_certificate 与 ssl_certificate_key,确认文件存在 |
| 证书链不完整 | 客户端不信任或链校验证失败 | 使用 fullchain.pem;或在需要 OCSP 校验时配置 ssl_trusted_certificate |
| 握手失败或 “no protocols available” | 协议/套件不匹配或系统策略过严 | 启用 TLSv1.2/1.3;将 ssl_ciphers 设为通用套件(如 HIGH:!aNULL:!MD5);必要时将系统加密策略临时切回 DEFAULT |
| 私钥权限错误 | 日志提示无法读取私钥 | 设置私钥 600 权限:sudo chmod 600 /path/*.key |
| 端口未放行 | 外部访问超时或连接被拒 | 放行 443/tcp:sudo ufw allow 'Nginx Full' 或 sudo ufw allow 443/tcp;同时检查云厂商安全组 |
| 系统时间错误导致验证失败 | 证书 “not yet valid” 或 “expired” | 启用 NTP:sudo timedatectl set-ntp true,并校准时区 |
五 进阶与自动化
sudo apt install certbot python3-certbot-nginxsudo certbot --nginx -d example.com -d www.example.comserver_name 与证书sudo apt update && sudo apt upgrade nginx openssl。