跳到主要内容

5.4. AS 和 TGS 交换的规范

5.4. Specifications for the AS and TGS Exchanges​

本节规定了客户端与 Kerberos 服务器之间交换所用消息的格式。可能出现的错误消息格式见第 5.9.1 节。

5.4.1. KRB_KDC_REQ 定义​

KRB_KDC_REQ 消息自身没有应用标签号,而是被并入 KRB_AS_REQ 或 KRB_TGS_REQ 之一;两者各自带有应用标签,取决于请求的是初始票据还是附加票据。无论哪种情况,该消息都由客户端发送给 KDC,以请求某个服务的凭据。

消息字段如下:

AS-REQ          ::= [APPLICATION 10] KDC-REQ
TGS-REQ         ::= [APPLICATION 12] KDC-REQ
KDC-REQ         ::= SEQUENCE {
-- NOTE: first tag is [1], not [0]
pvno [1] INTEGER (5) ,
msg-type [2] INTEGER (10 -- AS -- | 12 -- TGS --),
padata [3] SEQUENCE OF PA-DATA OPTIONAL
-- NOTE: not empty --,
req-body [4] KDC-REQ-BODY
}
KDC-REQ-BODY    ::= SEQUENCE {
kdc-options [0] KDCOptions,
cname [1] PrincipalName OPTIONAL
-- Used only in AS-REQ --,
realm [2] Realm
-- Server's realm
-- Also client's in AS-REQ --,
sname [3] PrincipalName OPTIONAL,
from [4] KerberosTime OPTIONAL,
till [5] KerberosTime,
rtime [6] KerberosTime OPTIONAL,
nonce [7] UInt32,
etype [8] SEQUENCE OF Int32 -- EncryptionType
-- in preference order --,
addresses [9] HostAddresses OPTIONAL,
enc-authorization-data [10] EncryptedData OPTIONAL
-- AuthorizationData --,
additional-tickets [11] SEQUENCE OF Ticket OPTIONAL
-- NOTE: not empty
}
KDCOptions      ::= KerberosFlags
-- reserved(0),
-- forwardable(1),
-- forwarded(2),
-- proxiable(3),
-- proxy(4),
-- allow-postdate(5),
-- postdated(6),
-- unused7(7),
-- renewable(8),
-- unused9(9),
-- unused10(10),
        -- opt-hardware-auth(11),
-- unused12(12),
-- unused13(13),
-- 15 is reserved for canonicalize
-- unused15(15),
-- 26 was unused in 1510
-- disable-transited-check(26),
--
-- renewable-ok(27),
-- enc-tkt-in-skey(28),
-- renew(30),
-- validate(31)

该消息中的字段如下:

pvno

此字段包含于每一条消息之中,用于指定协议版本号。本文档规定协议版本为 5。

msg-type

此字段指示协议消息的类型。它几乎总是与和该消息相关联的应用标识符相同。包含它的目的是让应用程序更容易获取该标识符。对于 KDC-REQ 消息而言,此类型为 KRB_AS_REQ 或 KRB_TGS_REQ。

padata

包含预认证数据。请求附加票据(KRB_TGS_REQ)时必须包含一条 PA-TGS-REQ 类型的 padata。

padata(预认证数据)字段包含一组认证信息序列,在凭据能够被签发或解密之前可能需要这些信息。

req-body

此字段是一个占位符,用于界定其余字段的范围。如果要计算请求之上的校验和,则是对包含在 req-body 字段内的 KDC-REQ-BODY 序列的编码进行计算。

kdc-options

此字段出现在发往 KDC 的 KRB_AS_REQ 和 KRB_TGS_REQ 请求中,用于指示客户端希望在票据上设置的标志位,以及用于修改 KDC 行为的其他信息。在适当的情况下,某个选项的命名可能与该选项所设置的标志相同。虽然在大多数情况下,options 字段中的位与 flags 字段中的位一致,但这并不保证,因此不能简单地将 options 字段复制到 flags 字段。无论如何,在兑现某个选项之前都必须执行各种检查。

kdc_options 字段是一个位域,所选选项通过将对应位设为 1 来表示,未选中的选项以及保留字段则被重置为 0。这些位的编码在第 5.2 节中规定。这些选项在第 2 节中作了更详细的描述。各选项的含义如下:

Bits Name Description

0 RESERVED 保留,供本字段未来扩展使用。

1 FORWARDABLE FORWARDABLE 选项指示待签发票据应将其 forwardable 标志置位。它只能在初始请求中设置,或者在后续请求中(前提是其所基于的 TGT 本身也可转发)设置。

