err_ssl_protocol_error 根本原因在 nginx error.log 中,需先搜索 ssl_do_handshake() failed 定位是服务端还是上游失败,再根据 openssl 错误码(如 no shared cipher、version too low)精准判断协议/套件/证书问题,最后验证基础配置(listen 443 ssl、证书路径、模块支持)是否合规。

ERR_SSL_PROTOCOL_ERROR 是浏览器端呈现的典型 TLS 握手失败提示,背后真实问题几乎都藏在 Nginx 的 error.log 里。别猜、别重装、别盲目调参数——先看日志上下文,90% 的问题靠一句关键词就能定方向。
第一步:从 error.log 锁定握手发生位置
打开 /var/log/nginx/error.log,搜索 SSL_do_handshake() failed,重点看它紧挨着的那句描述:
- 出现 while SSL handshaking to upstream → Nginx 当 HTTPS 客户端连后端失败(比如 proxy_pass https:// 后端)
- 出现 while SSL handshaking, client: xxx.xxx.xxx.xxx(无 upstream 字样)→ Nginx 当 HTTPS 服务端,被浏览器/App 连接时失败
方向错了,所有后续操作都是白忙。线上绝大多数 ERR_SSL_PROTOCOL_ERROR 属于后者,但很多人一上来就查代理配置,绕远路。
第二步:抓 OpenSSL 错误码,直击协议层原因
错误行末尾的十六进制码(如 error:1417A0C1)比文字更准。常见几类对应实际问题:
-
error:1417A0C1(no shared cipher)→ 客户端与 Nginx 没有共同支持的密码套件。例如你配了
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384';,但老 Android 或 IE11 根本不支持 ECDSA+AES256-GCM -
error:1417D18D(version too low)→ 客户端 TLS 版本低于 Nginx 允许的最低版本。比如你只开了
ssl_protocols TLSv1.2 TLSv1.3,而旧系统默认仅支持 TLSv1.0 -
error:1408F10B(wrong version number)→ 浏览器把 HTTP 请求发到了 HTTPS 端口(如直接访问 http://your.com:443),或 Nginx 配了
listen 443 ssl却没配证书路径,导致降级为纯 TCP 握手 -
tlsv1 alert unknown ca → 客户端不信任你的证书链,通常是中间证书缺失。用
openssl s_client -connect your.com:443 -showcerts查看是否能回溯到可信根
第三步:针对性验证与调整
根据前两步结论快速验证:
- 如果是 client: xxx 类错误:用
openssl s_client -connect your.com:443 -tls1_2 -servername your.com和-tls1_3分别测,确认 Nginx 实际协商出的协议和套件;检查证书文件是否按“域名证 + 中间证”顺序拼接(不能颠倒) - 确认私钥与证书真正匹配:
openssl x509 -noout -modulus -in cert.crt | openssl md5和openssl rsa -noout -modulus -in key.key | openssl md5输出必须完全一致 - 若需兼容旧客户端,放宽配置:明确加入 TLSv1.1、TLSv1.2,并保留 AES-CBC 类套件(如
ECDHE-RSA-AES128-SHA),避免过度收紧 - 临时开启 debug 日志定位细节:
error_log /var/log/nginx/ssl_debug.log debug;(需 Nginx 编译含 --with-debug)
第四步:检查基础配置硬性要求
这些写错会导致 Nginx 启动失败或静默降级,直接引发协议错误:
-
listen 443 ssl;必须成对出现ssl_certificate和ssl_certificate_key,路径要绝对且可读 - Nginx 1.15+ 不再支持
ssl on;这种写法,删掉,改用listen 443 ssl; - 确保已编译
http_ssl_module:运行nginx -V 2>&1 | grep with-http_ssl_module,无输出则模块缺失 - 证书文件必须是 PEM 格式,开头为
-----BEGIN CERTIFICATE-----,私钥为-----BEGIN RSA PRIVATE KEY-----或-----BEGIN PRIVATE KEY-----,无 BOM、无多余空行











