2. 授权扩展类型 (Authorization Extension Types)
通用扩展机制使客户端和服务器能够协商是否使用特定扩展, 以及如何使用特定扩展. 如 [TLS1.2] 所规定, 为方便起见, 这里重复给出 extended client hello 消息和 extended server hello 消息中使用的扩展格式:
struct {
ExtensionType extension_type;
opaque extension_data<0..2^16-1>;
} Extension;
extension_type 标识特定扩展类型, extension_data 包含特定于该扩展类型的信息. 本文档规定两个新扩展类型的使用: client_authz 和 server_authz. 这些扩展类型分别在第 2.1 节和第 2.2 节中描述. 本规范向 ExtensionType 添加两个新类型:
enum {
client_authz(7), server_authz(8), (65535)
} ExtensionType;
授权扩展与 TLS session 建立过程相关, 除非对应的 client hello 消息中出现了相同扩展类型, 否则这些扩展类型不得出现在 extended server hello 消息中. 除非客户端准备好接受来自服务器的关联授权信息, 否则客户端不得在 extended client hello 消息中发送这些扩展类型. 如果客户端发送 client_authz 扩展, 则客户端也必须发送 server_authz 扩展.
服务器必须检查 client hello 消息中的 client_authz 和 server_authz 扩展, 并且必须针对每个双方共同支持的授权数据类型响应扩展. 服务器不得只响应 client_authz 扩展而不同时响应 server_authz 扩展, 反之亦然.
2.1. client_authz 和 server_authz 扩展 (The client_authz and server_authz Extensions)
为了向 TLS 服务器提供授权信息, 客户端可以在 extended client hello 消息中包含类型为 "client_authz" 的扩展. 为了从 TLS 服务器请求授权信息, 客户端可以在 extended client hello 消息中包含类型为 "server_authz" 的扩展. 每个这类扩展的 "extension_data" 字段必须包含如下所述的 ClientAuthzFormatList:
struct {
AuthorizationDataFormat authz_format_list<1..2^8-1>;
} ClientAuthzFormatList;
AuthorizationDataFormat 类型用于描述 SupplementalData 消息中的授权信息. AuthorizationDataFormat 类型定义如下:
enum {
x509_attr_cert(0), saml_assertion(1),
x509_attr_cert_url(2), saml_assertion_url(3), (255)
} AuthorizationDataFormat;
certificate 和 certificate URL 授权数据类型必须伴随授权服务器的 URL 位置. certificate 和 certificate URL 类型以及授权服务器 URL 允许由第三方作出授权决策, 该第三方可以独立于 TLS 客户端和 TLS 服务器.
authz_format_list 的含义如下:
-
x509_attr_cert 表示客户端授权信息是 X.509 attribute certificate (AC) [ATTRCERT].
-
saml_assertion 表示授权信息是 SAML assertion [SAML1.1] [SAML2.0].
-
x509_attr_cert_url 表示授权信息是以 URI [HTTP] 形式提供的 X.509 attribute certificate (AC) [ATTRCERT].
-
saml_assertion_url 表示授权信息是以 URI [HTTP] 形式提供的 SAML assertion [SAML1.1] [SAML2.0].
授权数据承载在 SupplementalData 消息 [TLSSUPP] 中. 客户端和服务器根据 extended client hello 消息和 extended server hello 消息中的 ClientAuthzFormatList 与 ServerAuthzFormatList, 知道正在使用哪些 SupplementalData 消息. ClientAuthzFormatList 和 ServerAuthzFormatList 中每种授权格式的数据必须按相同顺序包含在 SupplementalData 消息中.
2.2. Client Hello
这里给出 TLS client hello 的格式, 以展示授权扩展的位置. client hello 消息的完整规范可见 [TLS1.0], [TLS1.1] 和 [TLS1.2].
为了向 TLS 服务器指示对授权信息的支持, 客户端可以在 extended client hello 消息中包含 client_authz 和 server_authz 扩展中的一个或两个.
当客户端包含 client_authz 扩展时, 它指示客户端准备向服务器提供的一组授权数据类型 (承载在 SupplementalData handshake message [TLSSUPP] 中).
当客户端包含 server_authz 扩展时, 它指示客户端准备从服务器接收的一组授权数据类型 (承载在 SupplementalData handshake message [TLSSUPP] 中).
如果客户端正在发起 session resumption, 则必须从 client hello 消息中省略 client_authz 和 server_authz 扩展.
extended client hello 消息的一般结构在 [TLSEXT2] 中定义, 为清晰起见在此重现:
struct {
ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..2^16-2>;
CompressionMethod compression_methods<1..2^8-1>;
select (extensions_present) {
case false:
struct {};
case true:
Extension extensions<0..2^16-1>;
};
} ClientHello;