在 TLS 协议通信过程中,当发生错误或需要通知对方某些情况时,Alert Protocol(告警协议) 就会发挥作用。理解告警协议有助于排查 TLS 连接问题和进行安全调试。
什么是 TLS Alert Protocol
TLS Alert Protocol是 TLS 记录层的子协议之一,用于在 TLS 会话中传递告警信息。这些告警可以是:
- 警告(Warning):告知对方注意某些情况,但不会中断连接
- 致命错误(Fatal):导致连接立即关闭
告警消息通常在以下场景出现:
- 证书验证失败
- 握手过程出错
- 加密操作异常
- 协议版本不兼容
告警消息格式
每个告警消息包含两个字段:
| 字段 | 长度 | 说明 |
|---|---|---|
| Alert Level | 1 字节 | 1 = Warning,2 = Fatal |
| Alert Description | 1 字节 | 具体告警类型的编号 |
|
|
告警级别
Warning(警告)
警告级别告警不会终止连接,但可能影响后续通信。常见警告包括:
- close_notify:正常关闭通知
- no_certificate:无可用证书
- bad_certificate:证书格式有问题
- unsupported_certificate:不支持的证书类型
- certificate_revoked:证书已吊销
- certificate_expired:证书已过期
- certificate_unknown:证书未知
Fatal(致命)
致命告警会导致连接立即关闭。常见致命告警包括:
- unexpected_message:收到无效消息
- bad_record_mac:MAC 校验失败
- decryption_failed:解密失败
- record_overflow:记录长度超限
- decompression_failure:解压失败
- handshake_failure:握手失败
- illegal_parameter:参数非法
- unknown_ca:无法找到可信 CA
- access_denied:访问被拒绝
- decode_error:数据解码错误
- decrypt_error:加解密错误
- protocol_version:协议版本不支持
- insufficient_security:安全参数不足
- internal_error:内部错误
常见告警场景与排查
1. 证书过期
当服务器证书过期时,通常会收到 certificate_expired 警告:
|
|
2. 自签名证书
使用自签名证书时,可能触发 unknown_ca 告警:
|
|
3. 协议版本不兼容
当客户端与服务器支持的 TLS 版本不匹配时,会收到 protocol_version 告警:
|
|
4. 证书链不完整
服务器配置不完整时,可能触发 bad_certificate 告警:
|
|
使用 OpenSSL 调试告警
启用详细输出
|
|
查看告警信息
|
|
模拟各种告警场景
|
|
告警代码一览
| 代码 | 名称 | 级别 | 说明 |
|---|---|---|---|
| 0 | close_notify | Warning | 正常关闭 |
| 10 | unexpected_message | Fatal | 无效消息 |
| 20 | bad_record_mac | Fatal | MAC 错误 |
| 21 | decryption_failed | Fatal | 解密失败 |
| 22 | record_overflow | Fatal | 记录溢出 |
| 30 | decompression_failure | Fatal | 解压失败 |
| 40 | handshake_failure | Fatal | 握手失败 |
| 41 | no_certificate | Warning | 无证书 |
| 42 | bad_certificate | Warning/Fatal | 证书错误 |
| 43 | unsupported_certificate | Warning | 不支持的证书 |
| 44 | certificate_revoked | Warning | 证书已吊销 |
| 45 | certificate_expired | Warning | 证书过期 |
| 46 | certificate_unknown | Warning | 证书未知 |
| 47 | illegal_parameter | Fatal | 非法参数 |
| 48 | unknown_ca | Fatal | 未知 CA |
| 49 | access_denied | Fatal | 访问被拒 |
| 50 | decode_error | Fatal | 解码错误 |
| 51 | decrypt_error | Fatal | 解密错误 |
| 60 | export_restriction | Fatal | 导出限制 |
| 70 | protocol_version | Fatal | 协议版本 |
| 71 | insufficient_security | Fatal | 安全不足 |
| 80 | internal_error | Fatal | 内部错误 |
| 90 | user_canceled | Warning | 用户取消 |
| 100 | no_renegotiation | Warning | 不允许重协商 |
实际案例:排查 TLS 连接失败
假设你遇到 HTTPS 连接失败,可以通过以下步骤排查:
步骤 1:检查连接和告警
|
|
步骤 2:查找告警信息
在输出中搜索 “Alert” 或告警描述:
|
|
步骤 3:根据告警处理
- certificate_expired → 续期服务器证书
- unknown_ca → 更新 CA 证书或检查证书链
- protocol_version → 升级 TLS 版本或配置
- handshake_failure → 检查加密套件支持
总结
TLS Alert Protocol 是 TLS 协议中重要的通信机制,通过告警消息,双方可以:
- 识别连接问题
- 理解错误原因
- 采取相应措施
在实际工作中,遇到 TLS 连接问题时,关注告警信息可以快速定位问题根源。无论是证书配置、协议兼容还是加密套件问题,告警协议都会给出明确的提示。
参考来源