温馨提示×

nginx在ubuntu上ssl连接失败怎么办

小樊
35
2025-11-23 07:41:57
栏目: 云计算

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

一 快速自检清单

  • 核对监听与启用 SSL:在对应 server 块中必须是listen 443 ssl;(IPv6 为listen [::]:443 ssl;),仅写 listen 443 而未加 ssl 会导致握手失败或浏览器报 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,错误通常直接指明缺失指令、证书路径或权限问题。

二 常见错误与对应修复

  • 未启用 SSL 导致握手失败:配置写成 listen 443; 而非 listen 443 ssl;,Nginx 在 443 上以明文方式工作,浏览器出现 ERR_SSL_PROTOCOL_ERROR。修复:补上 ssl 参数。
  • 证书或密钥未定义/路径错误:Nginx 启动或重载时报 “no ‘ssl_certificate’ is defined in server listening on HTTPS”。修复:在监听 443 的 server 块中正确设置 ssl_certificate /path/fullchain.pem;ssl_certificate_key /path/privkey.pem;,并确认文件存在与权限正确。
  • 证书链不完整:缺少中间证书会导致部分浏览器或客户端不信任。修复:将域名证书与中间证书合并为 fullchain.pem,或确保 ssl_certificate 指向包含链的文件。
  • 弱密钥被拒:使用 1024 位 RSA 私钥时,现代 OpenSSL/系统会报错 “ee key too small”。修复:生成 ≥2048 位 密钥(推荐 2048/4096)。
  • 系统加密策略过严:若系统设置为 FUTURE 等高强度策略,可能禁用部分套件或协议导致握手失败。修复:可临时切回 DEFAULT(如:sudo update-crypto-policies --set DEFAULT),再重载 Nginx。
  • 密码套件写法不兼容:在 Ubuntu/Debian 上设置 ssl_ciphers PROFILE=SYSTEM 可能触发 “no cipher match”。修复:改为通用套件,例如:ssl_ciphers HIGH:!aNULL:!MD5; 并启用 ssl_prefer_server_ciphers on;

三 推荐的最小可用 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;sudo certbot --nginx -d example.com -d www.example.com)。

四 连接与协议层面的验证

  • 本机直连测试:
    • curl 详细握手:curl -Iv https://example.com
    • 指定协议测试:openssl s_client -connect example.com:443 -tls1_2 或 -tls1_3
  • 在线体检:使用 SSL Labs 检测协议、套件与链是否合规。
  • 日志复查:持续观察 /var/log/nginx/error.logaccess.log 的错误提示与访问记录。

五 仍未解决时的定位思路

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

0