在 TLS 协议通信过程中,当发生错误或需要通知对方某些情况时,Alert Protocol(告警协议) 就会发挥作用。理解告警协议有助于排查 TLS 连接问题和进行安全调试。

什么是 TLS Alert Protocol

TLS Alert Protocol是 TLS 记录层的子协议之一,用于在 TLS 会话中传递告警信息。这些告警可以是:

  • 警告(Warning):告知对方注意某些情况,但不会中断连接
  • 致命错误(Fatal):导致连接立即关闭

告警消息通常在以下场景出现:

  • 证书验证失败
  • 握手过程出错
  • 加密操作异常
  • 协议版本不兼容

告警消息格式

每个告警消息包含两个字段:

字段 长度 说明
Alert Level 1 字节 1 = Warning,2 = Fatal
Alert Description 1 字节 具体告警类型的编号
1
2
3
4
+----------------+----------------+
| Alert Level    | Alert Descr    |
| (1 byte)       | (1 byte)       |
+----------------+----------------+

告警级别

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 警告:

1
2
# 使用 openssl s_client 查看证书过期告警
echo | openssl s_client -connect expired.badssl.com:443 2>&1 | grep -A5 "Alert"

2. 自签名证书

使用自签名证书时,可能触发 unknown_ca 告警:

1
2
# 连接到使用自签名证书的服务器
echo | openssl s_client -connect self-signed.example.com:443 -CAfile /dev/null 2>&1

3. 协议版本不兼容

当客户端与服务器支持的 TLS 版本不匹配时,会收到 protocol_version 告警:

1
2
# 强制使用 TLS 1.0 连接(很多服务器已废弃)
echo | openssl s_client -tls1 -connect modern-server.com:443 2>&1

4. 证书链不完整

服务器配置不完整时,可能触发 bad_certificate 告警:

1
2
# 检查证书链
openssl s_client -showcerts -connect example.com:443 </dev/null

使用 OpenSSL 调试告警

启用详细输出

1
2
# 加上 -debug 参数查看详细 TLS 交互
openssl s_client -debug -connect example.com:443 </dev/null

查看告警信息

1
2
# 连接并捕获告警信息
openssl s_client -connect example.com:443 2>&1 | grep -i "alert\|warning\|error"

模拟各种告警场景

1
2
3
4
5
6
7
8
# 模拟过期证书(使用测试网站)
echo | openssl s_client -connect expired.badssl.com:443 2>&1

# 模拟自签名证书
echo | openssl s_client -connect self-signed.badssl.com:443 2>&1

# 模拟证书链问题
echo | openssl s_client -connect untrusted-root.badssl.com:443 2>&1

告警代码一览

代码 名称 级别 说明
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:检查连接和告警

1
openssl s_client -connect example.com:443 -servername example.com 2>&1

步骤 2:查找告警信息

在输出中搜索 “Alert” 或告警描述:

1
openssl s_client -connect example.com:443 2>&1 | grep -E "Alert|warning|error"

步骤 3:根据告警处理

  • certificate_expired → 续期服务器证书
  • unknown_ca → 更新 CA 证书或检查证书链
  • protocol_version → 升级 TLS 版本或配置
  • handshake_failure → 检查加密套件支持

总结

TLS Alert Protocol 是 TLS 协议中重要的通信机制,通过告警消息,双方可以:

  • 识别连接问题
  • 理解错误原因
  • 采取相应措施

在实际工作中,遇到 TLS 连接问题时,关注告警信息可以快速定位问题根源。无论是证书配置、协议兼容还是加密套件问题,告警协议都会给出明确的提示。


参考来源