温馨提示×

如何在ubuntu上排查nginx ssl问题

小樊
36
2025-12-28 17:16:13
栏目: 云计算

Ubuntu 上排查 Nginx SSL 问题的系统化流程

一 快速自检清单

  • 核对监听与启用 SSL:在对应 server 块中必须是 listen 443 ssl;(IPv6 为 listen [::]:443 ssl;),仅写 listen 443 会导致握手失败或浏览器报 ERR_SSL_PROTOCOL_ERROR
  • 证书与密钥路径与权限:确认 ssl_certificatessl_certificate_key 指向正确文件,文件存在且 Nginx 工作进程可读(证书 644、密钥 600 更稳妥)。
  • 配置语法与服务状态:执行 sudo nginx -t 校验;通过后 sudo systemctl reload nginx 使配置生效。
  • 防火墙放行:使用 UFW 时放行 443/tcp(如:sudo ufw allow 443/tcp),或确认云厂商安全组已放行 443
  • 日志定位:查看 /var/log/nginx/error.logaccess.log,错误通常直接指明缺失指令、证书路径或权限问题。

二 定位步骤与命令

  • 检查 Nginx 是否包含 SSL 模块:运行 sudo nginx -V 2>&1 | grep -o with-http_ssl_module,若未包含需安装包含 SSL 的包或重新编译。
  • 验证配置语法与生效:执行 sudo nginx -t;无误后 sudo systemctl reload nginx
  • 查看错误日志:实时观察 sudo tail -f /var/log/nginx/error.log,关注证书路径、权限、协议/套件不匹配等报错。
  • 验证证书有效性与链:
    • 查看有效期与主题/扩展:openssl x509 -in /path/cert.pem -text -noout
    • 链与服务器返回链:openssl s_client -connect example.com:443 -servername example.com -showcerts
  • 本机直连测试:
    • 详细握手:curl -Iv https://example.com
    • 指定协议:openssl s_client -connect example.com:443 -tls1_2-tls1_3
  • 在线体检:使用 SSL Labs 检测协议、套件与链是否合规。

三 常见错误与修复对照表

症状 可能原因 快速修复
浏览器报 ERR_SSL_PROTOCOL_ERROR 443 端口未启用 SSL(写成 listen 443) 改为 listen 443 ssl;(IPv6 加 listen [::]:443 ssl;
启动/重载报错 “no ‘ssl_certificate’ is defined …” 证书/密钥指令缺失或路径错误 在监听 443 的 server 块中正确设置 ssl_certificate /path/fullchain.pem;ssl_certificate_key /path/privkey.pem;
部分客户端不信任 证书链不完整 使用 fullchain.pem(含中间证书)作为 ssl_certificate
握手失败或 “wrong version number” 协议/套件不匹配 设置 ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;,并启用 ssl_prefer_server_ciphers on;
私钥无法读取 权限过宽/错误 私钥权限设为 600(如:chmod 600 /path/privkey.pem
端口不通 防火墙/安全组未放行 sudo ufw allow 443/tcp 或放行云安全组 443
出现 “SSL_do_handshake() failed” 证书问题/套件不匹配/依赖缺失 error.log,核对证书有效性与链,调整协议/套件,确保依赖与模块正常
系统策略导致握手失败 加密策略过严(如 FUTURE 临时切回 DEFAULTsudo update-crypto-policies --set DEFAULT 后重载 Nginx

四 最小可用 SSL 配置与一键部署

  • 最小可用配置示例:
    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;
    
        # 可选:HTTP 自动跳转 HTTPS
        # return 301 https://$host$request_uri;
    }
    
    校验与生效:sudo nginx -t && sudo systemctl reload nginx
  • 一键部署(Certbot):
    • 安装:sudo apt install certbot python3-certbot-nginx
    • 申请/续期并自动配置 Nginx:sudo certbot --nginx -d example.com -d www.example.com
    • 自动续期检查:sudo certbot renew --dry-run

五 仍未解决时的进阶检查

  • 端口与监听冲突:确认 443 未被其他进程占用,Nginx 配置已 include 到主配置并启用(如 sites-enabled 软链正确)。
  • 证书与密钥匹配:核对私钥与证书是否成对(必要时重新签发)。
  • SNI 配置:多域名同 IP 时,确保各域名在正确的 server 块中且 server_name 匹配。
  • 外部因素:检查云安全组/机房防火墙、客户端是否限制在 TLS 1.0/1.1
  • 模块与依赖:若 Nginx 编译时未包含 SSL 模块,会报 “SSL modules require the OpenSSL library”,需安装 libssl-dev 并重新编译或改用发行版提供的包含 SSL 的 Nginx 包。

0