首页/网络/协议速查/TLS 告警(Alert)协议

TLS 告警(Alert)协议

连接级信号:close_notify 正常关闭,handshake_failure 参数不兼容,bad_certificate/certificate_expired/unknown_ca 是证书类错误。

协议速查网络更新于 2026-10-13

告警是什么

TLS 告警是连接级信号通道,双方用它传达「要关闭连接」或「某个环节出错」。它不只用于报错,还承担一个安全职责:close_notify 用来防止截断攻击——没有它,接收方无法分辨「对方说完了」和「对方被攻击者掐断了」(RFC 8446 §6)。

读懂错误类告警

错误类告警里,handshake_failure 表示两端参数没有交集;bad_certificate、certificate_expired、unknown_ca 都指向证书;protocol_version 表示版本被对端拒绝;internal_error 往往是实现层的兼容缺陷。看到证书类告警,先查链是否完整、是否过期,再看名字是否匹配。

基本信息

名称TLS Alert 协议
规范RFC 8446 §6(TLS 1.2 与 1.3 共用同一套语义)
关闭语义正常关闭需发送 close_notify,而不只是断开 TCP
错误类告警handshake_failure、bad_certificate、certificate_expired、unknown_ca、protocol_version、internal_error

典型使用场景

  • 区分「握手失败」与「连不上」:前者是参数问题,后者是网络问题
  • 排查证书链不完整引起的 unknown_ca
  • 确认服务端是否拒绝某个 TLS 版本
  • 检查服务端是否正确发送了 close_notify

观察告警

观察告警
openssl s_client -connect example.com:443 -state </dev/null 2>&1 | tail -20        # 看握手与告警
openssl s_client -tls1_1 -connect example.com:443 </dev/null 2>&1 | grep -i alert    # 试探版本支持
openssl s_client -connect example.com:443 -showcerts </dev/null 2>/dev/null | grep -c 'BEGIN CERTIFICATE'   # 数证书链长度

常见告警

告警含义常见原因
close_notify(0)正常关闭应用主动收尾
handshake_failure(40)无法协商参数协议或套件没有交集
bad_certificate(42)证书无效格式或签名问题
certificate_expired(45)证书过期续期失败
unknown_ca(48)证书链无法验证缺少中间证书或自签证书
protocol_version(70)版本不支持服务端只允许更高版本
internal_error(80)实现内部错误兼容性缺陷
TLS 1.3 中关闭连接不能只靠断开 TCP,必须发送 close_notify 以抵御截断攻击;不少客户端在缺失该告警时会直接报错。
抓到 TLS 1.3 的加密握手后,Wireshark 需要配置会话密钥才能解密告警,否则会得出「抓包看不到任何告警」的错误结论。
服务端与客户端见到的告警可能不同:一方发出的错误在另一方被记为不同的原因,排查时两端日志要一起看,别只信一侧的提示。

易错点

  • 有些服务器不回 close_notify 就直接断开 TCP:部分语言客户端会抛 EOF 类异常,容易误判为程序缺陷
  • 把告警当网络故障排查:handshake_failure 多数只是参数不匹配,网络层抓包看不出任何异常
  • 遇到 unknown_ca 只查根证书:多数情况是服务端没有下发中间证书
  • 只改服务端版本而不更新客户端:告警从版本不支持变成握手失败,问题依旧
  • 证书类告警只看服务端日志:客户端侧的具体告警码往往更直接

数据来源与参考

  • RFC 8446 §6(告警协议)
  • RFC 8446 §6.1

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