6. Alert Protocol (警报协议)
TLS提供警报内容类型来指示关闭信息和错误。与其他消息一样,警报消息按照当前连接状态指定的方式加密。
警报消息传达警报的描述和在TLS先前版本中传达消息严重性级别的旧字段。警报分为两类:关闭警报和错误警报。在TLS 1.3中,严重性隐含在正在发送的警报类型中,"level"字段可以安全地忽略。"close_notify"警报用于指示连接一个方向的有序关闭。在接收到这样的警报时,TLS实现应该 (SHOULD) 向应用程序指示数据结束。
错误警报指示连接的中止关闭(参见第6.2节)。在接收到错误警报时,TLS实现应该 (SHOULD) 向应用程序指示错误,并且不得 (MUST NOT) 允许在连接上发送或接收任何进一步的数据。服务器和客户端必须 (MUST) 忘记在失败连接中建立的秘密值和密钥,但与会话票据关联的PSK除外,如果可能的话应该 (SHOULD) 丢弃。
第6.2节中列出的所有警报必须 (MUST) 以AlertLevel=fatal发送,并且在接收时必须 (MUST) 作为错误警报处理,无论消息中的AlertLevel如何。未知的警报类型必须 (MUST) 作为错误警报处理。
注意:TLS定义了两个通用警报(参见第6节),用于在无法解析消息时使用。接收到无法根据语法解析的消息(例如,长度超出消息边界或包含超出范围的长度)的对等体必须 (MUST) 使用"decode_error"警报终止连接。接收到语法正确但语义无效的消息(例如,p-1的DHE共享,或无效的枚举)的对等体必须 (MUST) 使用"illegal_parameter"警报终止连接。
enum { warning(1), fatal(2), (255) } AlertLevel;
enum {
close_notify(0),
unexpected_message(10),
bad_record_mac(20),
record_overflow(22),
handshake_failure(40),
bad_certificate(42),
unsupported_certificate(43),
certificate_revoked(44),
certificate_expired(45),
certificate_unknown(46),
illegal_parameter(47),
unknown_ca(48),
access_denied(49),
decode_error(50),
decrypt_error(51),
protocol_version(70),
insufficient_security(71),
internal_error(80),
inappropriate_fallback(86),
user_canceled(90),
missing_extension(109),
unsupported_extension(110),
unrecognized_name(112),
bad_certificate_status_response(113),
unknown_psk_identity(115),
certificate_required(116),
no_application_protocol(120),
(255)
} AlertDescription;
struct {
AlertLevel level;
AlertDescription description;
} Alert;
6.1. Closure Alerts (关闭警报)
客户端和服务器必须共享连接正在结束的知识,以避免截断攻击。
close_notify: 此警报通知接收者发送者不会在此连接上发送任何更多消息。在接收到关闭警报后接收到的任何数据必须 (MUST) 被忽略。
user_canceled: 此警报通知接收者发送者由于与协议失败无关的某些原因正在取消握手。如果用户在握手完成后取消操作,只需通过发送"close_notify"关闭连接更合适。此警报应该 (SHOULD) 后跟"close_notify"。此警报通常具有AlertLevel=warning。
任何一方都可以 (MAY) 通过发送"close_notify"警报来启动其连接写入侧的关闭。在接收到关闭警报后接收到的任何数据必须 (MUST) 被忽略。如果在"close_notify"之前接收到传输层关闭,接收者无法知道发送的所有数据是否已被接收。
每一方必须 (MUST) 在关闭其连接的写入侧之前发送"close_notify"警报,除非它已经发送了某些错误警报。这对其连接的读取侧没有任何影响。请注意,这与TLS 1.3之前的TLS版本不同,在TLS 1.3之前的版本中,实现被要求通过丢弃挂起的写入并发送自己的立即"close_notify"警报来对"close_notify"做出反应。该先前要求可能导致读取侧的截断。双方不需要在关闭其连接的读取侧之前等待接收"close_notify"警报,尽管这样做会引入截断的可能性。
如果使用TLS的应用协议规定在TLS连接关闭后可以在底层传输上承载任何数据,则TLS实现必须 (MUST) 在向应用层指示数据结束之前接收"close_notify"警报。本标准的任何部分都不应被解释为规定TLS使用配置文件管理其数据传输的方式,包括何时打开或关闭连接。
注意:假设关闭连接的写入侧在销毁传输之前可靠地传递挂起的数据。
6.2. Error Alerts (错误警报)
TLS中的错误处理非常简单。当检测到错误时,检测方向其对等体发送消息。在传输或接收致命警报消息时,双方必须 (MUST) 立即关闭连接。
每当实现遇到致命错误条件时,它应该 (SHOULD) 发送适当的致命警报,并且必须 (MUST) 在不发送或接收任何其他数据的情况下关闭连接。在本规范的其余部分,当使用短语"终止连接"和"中止握手"而没有特定警报时,意味着实现应该 (SHOULD) 发送下面描述指示的警报。短语"使用X警报终止连接"和"使用X警报中止握手"意味着如果实现发送任何警报,则必须 (MUST) 发送警报X。本节中下面定义的所有警报以及所有未知警报,从TLS 1.3开始都被普遍认为是致命的(参见第6节)。实现应该 (SHOULD) 提供一种方法来促进警报的发送和接收的日志记录。
以下错误警报已定义:
unexpected_message: 接收到不适当的消息(例如,错误的握手消息、过早的应用数据等)。在正确实现之间的通信中不应观察到此警报。
bad_record_mac: 如果接收到无法解保护的记录,则返回此警报。因为AEAD算法结合了解密和验证,并且为了避免侧信道攻击,此警报用于所有解保护失败。在正确实现之间的通信中不应观察到此警报,除非消息在网络中损坏。
record_overflow: 接收到长度超过2^14 + 256字节的TLSCiphertext记录,或解密为长度超过2^14字节(或某些其他协商限制)的TLSPlaintext记录。在正确实现之间的通信中不应观察到此警报,除非消息在网络中损坏。
handshake_failure: 接收到"handshake_failure"警报消息表示发送者无法在给定可用选项的情况下协商可接受的安全参数集。
bad_certificate: 证书已损坏、包含未正确验证的签名等。
unsupported_certificate: 证书是不受支持的类型。
certificate_revoked: 证书已被其签名者吊销。
certificate_expired: 证书已过期或当前无效。
certificate_unknown: 在处理证书时出现一些其他(未指定的)问题,使其不可接受。
illegal_parameter: 握手中的字段不正确或与其他字段不一致。此警报用于符合正式协议语法但在其他方面不正确的错误。
unknown_ca: 接收到有效的证书链或部分链,但证书未被接受,因为无法定位CA证书或无法与已知信任锚匹配。
access_denied: 接收到有效的证书或PSK,但在应用访问控制时,发送者决定不继续协商。
decode_error: 无法解码消息,因为某些字段超出指定范围或消息的长度不正确。此警报用于消息不符合正式协议语法的错误。在正确实现之间的通信中不应观察到此警报,除非消息在网络中损坏。
decrypt_error: 握手(非记录层)密码操作失败,包括无法正确验证签名或验证Finished消息或PSK绑定器。
protocol_version: 对等体尝试协商的协议版本已被识别但不受支持(参见附录D)。
insufficient_security: 当协商失败,特别是因为服务器需要比客户端支持的参数更安全的参数时,返回此警报而不是"handshake_failure"。
internal_error: 与对等体或协议正确性无关的内部错误(例如内存分配失败)使得无法继续。
inappropriate_fallback: 由服务器响应来自客户端的无效连接重试尝试而发送(参见[RFC7507])。
missing_extension: 由接收到不包含对于所提供的TLS版本或其他协商参数必须发送的扩展的握手消息的端点发送。
unsupported_extension: 由接收到包含已知禁止包含在给定握手消息中的扩展的任何握手消息的端点发送,或在ServerHello或Certificate中包含未首先在相应的ClientHello或CertificateRequest中提供的任何扩展的端点发送。
unrecognized_name: 当客户端通过"server_name"扩展提供的名称标识的服务器不存在时,由服务器发送(参见[RFC6066])。
bad_certificate_status_response: 当服务器通过"status_request"扩展提供无效或不可接受的OCSP响应时,由客户端发送(参见[RFC6066])。
unknown_psk_identity: 当需要PSK密钥建立但客户端未提供可接受的PSK身份时,由服务器发送。发送此警报是可选的 (OPTIONAL);服务器可以 (MAY) 选择发送"decrypt_error"警报以仅指示无效的PSK身份。
certificate_required: 当需要客户端证书但客户端未提供时,由服务器发送。
no_application_protocol: 当客户端"application_layer_protocol_negotiation"扩展仅公布服务器不支持的协议时,由服务器发送(参见[RFC7301])。
新的警报值由IANA分配,如第11节所述。
🎯 第6章完成度: 100%
已完成:
- ✅ 6.1 Closure Alerts
- ✅ 6.2 Error Alerts
覆盖内容:
- ✅ 警报协议基础
- ✅ 30+个警报类型
- ✅ 关闭和错误处理