2 FORWARDED FORWARDED 选项仅在发往票据授予服务器的请求中指定,并且仅当请求中的 TGT 具有 FORWARDABLE 位置位时才会被兑现。此选项指示这是一个转发请求。所得票据有效的主机地址包含在请求的 addresses 字段中。

3 PROXIABLE PROXIABLE 选项指示待签发票据应将其 proxiable 标志置位。它只能在初始请求中设置,或者在后续请求中(前提是其所基于的 TGT 本身也可代理)设置。

4 PROXY PROXY 选项指示这是一个代理请求。此选项仅当请求中的 TGT 具有 PROXIABLE 位置位时才会被兑现。所得票据有效的主机地址包含在请求的 addresses 字段中。

5 ALLOW-POSTDATE ALLOW-POSTDATE 选项指示待签发票据应将其 MAY-POSTDATE 标志置位。它只能在初始请求中设置,或者在后续请求中(前提是其所基于的 TGT 本身也具有 MAY-POSTDATE 标志)设置。

6 POSTDATED POSTDATED 选项指示这是一个对远期票据(postdated ticket)的请求。此选项仅当其所基于的 TGT 具有 MAY-POSTDATE 标志置位时才会被兑现。所得票据还会同时将其 INVALID 标志置位,而该标志可在票据的 starttime 到达之后通过向 KDC 发起的后续请求重置。

7 RESERVED 此选项当前未被使用。

8 RENEWABLE RENEWABLE 选项指示待签发票据应将其 RENEWABLE 标志置位。它只能在初始请求中设置,或者在其所基于的请求本身也可续订时设置。如果请求了此选项,则请求中的 rtime 字段包含该票据期望的绝对过期时间。

9 RESERVED 保留,供 PK-Cross 使用。

10 RESERVED 保留,供未来使用。

11 RESERVED 保留,供 opt-hardware-auth 使用。

12-25 RESERVED 保留,供未来使用。

26 DISABLE-TRANSITED-CHECK 默认情况下,KDC 在基于某张 TGT 签发衍生票据之前,会根据本地领域的策略检查该 TGT 的 transited 字段。如果在请求中设置了此标志,则对 transited 字段的检查将被禁用。未经此检查而签发的票据将通过 TRANSITED-POLICY-CHECKED 标志被重置为 0 来标记,以此向应用服务器表明 transited 字段必须在本地检查。鼓励(但不要求)KDC 兑现 DISABLE-TRANSITED-CHECK 选项。

此标志自 RFC 1510 起为新增。

27 RENEWABLE-OK RENEWABLE-OK 选项指示:如果无法以其他方式提供所请求生存期的票据,那么一张可续订票据是可以接受的,在此情况下可以签发一张 renew-till 等于所请求 endtime 的可续订票据。renew-till 字段的取值仍可能受到本地限制,或者各个主体或服务器所选限制的限制。

28 ENC-TKT-IN-SKEY 此选项仅由票据授予服务使用。ENC-TKT-IN-SKEY 选项指示,针对最终服务器的票据应使用所提供附加 TGT 中的会话密钥进行加密。

29 RESERVED 保留,供未来使用。

30 RENEW RENEW 选项仅由票据授予服务使用。RENEW 选项指示当前请求为续订请求。所提供的票据使用其有效服务器的密钥进行加密。此选项仅当待续订票据具有 RENEWABLE 标志置位、且其 renew-till 字段中的时间尚未过期时才会被兑现。待续订的票据作为认证头部的一部分,放在 padata 字段中传递。

31 VALIDATE VALIDATE 选项仅由票据授予服务使用。VALIDATE 选项指示该请求用于验证一张远期票据。它仅当所提交的票据为远期票据、当前具有 INVALID 标志置位、且在此刻本应可用时才会被兑现。一张票据不能在其 starttime 之前被验证。提交用于验证的票据使用其有效服务器的密钥加密,并作为认证头部的一部分放在 padata 字段中传递。

cname 和 sname

这些字段与第 5.3 节中针对票据所描述的相同。sname 仅在指定了 ENC-TKT-IN-SKEY 选项时才可以缺省。如果 sname 缺省,则服务器名称取自作为 additional-tickets 传入的票据中的客户端名称。

enc-authorization-data

enc-authorization-data(如果存在,且只能以 TGS_REQ 形式出现)是对期望的 authorization-data 的编码,使用 Authenticator 中存在的子会话密钥加密,或者退而使用 TGT 中的会话密钥加密(Authenticator 和 TGT 均来自 KRB_TGS_REQ 的 padata 字段)。加密时使用的密钥用途值:若使用子会话密钥则为 5,若使用会话密钥则为 4。

