温馨提示×

centos nginx ssl连接失败怎么办

小樊
41
2025-11-15 21:47:56
栏目: 云计算

CentOS 上 Nginx SSL 连接失败的排查与修复

一 快速自检清单

  • 确认服务与端口:执行systemctl status nginx查看是否运行;用ss -lntp | grep :443netstat -an | grep 443确认 443 处于监听;若未监听,检查配置是否包含**listen 443 ssl;**并排查端口占用。
  • 语法与重载:执行nginx -t校验配置,无误后systemctl reload nginxnginx -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_modulemake && 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.pemexample.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/缓存,校准系统时间(时间偏差会导致证书验证失败),必要时关闭异常代理后复测。
    以上手段可系统化确认“证书、配置、网络、客户端”四个维度的健康度。

0