Nginx 在 CentOS 上的 SSL 调试技巧
一 快速自检与定位路径
二 常见报错对照与修复要点
| 症状 | 典型日志关键词 | 快速修复 |
|---|---|---|
| 启动报错 unknown directive “ssl” | nginx: [emerg] unknown directive “ssl” | 编译时未包含模块,需带 –with-http_ssl_module 重装或重编译 Nginx |
| 启动报错 No “ssl_certificate” defined | no “ssl_certificate” is defined in server listening on HTTPS | 在 listen 443 ssl 的 server 块中补全 ssl_certificate 与 ssl_certificate_key |
| 启动或握手失败 权限被拒绝 | BIO_new_file() failed … Permission denied | 证书/目录权限不足或 SELinux 限制;证书 644、目录 755,必要时 restorecon 或调整策略 |
| 证书链不完整 | SSL_CTX_use_certificate … certificate verify failed / chain too many | 使用 fullchain.pem(含中间证书);或手动合并:cat domain.crt intermediate.crt > fullchain.pem |
| 握手失败 密钥不匹配 | SSL_CTX_use_PrivateKey_file … verify failed | 校验证书与私钥是否配对(模数一致) |
| 握手失败 曲线不支持 | EC_GROUP_new_by_curve_name: unknown group | 客户端/上游或系统 OpenSSL 过旧,升级 OpenSSL 与 Nginx |
| 握手失败 bad key share | tls_parse_ctos_key_share: bad key share | 客户端过旧或中间设备干扰;升级客户端、临时放宽套件或禁用 HTTP/2 验证 |
| 代理上游 SSL 握手失败 | SSL_do_handshake() failed … while SSL handshaking to upstream | 上游证书链/协议/曲线不兼容;对齐 TLS 版本与曲线,必要时升级上游 OpenSSL |
三 深入排查命令清单
四 配置与运维要点
五 最小化调试配置模板
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
location / {
proxy_pass https://backend.example.com;
proxy_ssl_verify on; # 生产建议开启
proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt; # 上游 CA 或中间证书
proxy_ssl_verify_depth 2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}