Nginx SSL 在 Debian 上的常见问题解答
一 快速排查流程
- 核对配置与证书路径:确认 server 块包含 listen 443 ssl;,以及 ssl_certificate 与 ssl_certificate_key 指向正确文件;修改后先执行 sudo nginx -t 再重载。证书链不完整时,将域名证书与中间证书合并为 fullchain 并在 ssl_certificate 使用合并后的文件。
- 证书与私钥是否匹配:比较两者的 Modulus 是否一致
openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5
- 查看错误日志:优先检查 /var/log/nginx/error.log 获取具体报错行号与原因。
- 端口与防火墙:确认 443 未被占用(如 netstat -tulpen | grep :443),并放行防火墙(如 ufw allow 443/tcp)。
- 服务状态:确认 Nginx 已运行(systemctl status nginx),必要时重启。
- 在线检测:使用 SSL Labs 测试协议、套件与链是否合规。
二 常见报错与修复
- the “ssl” parameter requires ngx_http_ssl_module:Nginx 未编译 http_ssl_module。执行 nginx -V 检查编译参数;若缺失,安装 OpenSSL 开发库后重新编译加入 –with-http_ssl_module(注意仅 make,不要覆盖原二进制)。
- SSL_PROTOCOL_ERROR:多由协议/套件不匹配、证书与私钥不匹配或证书链不完整引起。核对 ssl_protocols、ssl_ciphers,确保证书链完整,必要时升级 Nginx 版本并清理浏览器缓存后复测。
- SSL_do_handshake() failed:常见于客户端与服务器加密套件不匹配、证书无效或依赖库问题。检查 Nginx 错误日志、更新套件配置、确认证书有效并更新根证书存储。
- conflicting server name “example.com” on 0.0.0.0:443:同名 server 块冲突。合并 server_name 列表,或将 www 做 301 到主域名。
- Nginx 无法启动(证书/权限/端口):证书路径错误或权限不足(Nginx 通常以 www-data 运行,证书建议 640 权限且属主 www-data),或 443 被占用。修正路径/权限并释放端口后重启。
三 证书获取与自动续期
- 使用 Let’s Encrypt + Certbot(推荐):
- 安装:sudo apt update && sudo apt install certbot python3-certbot-nginx
- 申请并自动配置:sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
- 验证与续期:sudo certbot certificates;sudo certbot renew --dry-run;生产可用定时任务(如每日 3 点)执行续期。
- 手动配置要点:
- 证书链:将 your_domain.crt 与 intermediate.crt 合并为 combined.crt 或直接使用 fullchain.pem;ssl_certificate 指向完整链文件。
- 权限与路径:证书与私钥建议放在 /etc/ssl/ 或 /etc/nginx/ssl/,权限 640、属主 www-data,并确保 Nginx 配置路径一致。
- 自签名证书(仅测试):
- 生成:openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt
- 注意客户端需手动信任该证书,生产环境不建议使用。
四 安全与性能配置建议
- 协议与套件:仅启用 TLSv1.2/TLSv1.3;使用现代 AEAD 套件并开启 ssl_prefer_server_ciphers on;。
- 证书链与 DH 参数:ssl_certificate 使用 fullchain;生成并配置 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;。
- HTTP/2:在 listen 443 ssl http2; 启用,提升并发性能。
- 安全头:启用 HSTS、X-Frame-Options、X-Content-Type-Options、X-XSS-Protection,必要时配置 CSP。
- 持续检测:定期用 SSL Labs 测评并据此优化套件与协议。
五 附 最小可用 HTTPS 配置示例
- 使用 Certbot 路径(推荐):
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security “max-age=31536000; includeSubDomains” always;
root /var/www/html; index index.html;
}
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
- 手动合并链示例:cat your_domain.crt intermediate.crt > fullchain.crt,然后 ssl_certificate 指向 fullchain.crt。