浏览器

ERR_SSL_PROTOCOL_ERROR:“此网站无法提供安全连接”怎么解决

作者: · 最后核实

报错信息ERR_SSL_PROTOCOL_ERROR

ERR_SSL_PROTOCOL_ERROR 的意思是:TLS 握手失败了,Chrome 收到的回应无法按 TLS 解析。 证书还没来得及检查。只有一个网站报,通常是服务器配置错;很多网站都报,多半是你电脑上或网络里有东西在干扰 HTTPS。

先判断是网站的问题还是你电脑的问题

外部检测也握手失败,是服务器的问题;外部检测正常,问题在你的电脑或网络。用 SSL 检测 从外部测一下:

curl ssl.sh/example.com
  • 检测也握手失败:服务器有问题,访客这边修不了,通知网站方。
  • 检测正常:问题在本地。依次试试:手机流量代替 Wi-Fi、无痕窗口(会禁用扩展)、暂停杀毒软件的 HTTPS 扫描。哪一步之后好了,原因就在哪。

原因

这个错误有 5 种原因,服务器端最常见的是 443 端口跑的是明文 HTTP。

1. 443 端口跑的是明文 HTTP

Nginx 写了 listen 443; 却没加 ssl,或者某个程序直接在 443 上跑 HTTP。Chrome 发出 ClientHello,收到的是一段 HTTP 响应。确认方法:

curl -sv http://example.com:443/ -o /dev/null 2>&1 | head -5

能拿到 HTTP 响应,就说明 443 没开 TLS。Firefox 遇到同样的问题会报 SSL_ERROR_RX_RECORD_TOO_LONG。

2. TLS 配置不完整或有错

证书文件不存在、私钥和证书不匹配、TLS 终止程序握手时崩溃,都可能返回乱码或直接断开。看服务器错误日志,并用下面的命令测:

openssl s_client -connect example.com:443 -servername example.com -brief

3. 代理、防火墙或杀毒软件干扰

开启 HTTPS 扫描的安全软件、老旧的公司代理和部分家用路由器会改写或截断 TLS 流量。关闭 HTTPS 扫描或换网络后恢复,就看 杀毒软件 HTTPS 扫描 和 公司 SSL 解密。

4. HSTS 把只支持 HTTP 的站强制升级成 HTTPS

域名曾经下发过 Strict-Transport-Security 头,Chrome 之后所有请求都会自动改成 HTTPS。如果某个测试环境或老系统只支持 HTTP,就会报这个错。正确做法是把 HTTPS 配好;如果是自己的开发域名,见 HSTS 报错。

5. 系统时间不对或浏览器太旧

很老的浏览器和新服务器协商不了,这种情况比较少见。升级浏览器、确认系统时间正确。

在各浏览器/系统上的样子

Chrome 内核的浏览器都显示 ERR_SSL_PROTOCOL_ERROR,Firefox、Safari 和 curl 对同一个故障各有说法。

浏览器 显示内容
Chrome / Edge / 360 极速模式 / QQ 浏览器 “此网站无法提供安全连接”“example.com 发送的响应无效。”ERR_SSL_PROTOCOL_ERROR
Firefox “建立安全连接失败”,代码 SSL_ERROR_RX_RECORD_TOO_LONG 或 PR_END_OF_FILE_ERROR
Safari Safari 无法建立安全连接
curl wrong version number 或 unexpected eof while reading

站长怎么修

站长要让 443 端口返回 TLS 握手,改完从外部复测。

1. 给 443 监听加上 ssl。 Nginx:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com;
    ssl_certificate     /etc/nginx/ssl/example.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
}

http2 on; 需要 Nginx 1.25.1 及以上,老版本写成 listen 443 ssl http2;。宝塔面板里开启 SSL 后会自动生成这段,手工改过配置文件的要检查有没有被覆盖。

2. 检查再重载。 先 nginx -t,没有报错再 systemctl reload nginx。

3. 协议只开 TLS 1.2 和 1.3。 TLS 配置生成器 能生成 Nginx、Apache 等的推荐配置。

4. 从外部复测。 curl ssl.sh/example.com 应该能看到握手完成、协商出的协议版本和证书链。用了阿里云/腾讯云 CDN 的,回源协议和回源端口也要对上:回源选 HTTPS 却回源到源站的 80 端口,同样会握手失败。

常见问题

本地开发时访问 localhost 出现 ERR_SSL_PROTOCOL_ERROR,怎么回事?

开发服务器跑的是 HTTP,浏览器却用 HTTPS 去连,可能是你输入了 https://,也可能是之前某次响应带了 HSTS 头,浏览器强制升级。明确访问 http://localhost:3000,或者让开发服务器开启 HTTPS。

清除 SSL 状态或浏览器缓存有用吗?

偶尔有用(比如缓存了旧的客户端证书或会话),但大多数情况是服务器或中间设备的问题。先用 curl ssl.sh/example.com 测网站,再考虑本地操作。

为了排查可以先关掉杀毒软件吗?

可以临时关,但只关它的 HTTPS 扫描/网页防护功能,并且只在可信网络里测试。测完重新打开;确认是它的原因就升级软件或调整设置。不要为了打开某一个网站直接卸载安全软件。

手机流量能打开,公司 Wi-Fi 打不开,为什么?

公司网络的防火墙或上网行为管理设备在干扰 TLS,比如不支持新版 TLS 或拦截了某个 IP。找网络管理员处理,见 公司 SSL 解密。

资料来源

  1. Chromium net_error_list.h
  2. Google Chrome 帮助:修正连接错误
  3. RFC 8446: TLS 1.3
  4. nginx ngx_http_ssl_module