realm

此字段指定服务器主体标识符的 realm 部分。在 AS 交换中,它同时也是客户端主体标识符的 realm 部分。

from

当所请求的票据为远期票据时,此字段包含于 KRB_AS_REQ 和 KRB_TGS_REQ 的票据请求中。它指定所请求票据期望的起始时间。如果省略此字段,则 KDC 应当改用当前时间。

till

此字段包含客户端在票据请求中所请求的过期日期。它不是可选的,但如果所请求的 endtime 为 "19700101000000Z",则所请求的票据应具有根据 KDC 策略所允许的最大 endtime。实现注意:这个特殊的时间戳在大多数系统上对应于 UNIX 的 time_t 零值。

rtime

此字段是从客户端发往 KDC 的票据请求中所请求的 renew-till 时间。它是可选的。

nonce

此字段是 KDC 请求和响应的一部分。它用于保存由客户端生成的随机数。如果 KDC 加密响应中包含了相同的数字,则可证明该响应是新鲜的、且未被攻击者重放。Nonce 绝不可被重用。

etype

此字段指定响应中所使用的期望加密算法。

addresses

此字段包含于初始的票据请求中,并可选择地包含在向票据授予服务器请求附加票据的请求中。它指定所请求票据有效的地址。通常它包含客户端主机的地址。如果请求了代理,则此字段将包含其他地址。该字段的内容通常由 KDC 复制到所得票据的 caddr 字段中。

additional-tickets

请求附加票据时可以可选地包含 Additional tickets。如果指定了 ENC-TKT-IN-SKEY 选项,则附加票据的会话密钥将用来替代服务器密钥以加密新票据。当 ENC-TKT-IN-SKEY 选项用于用户到用户(user-to-user)认证时,此附加票据可以是本地领域签发的 TGT,也可以是由远程 KDC 为当前 KDC 的领域签发的跨领域 TGT。如果指定了多个需要附加票据的选项,则附加票据按照这些选项的位序(见上文 kdc-options)所指定的顺序使用。

应用标签号将为十(10)或十二(12),取决于请求针对的是初始票据(AS-REQ)还是附加票据(TGS-REQ)。

可选字段(addresses、authorization-data 以及 additional-tickets)只有在执行 kdc-options 字段中所指定操作确有必要时才包含。

注意,在 KRB_TGS_REQ 中,协议版本号会出现两次,并且会出现两种不同的消息类型:KRB_TGS_REQ 消息本身包含这些字段,传入 padata 字段的认证头部(KRB_AP_REQ)也包含这些字段。

5.4.2. KRB_KDC_REP 定义​

KRB_KDC_REP 消息格式用于 KDC 对初始(AS)请求或后续(TGS)请求的回复。KRB_KDC_REP 没有单独的消息类型,其类型将是 KRB_AS_REP 或 KRB_TGS_REP。用于加密回复密文部分的密钥取决于消息类型。对于 KRB_AS_REP,密文使用客户端的长期密钥加密,并且客户端的密钥版本号包含在加密数据的密钥版本号中。对于 KRB_TGS_REP,密文使用 Authenticator 中的子会话密钥加密;若该密钥缺省,则使用请求中所用 TGT 的会话密钥加密。在这种情况下,EncryptedData 序列中将不出现版本号。

KRB_KDC_REP 消息包含以下字段:

   AS-REP          ::= [APPLICATION 11] KDC-REP
   TGS-REP         ::= [APPLICATION 13] KDC-REP
   KDC-REP         ::= SEQUENCE {
pvno [0] INTEGER (5),
msg-type [1] INTEGER (11 -- AS -- | 13 -- TGS --),
padata [2] SEQUENCE OF PA-DATA OPTIONAL
-- NOTE: not empty --,
crealm [3] Realm,
cname [4] PrincipalName,
ticket [5] Ticket,
enc-part [6] EncryptedData
-- EncASRepPart or EncTGSRepPart,
-- as appropriate
}
   EncASRepPart    ::= [APPLICATION 25] EncKDCRepPart
   EncTGSRepPart   ::= [APPLICATION 26] EncKDCRepPart
   EncKDCRepPart   ::= SEQUENCE {
key [0] EncryptionKey,
last-req [1] LastReq,
nonce [2] UInt32,
key-expiration [3] KerberosTime OPTIONAL,
flags [4] TicketFlags,
authtime [5] KerberosTime,
starttime [6] KerberosTime OPTIONAL,
endtime [7] KerberosTime,
renew-till [8] KerberosTime OPTIONAL,
srealm [9] Realm,
sname [10] PrincipalName,
caddr [11] HostAddresses OPTIONAL
}
   LastReq         ::=     SEQUENCE OF SEQUENCE {
lr-type [0] Int32,
lr-value [1] KerberosTime
}

