5.5. 客户端/服务器 (CS) 消息规范
5.5. Client/Server (CS) Message Specifications
本节规定了客户端向应用服务器进行认证时所使用的消息格式。
5.5.1. KRB_AP_REQ 定义
KRB_AP_REQ 消息包含 Kerberos 协议版本号、消息类型 KRB_AP_REQ、一个用于指示所用选项的 options 字段,以及票据和认证头部(Authenticator)本身。KRB_AP_REQ 消息通常被称为"认证头部(authentication header)"。
AP-REQ ::= [APPLICATION 14] SEQUENCE {
pvno [0] INTEGER (5),
msg-type [1] INTEGER (14),
ap-options [2] APOptions,
ticket [3] Ticket,
authenticator [4] EncryptedData -- Authenticator
}
APOptions ::= KerberosFlags
-- reserved(0),
-- use-session-key(1),
-- mutual-required(2)
pvno 和 msg-type
这些字段已在第 5.4.1 节中描述。msg-type 为 KRB_AP_REQ。
ap-options
此字段出现在应用请求(KRB_AP_REQ)中,并影响请求的处理方式。它是一个位域,所选选项通过将对应位设为 1 来表示,未选中的选项以及保留字段则被重置为 0。各比特的编码在第 5.2 节中规定。各选项的含义如下:
| 比特 | 名称 | 描述 |
|---|---|---|
| 0 | reserved | 保留,供本字段未来扩展使用。 |
| 1 | use-session-key | USE-SESSION-KEY 选项指示:客户端提交给服务器的票据,是使用服务器 TGT 中的会话密钥加密的。当未指定此选项时,票据使用服务器的密钥加密。 |
| 2 | mutual-required | MUTUAL-REQUIRED 选项告知服务器:客户端要求双向认证,服务器必须以一条 KRB_AP_REP 消息作出响应。 |
| 3-31 | reserved | 保留,供未来使用。 |
ticket
此字段是一张向服务器认证客户端的票据。
authenticator
此字段包含加密后的认证头部,其中包括客户端所选的子会话密钥(subkey)。
加密后的认证头部包含在 AP-REQ 中;它向服务器证明发送方近期知晓随附票据中的加密密钥,从而帮助服务器检测重放。它还有助于选择用于该特定会话的"真实会话密钥"。以下内容的 DER 编码使用票据的会话密钥加密,在正常应用交换中的密钥用途值为 11,在用作 TGS-REQ 交换的 PA-TGS-REQ PA-DATA 字段时为 7(见第 5.4.1 节):
-- Unencrypted authenticator
Authenticator ::= [APPLICATION 2] SEQUENCE {
authenticator-vno [0] INTEGER (5),
crealm [1] Realm,
cname [2] PrincipalName,
cksum [3] Checksum OPTIONAL,
cusec [4] Microseconds,
ctime [5] KerberosTime,
subkey [6] EncryptionKey OPTIONAL,
seq-number [7] UInt32 OPTIONAL,
authorization-data [8] AuthorizationData OPTIONAL
}
authenticator-vno
此字段指定认证头部格式的版本号。本文档规定版本为 5。
crealm 和 cname
这些字段与第 5.3 节中针对票据所描述的相同。
cksum
此字段包含随 KRB_AP_REQ 一起传送的应用数据的校验和,在正常应用交换中使用密钥用途值 10 计算,在 TGS-REQ 的 PA-TGS-REQ AP-DATA 字段中使用时则为 6。
cusec
此字段包含客户端时间戳的微秒部分。其值(加密前)范围为 0 到 999999。它通常与 ctime 一起出现。这两个字段共同用于指定一个相当精确的时间戳。
ctime
此字段包含客户端主机的当前时间。
subkey
此字段包含客户端为加密保护此特定应用会话而选择的加密密钥。除非应用另行指定,否则若省略此字段,将使用票据中的会话密钥。
seq-number
此可选字段包含在需要序列号来检测重放时,KRB_PRIV 或 KRB_SAFE 消息所要使用的初始序列号。(它也可能被具体应用消息所使用。)当包含在认证头部中时,此字段指定从客户端到服务器的消息的初始序列号。当包含在 AP-REP 消息中时,初始序列号则是从服务器到客户端的消息所用的序列号。在 KRB_PRIV 或 KRB_SAFE 消息中使用时,每发送一条消息后该值加一。序列号的取值范围为 0 到 2^32 - 1,并在达到 2^32 - 1 后回绕到 0。
为了使序列号能够充分支持重放检测,即使跨越连接边界,它们也不应当重复。初始序列号应当随机且在整个可能的序列号空间中均匀分布,使其无法被攻击者猜测,同时使其及后续序列号不会与其他序列重复。若要在一系列 KRB_PRIV 或 KRB_SAFE 消息中生成超过 2^32 条消息,则应在序列号与同一加密密钥被复用之前执行重新生成密钥(rekeying)。
实现说明:历史上,某些实现对序列号传输带符号的二进制补码数。出于兼容性考虑,当期望一个大于 2^31 - 1 的正数时,实现可以接受等价的负数。
实现说明:如前所述,某些实现在其值为零时会省略可选的序列号。实现可以在期望值为零时接受一个被省略的序列号,并且不应传输一个初始序列号为零的认证头部。
authorization-data
此字段与第 5.3 节中针对票据所描述的相同。它是可选的,仅当需要在票据自身所携带的限制之外,对票据的使用施加额外限制时才会出现。
5.5.2. KRB_AP_REP 定义
KRB_AP_REP 消息包含 Kerberos 协议版本号、消息类型以及一个加密的时间戳。该消息在响应应用请求(KRB_AP_REQ)时发送,前提是 ap-options 字段中选择了双向认证选项。
AP-REP ::= [APPLICATION 15] SEQUENCE {
pvno [0] INTEGER (5),
msg-type [1] INTEGER (15),
enc-part [2] EncryptedData -- EncAPRepPart
}
EncAPRepPart ::= [APPLICATION 27] SEQUENCE {
ctime [0] KerberosTime,
cusec [1] Microseconds,
subkey [2] EncryptionKey OPTIONAL,
seq-number [3] UInt32 OPTIONAL
}
编码后的 EncAPRepPart 使用票据的共享会话密钥加密。可选的 subkey 字段可用于由应用安排的协商中,以选择每次关联的会话密钥。
pvno 和 msg-type
这些字段已在第 5.4.1 节中描述。msg-type 为 KRB_AP_REP。
enc-part
此字段已在第 5.4.2 节中描述。它使用密钥用途值 12 计算。
ctime
此字段包含客户端主机的当前时间。
cusec
此字段包含时间戳的微秒部分。
subkey
此字段包含一个加密密钥,用于保护此特定应用会话。关于此字段如何用于协商密钥的细节,请参见第 3.2.6 节。除非应用另行指定,否则若省略此字段,将使用认证头部中的子会话密钥;若后者也被省略,则使用票据中的会话密钥。
seq-number
此字段已在第 5.3.2 节中描述。
5.5.3. 错误消息回复
如果在处理应用请求时发生错误,将发送 KRB_ERROR 消息作为响应。错误消息的格式见第 5.9.1 节。如果服务器无法从相应的 KRB_AP_REQ 消息中确定其适当取值,则 cname 和 crealm 字段可以省略。如果认证头部可被解密,则 ctime 和 cusec 字段将包含其中的取值。