首页/安全/加密与证书速查/套件协商失败排查
TLS 与 HTTPS60 条

套件协商失败排查

报 no shared cipher 或 handshake failure 说明客户端与服务端没有共同套件:TLS 1.2 用 -cipher 指定组合、TLS 1.3 用 -ciphersuites 指定,可分别验证版本与套件层面的交集。

加密与证书速查安全更新于 2026-10-13

套件协商失败排查

报 no shared cipher 或 handshake failure,说明客户端与服务端没有共同的套件或参数:TLS 1.2 用 -cipher 指定组合,TLS 1.3 用 -ciphersuites 指定,两者参数并不通用。排查顺序是先对齐协议版本交集,再对齐套件交集,最后检查证书与签名算法是否匹配。把这三个层次分开验证,比反复猜测配置要快得多。

基本信息

no shared cipherTLS 1.2 场景多见,检查服务端套件配置是否排除了客户端需要的组合
wrong version number对端可能是明文服务或协议栈不匹配
TLS 1.3 限制其套件由 -ciphersuites 指定,填入 -cipher 无效
provider 影响OpenSSL 3.x 中部分旧算法受 provider 控制,测试端与生产端可能不同
排查顺序版本交集 → 套件交集 → 证书与签名算法

典型使用场景

  • 客户端升级后无法连接服务端
  • 服务端套件白名单收窄后出现兼容问题
  • 排查「测试环境正常、生产失败」的配置差异
  • 与遗留客户端对接时的套件协商评估
  • 上线前用真实客户端套件组合做回归验证

分版本测试

分版本测试
openssl s_client -connect example.com:443 -servername example.com -tls1_2 -cipher 'ECDHE-RSA-AES128-GCM-SHA256' </dev/null 2>&1 | grep -iE 'cipher|alert'
openssl s_client -connect example.com:443 -servername example.com -tls1_3 -ciphersuites TLS_AES_128_GCM_SHA256 </dev/null 2>&1 | grep -iE 'cipher|alert'
# 查看服务端提供的套件列表
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>&1 | grep -A40 'Cipher Suites' | head -20

报错与含义

报错常见原因处理
no shared cipher套件无交集对齐白名单与客户端能力
handshake failure协议版本或参数不匹配先确认版本交集
wrong version number对端是明文或端口错误检查端口与协议
无法识别套件名参数位置用错按版本选择 -cipher 或 -ciphersuites
OpenSSL 3.x 中部分旧算法受 provider 控制:如果测试端与生产端的 provider 配置不同,就会出现「本机测试通过、线上失败」的情况。排查跨环境问题时,先把两边的版本与 provider 情况一起核对。
补充:可以用 openssl ciphers -v 与客户端工具输出的套件列表做集合比对,比人工逐条核对可靠得多。对必须支持的遗留客户端,建议把它的套件组合固化成回归用例,避免后续调整白名单时再次破坏兼容性。

易错点

  • 把 TLS 1.3 套件填入 -cipher 参数 → 该参数对 1.3 无效,测试结论完全错误
  • 只测默认套件 → 没有构造客户端实际使用的组合,问题在上线后才暴露
  • 忽略证书与签名算法的匹配 → 套件兼容但密钥类型不符,握手仍然失败
  • 跨环境排查不看 provider 配置 → 版本相同但算法可见性不同,结论互相矛盾

数据来源与参考

  • OpenSSL 官方文档(s_client -cipher / -ciphersuites)
  • RFC 8446 §9.1(TLS 1.3 套件)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