pvno 和 msg-type

这些字段已在第 5.4.1 节中描述。msg-type 为 KRB_AS_REP 或 KRB_TGS_REP。

padata

此字段在第 5.4.1 节中有详细描述。它的一种可能用途是编码一个与 string-to-key 算法配合使用的备用 "salt" 字符串。当领域名称需要变更时(例如公司被收购),此能力有助于平滑过渡;在这种情况下,KDC 数据库中所有现有的密码派生条目都会被标记,直到下一次密码变更之前都需要使用一个特殊的盐字符串。

crealm、cname、srealm 和 sname

这些字段与第 5.3 节中针对票据所描述的相同。

ticket

第 5.3 节中新签发的票据。

enc-part

此字段是一个占位符,用于存放构成消息加密部分的密文及相关信息。该字段每次出现之后都跟随对消息加密部分的描述。

加密此字段时使用的密钥用途值:在 AS-REP 消息中为 3,使用客户端的长期密钥或通过预认证机制选定的其他密钥;在 TGS-REP 消息中,若使用 TGS 会话密钥则为 8,若使用 TGS authenticator 子密钥则为 9。

兼容性说明:某些实现会无条件地在此字段中发送一个加密的 EncTGSRepPart(应用标签号 26),而不管回复是 AS-REP 还是 TGS-REP。出于兼容性考虑,实现者可以放宽对已解密 ENC-PART 标签号的检查。

key

此字段与第 5.3 节中针对票据所描述的相同。

last-req

此字段由 KDC 返回,指定某个主体最后一次请求的时间。根据可用信息的不同,它可能是最后一次请求 TGT 的时间,也可能是最后一次基于 TGT 的请求成功的时间。它也可能涵盖一个领域中的所有服务器,或者仅涵盖特定服务器。某些实现可能会将此信息显示给用户,以帮助发现身份被未授权使用的情况。它在精神上与登录分时系统时显示的"上次登录时间"类似。

lr-type

此字段指示随后的 lr-value 字段应如何解释。负值表示该信息仅与响应服务器相关。非负值则与该领域中所有的服务器相关。

如果 lr-type 字段为零(0),则 lr-value 子字段不传达任何信息。如果 lr-type 字段的绝对值为一(1),则 lr-value 子字段为最后一次初始请求 TGT 的时间。如果为二(2),则 lr-value 子字段为最后一次初始请求的时间。如果为三(3),则 lr-value 子字段为所使用的全新 TGT 的签发时间。如果为四(4),则 lr-value 子字段为最后一次续订的时间。如果为五(5),则 lr-value 子字段为最后一次请求(任何类型)的时间。如果为(6),则 lr-value 子字段为密码将要过期的时间。如果为(7),则 lr-value 子字段为账户将要过期的时间。

lr-value

此字段包含最后一次请求的时间。该时间必须根据随附的 lr-type 子字段的内容来解释。

nonce

此字段已在第 5.4.1 节中描述。

key-expiration

key-expiration 字段是来自 KDC 的响应的一部分,指定客户端密钥将要过期的时间。该过期可能是密码老化或账户过期的结果。如果存在,它应当被设置为用户密钥过期时间与账户过期时间中较早者。此字段的使用已被废弃,应当改用 last-req 字段来传达此信息。此字段通常会被排除在 TGS 回复之外,因为对 TGS 请求的响应是使用会话密钥加密的,不需要从 KDC 数据库检索客户端信息。如果过期时间临近,由应用客户端(通常是登录程序)采取适当措施(例如通知用户)。

flags、authtime、starttime、endtime、renew-till 和 caddr

这些字段是所附票据加密部分中那些字段的副本(见第 5.3 节),提供它们是为了让客户端能够验证其与预期请求相符,并有助于正确地缓存票据。如果消息类型为 KRB_TGS_REP,则 caddr 字段仅在请求的是代理或转发票据、或者用户正在替换 TGT 中地址的某个子集时才会被填充。如果客户端请求的地址不存在或未被使用,则票据中包含的地址将与 TGT 中包含的地址相同。