CentOS 上 Nginx SSL 连接失败的排查与修复
一 快速自检清单
- 确认服务与端口:执行systemctl status nginx查看是否运行;用ss -lntp | grep :443或netstat -an | grep 443确认 443 处于监听;若未监听,检查配置是否包含**listen 443 ssl;**并排查端口占用。
- 语法与重载:执行nginx -t校验配置,无误后systemctl reload nginx或nginx -s reload使配置生效。
- 防火墙放行:在 firewalld 执行firewall-cmd --list-ports查看是否放行 443/tcp,未放行则执行firewall-cmd --add-port=443/tcp --permanent && firewall-cmd --reload。
- 证书文件与权限:证书与私钥路径正确、文件可读(建议属主 root:root,权限 600/644),私钥未加密或已正确提供解密密码。
- 模块支持:执行nginx -V 2>&1 | grep -o with-http_ssl_module,若为空需安装 SSL 模块后再启动。
以上步骤能快速定位大多数“连接被拒绝/握手失败”的表面问题。
二 常见错误与对应修复
- 错误提示:SSL_ERROR_RX_RECORD_TOO_LONG
原因:通常访问到了未启用 SSL 的端口(如把 443 配成了明文 HTTP),或配置写法错误。
修复:在对应 server 块中使用listen 443 ssl;(Nginx ≥ 1.15.0 推荐写法),不要把 ssl on; 与 listen 443 混用;确保该 server 监听 443 且为 ssl。
- 错误提示:nginx: [emerg] the “ssl” parameter requires ngx_http_ssl_module
原因:Nginx 未编译进 SSL 模块。
修复:安装模块后重编译或安装带 SSL 的版本,参考命令:
yum 安装依赖 → 下载 Nginx 源码 → ./configure --with-http_ssl_module → make && make install → 重启。
- 握手失败或浏览器提示链不完整
原因:证书链缺失(仅放了域名证书,没有中间证书)。
修复:使用包含完整链的证书文件(如 fullchain.pem),或在 Nginx 中同时配置ssl_certificate(域名证书)与ssl_certificate_key(私钥),必要时补充链文件;用openssl s_client -connect yourdomain.com:443 -showcerts检查链是否完整。
- 协议/套件不兼容
原因:客户端与服务器 TLS 版本或加密套件不匹配。
修复:在 server 块启用现代协议与强套件,例如:
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;
如怀疑 HTTP/2 引发问题,可暂时移除 http2 验证。
- 端口未开放或被拦截
原因:云安全组/本机防火墙未放行 443,或被中间设备(WAF/代理/负载均衡)终止/改写 TLS。
修复:放行 443/tcp,并排查中间设备是否透传 TLS 或在负载均衡上正确配置证书与协议。
以上对应关系是生产环境中最高频的根因与处置路径。
三 一条可用的 Nginx 最小 HTTPS 配置
- 证书准备:将证书与私钥放到**/etc/nginx/ssl/,例如example.com.crt/fullchain.pem与example.com.key**。
- 配置示例:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
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;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
location / {
root /var/www/html;
index index.html;
}
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
- 校验与生效:nginx -t && systemctl reload nginx;随后用浏览器与命令行验证。
该配置覆盖协议、套件、会话缓存与跳转,满足大多数站点安全与兼容性要求。
四 验证与进一步定位
- 本机验证:
- 证书与链:openssl x509 -in /etc/nginx/ssl/example.com.crt -text -noout;
- 握手与链:openssl s_client -connect example.com:443 -servername example.com -showcerts;
- 站点连通:curl -Iv https://example.com。
- 在线评测:使用 SSL Labs 测试站点配置强度与兼容性。
- 抓包分析:用 Wireshark 抓包,定位握手失败的具体阶段与告警。
- 客户端侧:清除浏览器 SSL/缓存,校准系统时间(时间偏差会导致证书验证失败),必要时关闭异常代理后复测。
以上手段可系统化确认“证书、配置、网络、客户端”四个维度的健康度。