浏览器

ERR_SSL_VERSION_OR_CIPHER_MISMATCH 原因和服务器修法

作者: · 最后核实

报错信息ERR_SSL_VERSION_OR_CIPHER_MISMATCH

ERR_SSL_VERSION_OR_CIPHER_MISMATCH 的意思是:浏览器和服务器之间没有任何一个共同支持的 TLS 版本或加密套件,所以建立不了安全连接。 几乎都是服务器或 CDN 的配置问题:TLS 设置太旧,或者没有你访问的这个域名的证书。

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

外部检测只看到 TLS 1.0/1.1、弱套件或缺证书,是网站的问题;外部检测显示 TLS 1.2/1.3 正常,就查本地。用 SSL 检测 从外部看服务器支持哪些协议:

curl ssl.sh/example.com
  • 检测显示只有 TLS 1.0/1.1、只有弱套件,或者没有这个域名的证书:网站要修,访客这边没有安全的绕过办法。
  • 检测显示 TLS 1.2/1.3 正常:查本地。浏览器太旧、Windows 组策略禁用了 TLS 1.2、杀毒软件 HTTPS 扫描、公司代理,都可能导致协商失败。

原因

这个错误有 5 种原因,最常见的是服务器只支持 TLS 1.0 或 1.1。

1. 服务器只支持 TLS 1.0 或 1.1

常见于老旧网络设备、Windows Server 2008 上的老 IIS 和多年没动过的手写配置。确认方法:

openssl s_client -connect example.com:443 -servername example.com -tls1_2 </dev/null
openssl s_client -connect example.com:443 -servername example.com -tls1_3 </dev/null

两个都失败就要开启 TLS 1.2 和 1.3。另见 NET::ERR_SSL_OBSOLETE_VERSION。

2. CDN 或主机上没有这个域名的证书

CDN 节点收到一个它没有证书的 SNI 域名时,可能直接终止握手,Chrome 就报这个错。常见于刚加的子域名,或者通配符覆盖不到的二级子域名。在阿里云/腾讯云 CDN 控制台给这个加速域名单独配置 HTTPS 证书。

3. 只开了过时的加密套件

服务器只提供 RC4、3DES 或出口级套件,现代浏览器一个都不支持。用 加密套件查询 查具体套件,换成新的套件列表。

4. 证书类型和套件对不上

用的是 ECDSA 证书,却只开了 ECDHE-RSA-* 套件(或者反过来),就没有可用的组合。两类都加上,或者直接用新版 OpenSSL 的默认值。

5. 客户端限制了 TLS

Windows 组策略或注册表禁用了 TLS 1.2、浏览器太老、安全软件干扰,都会导致协商失败。升级浏览器,按微软文档检查 TLS 注册表设置。国内一些老版本的“双核浏览器”在兼容模式下用的是系统 IE 内核,也会受 Windows TLS 设置影响。

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

Chrome 内核的浏览器显示 ERR_SSL_VERSION_OR_CIPHER_MISMATCH,Firefox 按具体原因显示 SSL_ERROR_NO_CYPHER_OVERLAP 或 SSL_ERROR_UNSUPPORTED_VERSION。

浏览器 显示内容
Chrome / Edge / 360 极速模式 / QQ 浏览器 “此网站无法提供安全连接”“example.com 使用了不受支持的协议。”ERR_SSL_VERSION_OR_CIPHER_MISMATCH
Firefox SSL_ERROR_NO_CYPHER_OVERLAP 或 SSL_ERROR_UNSUPPORTED_VERSION
Safari Safari 无法建立安全连接
curl tlsv1 alert protocol version 或 sslv3 alert handshake failure

站长怎么修

修法是在服务器、CDN 和负载均衡上开启 TLS 1.2、TLS 1.3 和现代套件,并给每个域名绑定证书。

1. 开启 TLS 1.2、1.3 和现代套件。 Nginx:

ssl_protocols TLSv1.2 TLSv1.3;
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;
ssl_prefer_server_ciphers off;

宝塔面板在“网站 → 设置 → SSL”里可以勾选 TLS 版本,取消 TLSv1 和 TLSv1.1。阿里云/腾讯云 CDN 和负载均衡在 HTTPS 配置里选择 TLS 安全策略,挑只含 TLS 1.2 及以上的策略。TLS 配置生成器 能输出 Apache、HAProxy 等的等效配置。

2. Windows Server 按微软 TLS 注册表文档,在 HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 下启用 TLS 1.2 后重启。Windows Server 2012 R2 及以后默认就支持 TLS 1.2。

3. 每个域名都要有证书。 CDN、负载均衡上的每个域名都要绑定证书。

4. 复测。 curl ssl.sh/example.com 应当显示支持 TLS 1.2 和 1.3,并且证书有效。

常见问题

能在 Chrome 里重新打开 TLS 1.0,去访问老设备吗?

新版 Chrome 已经没有这个选项了。如果是你自己的老打印机、交换机、路由器,在可信的内网里用它的 HTTP 管理地址,或者升级固件。不要为了访问互联网上的网站去降低浏览器安全设置。

网站用了 CDN,加了个子域名之后就报这个错,为什么?

CDN 上很可能没有这个域名的证书,握手无法继续,浏览器就报版本或套件不匹配。给新域名签发或上传证书,注意 a.b.example.com 这种二级子域名不在 *.example.com 的覆盖范围内。

这个错误是不是说明网站被黑了?

不是。这是兼容性问题,不代表被入侵:要么网站的 TLS 设置太老,要么缺这个域名的证书。

资料来源

  1. Chromium net_error_list.h
  2. RFC 8996: Deprecating TLS 1.0 and TLS 1.1
  3. Microsoft Learn:TLS 注册表设置
  4. nginx ngx_http_ssl_module