告警是什么
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 需要配置会话密钥才能解密告警,否则会得出「抓包看不到任何告警」的错误结论。
服务端与客户端见到的告警可能不同:一方发出的错误在另一方被记为不同的原因,排查时两端日志要一起看,别只信一侧的提示。