Chrome报ERR_SSL_VERSION_OR_CIPHER_MISMATCH但Firefox可连接的问题咨询
TLS握手失败问题排查与解决
问题背景
连接自签名CA签发证书的本地服务器时,Chrome报错ERR_SSL_VERSION_OR_CIPHER_MISMATCH,服务器日志显示:
[2024-04-02T00:34:30.493881Z ERROR pingora_core::services::listening] Downstream handshake error TLSHandshakeFailure context: TLS accept() failed: error:0A000076:SSL routines:tls_choose_sigalg:no suitable signature algorithm:ssl/t1_lib.c:3725:
服务器证书关键信息:
- 签名算法:
ecdsa-with-SHA512 - 公钥算法:id-ecPublicKey(521位,secp521r1/P-521曲线)
对比Firefox(可正常连接)和Chrome的Client Hello消息,发现核心差异:Chrome发送的签名算法扩展(id=13)不含ECDSA/SECP521r1/SHA512的编码06 03,而Firefox包含该编码。
Chrome的Client Hello签名算法部分:
TLS client extension "signature algorithms" (id=13), len=18 0000 - 00 10 04 03 08 04 04 01-05 03 08 05 05 01 08 06 ................ 0010 - 06 01 ..
Firefox的Client Hello签名算法部分:
TLS client extension "signature algorithms" (id=13), len=24 0000 - 00 16 04 03 05 03 06 03-08 04 08 05 08 06 04 01 ................ 0010 - 05 01 06 01 02 03 02 01- ........
问题解答
1. 这是什么情况?Chrome不支持ecdsa-with-SHA512签名算法吗?
Chrome并非完全不支持ecdsa-with-SHA512,但它默认不包含针对secp521r1(P-521)曲线的SHA512签名算法组合。你的服务器证书使用的是secp521r1曲线+SHA512签名,Chrome的Client Hello里没有对应的匹配项,导致握手时双方找不到共同支持的签名算法,最终失败。
2. 如何查看Chrome支持哪些签名算法?
有两种实用方法:
- 日志排查法:在Chrome启动参数中添加
--ssl-version-max=tls1.3 --log-net-log=chrome_ssl_log.json,启动后访问任意HTTPS站点,然后在地址栏输入chrome://net-export/导入日志文件,查看Client Hello中的签名算法列表。 - 在线检测法:使用TLS握手检测类工具,查看Chrome作为客户端上报的签名算法集合。
3. 它不支持该算法是否有特定原因?
主要有两点:
- 性能与安全的平衡:P-521是NIST定义的最高级别椭圆曲线,SHA512也是高强度哈希算法,二者组合的计算开销远高于P-256/SHA256这类主流组合,而后者已能满足绝大多数场景的安全需求,Chrome默认不开启该组合以兼顾性能。
- 应用场景稀缺:目前使用P-521+SHA512组合的服务极少,Chrome团队认为默认支持的必要性不高,因此未将其纳入默认签名算法列表。
4. 有没有办法让Chrome能够正常连接该服务器?
有两种可行方案:
- 修改服务器证书(推荐):重新签发使用secp256r1(P-256)+SHA256或secp384r1(P-384)+SHA384组合的证书,这两种组合是Chrome默认支持的,既能保证安全,也能兼容所有主流浏览器。
- 修改Chrome启动参数:如果必须保留现有证书,可在Chrome快捷方式中添加启动参数
--ssl-signature-algorithms=ecdsa_secp521r1_sha512,ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256(可补充其他需要的算法),强制Chrome启用该算法组合。注意:此方法仅适合本地测试,不建议日常使用,会增加性能开销且可能带来不必要的安全暴露面。
内容的提问来源于stack exchange,提问作者DimanNe
相关产品推荐
相关产品推荐

