这个错误通常是浏览器和服务器之间的 SSL/TLS 协议版本不匹配导致的,最直接的解决办法是在 Nginx 配置中明确启用 TLSv1.2 和 TLSv1.3,并禁用旧版协议。
先说结论:核心问题是加密协议版本过低或被禁用,现代浏览器已不再支持 TLS 1.1 及以下版本。
- 先确认:执行 nginx -v 检查版本,TLSv1.3 需要 1.17.0+
- 先处理:修改 Nginx 配置中的 ssl_protocols 和 ssl_ciphers 指令
- 再验证:使用 openssl 命令或浏览器重新访问测试
前置检查:确认 Nginx 版本
在修改配置前,务必确认 Nginx 版本,因为 TLSv1.3 支持需要特定版本。
nginx -v查看输出版本号:
- 1.17.0 及以上:可以安全启用 TLSv1.3 和 TLSv1.2。
- 1.17.0 以下:仅配置 TLSv1.2,强行添加 TLSv1.3 会导致 nginx -t 检查失败,服务无法启动。
配置修改方案
找到 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 目录下),定位到对应的 server 块。
方案 A:Nginx 1.17.0+ (推荐)
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 启用 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# Mozilla 中间级兼容加密套件
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
}方案 B:Nginx 旧版本 (低于 1.17.0)
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;修改后执行:
nginx -t
nginx -s reload如果 nginx -t 报错 unknown protocol "TLSv1.3",说明版本过低,请移除 TLSv1.3 后重试。
验证方法
最简单的方法是直接在浏览器中刷新页面,看锁形图标是否正常显示,且不再报错。
命令行验证服务器支持的协议:
openssl s_client -connect yourdomain.com:443 -tls1_2如果连接成功并显示 Certificate 信息,说明 TLS 1.2 可用。对于 TLS 1.3:
openssl s_client -connect yourdomain.com:443 -tls1_3常见坑与排查
1. 版本不匹配报错:低版本 Nginx 配置 TLSv1.3 会导致 reload 失败。务必先执行 nginx -v 确认。
2. 证书链不完整:有时候协议没问题,但中间证书缺失也会导致握手失败,表现类似。确保 ssl_certificate 文件中包含完整的证书链。
3. SNI 问题:如果服务器上有多个 HTTPS 站点,确保客户端支持 SNI,使用 openssl 测试时需加 -servername 参数。
4. 防火墙拦截:确认服务器安全组或防火墙放行了 443 端口,否则连接会被直接重置而不是报 SSL 错误。
参考来源
- Nginx 官方文档 - ngx_http_ssl_module: https://nginx.org/en/docs/http/ngx_http_ssl_module.html
- Mozilla SSL 配置生成器:https://ssl-config.mozilla.org/