1. 引言 (Introduction)
Transport Layer Security (TLS) 协议 ([TLS1.0], [TLS1.1], [TLS1.2]) 正在越来越多种运行环境中使用, 其中包括 TLS 最初设计时未曾设想的环境. 本文档引入的扩展旨在使 TLS 能够在这样一种环境中运行: 在交换任何受保护数据之前, 客户端和服务器之间需要交换授权信息. 当多个应用协议可以使用同一授权信息时, 使用这些 TLS authorization extension 尤其有吸引力.
这些扩展所承载的授权信息格式和内容都是可扩展的. 本文档引用 Security Assertion Markup Language (SAML) assertion ([SAML1.1], [SAML2.0]) 和 X.509 attribute certificate (AC) [ATTRCERT] 授权格式, 但也可以使用其他格式. 未来的授权扩展可以包含任何由受信任签发者进行数字签名的不透明 assertion. 鉴于其与认证路径验证的相似性, 本文档建议使用与证书处理相关的 TLS Alert 消息来报告授权信息处理失败.
当 identification, authentication 和 authorization 信息都在 TLS 内处理时, 可以将这些信息直接绑定到加密会话. 如果每个应用都需要唯一的授权信息, 那么最好在受 TLS 保护的应用协议内承载该信息. 然而, 当 identification, authentication 和 authorization 信息在不同协议层处理时, 必须谨慎确保适当的绑定.
本文档描述 TLS 1.0, TLS 1.1 和 TLS 1.2 中 TLS Handshake Protocol 的授权扩展. 这些扩展遵循 TLS extension 的约定, 这些约定最初在 [TLSEXT1] 中定义, 并在 [TLSEXT2] 中修订; TLS extension 现在是 TLS 1.2 [TLS1.2] 的一部分. TLS extension 使用 client hello 消息和 server hello 消息的一般扩展机制. 本文档描述的扩展用于确认客户端和服务器都支持所需的授权数据类型. 随后, 如果支持, 授权信息将在 supplemental data handshake message [TLSSUPP] 中交换.
授权扩展可以与 TLS 1.0, TLS 1.1 和 TLS 1.2 结合使用. 这些扩展被设计为向后兼容, 这意味着只有当客户端在 client hello 消息中指示支持某种授权信息类型, 并且服务器在 server hello 消息中也指示支持该类型时, handshake protocol supplemental data message 才会包含该特定类型的授权信息.
客户端通常知道正在建立的 TLS session 的上下文; 因此, 客户端可以在需要时使用授权扩展. 服务器必须接受扩展的 client hello 消息, 即使服务器并不 "understand" 列出的所有扩展. 但是, 服务器不会指示支持这些 "not understood" 扩展. 随后, 客户端可以拒绝与不支持授权扩展的服务器通信.
1.1. 约定 (Conventions)
授权消息的语法使用 TLS Presentation Language 定义, 该语言在 [TLS1.0] 第 4 节中规定.
本文档中的关键词 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 和 "OPTIONAL" 应按 RFC 2119 [STDWORDS] 中的描述解释.
1.2. 概览 (Overview)
图 1 展示了完整 TLS handshake 中授权扩展和 supplemental data message 的位置.
ClientHello 消息包含对所支持客户端授权数据格式的指示, 以及对所支持服务器授权数据格式的指示. ServerHello 消息包含类似指示, 但不包含服务器不支持的任何授权数据格式. 客户端和服务器都必须指示对授权数据类型的支持. 如果双方共同支持的授权数据格式列表为空, 则 ServerHello 消息完全不得携带受影响的扩展.
成功的 session resumption 使用与原始 session 相同的授权信息.
Client Server
ClientHello (w/ extensions) -------->
ServerHello (w/ extensions)
SupplementalData*
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
SupplementalData*
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
* Indicates optional or situation-dependent messages that
are not always sent.
[] Indicates that ChangeCipherSpec is an independent TLS
protocol content type; it is not actually a TLS
handshake message.
Figure 1. Authorization Data Exchange in Full TLS Handshake