跳到主要内容

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 节中规定。各选项的含义如下:

比特名称描述
0reserved保留,供本字段未来扩展使用。
1use-session-keyUSE-SESSION-KEY 选项指示:客户端提交给服务器的票据,是使用服务器 TGT 中的会话密钥加密的。当未指定此选项时,票据使用服务器的密钥加密。
2mutual-requiredMUTUAL-REQUIRED 选项告知服务器:客户端要求双向认证,服务器必须以一条 KRB_AP_REP 消息作出响应。
3-31reserved保留,供未来使用。

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 字段将包含其中的取值。