跳到主要内容

4. 推荐的票据构造

本节描述一种推荐的票据格式与保护方式。请注意, 票据对客户端是不透明的, 因此其结构不涉及互操作性问题, 实现可以偏离该格式。如果实现确实偏离该格式, 它们必须严肃对待安全问题。客户端 不得 (MUST NOT) 在假定票据符合本文档的前提下检查该票据。

服务器使用两个不同的密钥: 一个 128 位密钥用于采用密码分组链接 (Cipher Block Chaining, CBC) 模式 [CBC] 的高级加密标准 (Advanced Encryption Standard, AES) [AES] 加密, 另一个 256 位密钥用于 HMAC-SHA-256 [RFC4634]。

票据的结构如下:

   struct {
opaque key_name[16];
opaque iv[16];
opaque encrypted_state<0..2^16-1>;
opaque mac[32];
} ticket;

这里, key_name 用于标识用于保护该票据的某一组密钥。它使服务器能够容易地识别出它自己签发的票据。key_name 应当是随机生成的, 以避免不同服务器之间的冲突。一种做法是每次服务器启动时都生成新的随机密钥和 key_name。

encrypted_state 中实际的状态信息使用 128 位 AES 在 CBC 模式下、以给定的 IV 加密。消息认证码 (Message Authentication Code, MAC) 使用 HMAC-SHA-256 计算, 计算范围是 key_name (16 个八位组) 和 IV (16 个八位组), 其后是 encrypted_state 字段的长度 (2 个八位组) 及其内容 (可变长度)。

   struct {
ProtocolVersion protocol_version;
CipherSuite cipher_suite;
CompressionMethod compression_method;
opaque master_secret[48];
ClientIdentity client_identity;
uint32 timestamp;
} StatePlaintext;
   enum {
anonymous(0),
certificate_based(1),
psk(2)
} ClientAuthenticationType;
   struct {
ClientAuthenticationType client_authentication_type;
select (ClientAuthenticationType) {
case anonymous: struct {};
case certificate_based:
ASN.1Cert certificate_list<0..2^24-1>;
case psk:
opaque psk_identity<0..2^16-1>; /* from [RFC4279] */
};
} ClientIdentity;

StatePlaintext 结构存储 TLS 会话状态, 其中包括 master_secret。该结构中的 timestamp 使 TLS 服务器能够让票据过期。为了覆盖 TLS 提供的认证与密钥交换协议, ClientIdentity 结构包含客户端在初始交换中使用的认证类型 (见 ClientAuthenticationType)。为了向 TLS 服务器提供与原有认证和授权相同的能力, 在基于公钥认证的情况下会包含一个证书列表。因此 TLS 服务器能够检查这些证书中的多种不同属性。具体实现可以选择只存储这些信息的一个子集, 或者存储附加信息。其他认证机制 (例如 Kerberos [RFC2712]) 将需要不同的客户端身份数据。其他 TLS 扩展可能要求在 StatePlaintext 结构中包含附加数据。