跳到主要内容

1.3. The CREATE_CHILD_SA Exchange (CREATE_CHILD_SA 交换)

1.3 The CREATE_CHILD_SA Exchange (CREATE_CHILD_SA 交换)

CREATE_CHILD_SA 交换用于创建新的 Child SA, 以及对 IKE SA 与 Child SA 进行 rekey (重密钥). 该交换由单一请求/响应对组成, 其部分功能在 IKEv1 中称为 Phase 2 交换. 在初始交换完成后, IKE SA 的任一端都可以发起该交换.

通过对旧 SA 创建新 SA 再删除旧 SA 来完成 rekey. 本节描述 rekey 的第一部分, 即新 SA 的创建, 第 2.8 节涵盖 rekey 的机制, 包括将流量从旧 SA 迁到新 SA 以及删除旧 SA. 必须将两节一并阅读才能理解完整的 rekey 过程.

CREATE_CHILD_SA 交换可由任一端发起, 因此本节中的术语 initiator (发起方) 指发起该交换的端点. 实现可以拒绝某一 IKE SA 内的所有 CREATE_CHILD_SA 请求.

CREATE_CHILD_SA 请求可以选择包含 KE 载荷以进行额外的 Diffie-Hellman 交换, 从而为 Child SA 提供更强的 forward secrecy (前向保密) 保证. Child SA 的密钥材料是建立 IKE SA 时确立的 SK_d, CREATE_CHILD_SA 交换中交换的 nonce, 以及 (若 CREATE_CHILD_SA 交换中包含 KE 载荷) Diffie-Hellman 值的函数.

若 CREATE_CHILD_SA 交换包含 KEi 载荷, 则至少有一个 SA 提议必须包含 KEi 的 Diffie-Hellman 组. KEi 的 Diffie-Hellman 组必须是发起方预期响应方会接受的组的元素 (可提议额外的 Diffie-Hellman 组). 若响应方所选提议使用不同的 Diffie-Hellman 组 (NONE 除外), 响应方必须拒绝该请求, 并在 INVALID_KE_PAYLOAD Notify 载荷中指明其偏好的 Diffie-Hellman 组. 该通知关联两个字节的数据: 按 big endian (大端) 次序排列的被接受 Diffie-Hellman 组编号. 若遭此拒绝, CREATE_CHILD_SA 交换失败, 发起方可能会用响应方在 INVALID_KE_PAYLOAD Notify 载荷中给出的组重试该交换并带上相应的 Diffie-Hellman 提议与 KEi.

响应方发送 NO_ADDITIONAL_SAS 通知, 表示因不愿再在该 IKE SA 上接受更多 Child SA 而无法接受 CREATE_CHILD_SA 请求. 该通知也可用于拒绝 IKE SA 的 rekey. 某些最小化实现可能仅在初始 IKE 交换的上下文中接受单个 Child SA, 并拒绝后续任何添加尝试.

1.3.1. Creating New Child SAs with the CREATE_CHILD_SA Exchange (用 CREATE_CHILD_SA 交换创建新 Child SA)

可通过发送 CREATE_CHILD_SA 请求来创建 Child SA. 用于创建新 Child SA 的 CREATE_CHILD_SA 请求为:

Initiator                         Responder
-------------------------------------------------------------------
HDR, SK {SA, Ni, [KEi,]
TSi, TSr} -->

发起方在 SA 载荷中发送 SA 提议, 在 Ni 载荷中发送 nonce, 可选择地在 KEi 载荷中发送 Diffie-Hellman 值, 并在 TSi 与 TSr 载荷中为拟议的 Child SA 提议 Traffic Selector.

用于创建新 Child SA 的 CREATE_CHILD_SA 响应为:

                               <--  HDR, SK {SA, Nr, [KEr,]

TSi, TSr}

响应方回复 (使用相同的 Message ID 响应) 时在 SA 载荷中给出被接受的提议, 在 Nr 载荷中给出 nonce, 若请求中包含 KEi 且所选密码套件包含该组, 则在 KEr 载荷中给出 Diffie-Hellman 值.

将在该 SA 上发送的流量的 Traffic Selector 在响应的 TS 载荷中指定, 其可以是 Child SA 发起方所提议集合的子集.

USE_TRANSPORT_MODE 通知可以包含在同时带有请求 Child SA 的 SA 载荷的请求消息中. 它请求所创建的 Child SA 使用 transport mode (传输模式) 而非 tunnel mode (隧道模式). 若请求被接受, 响应也必须包含类型为 USE_TRANSPORT_MODE 的通知. 若响应方拒绝请求, Child SA 将以隧道模式建立. 若发起方无法接受, 发起方必须删除该 SA. 注意: 除使用该选项协商传输模式外, 所有 Child SA 均使用隧道模式.

ESP_TFC_PADDING_NOT_SUPPORTED 通知断言发送端点将不接受在所协商 Child SA 上包含 Traffic Flow Confidentiality (TFC, 流量流机密性) 填充的分组. 若两端点均不接受 TFC 填充, 该通知包含在请求与响应双方. 若该通知仅出现在其中一条消息中, 仍可在另一方向发送 TFC 填充.

NON_FIRST_FRAGMENTS_ALSO 通知用于分片控制. 更完整说明见 [IPSECARCH]. 任一方发送非首片之前双方必须同意. 仅当提议 SA 的请求与接受它的响应均包含 NON_FIRST_FRAGMENTS_ALSO 通知时才启用. 若响应方不希望发送或接收非首片, 它只需在响应中省略 NON_FIRST_FRAGMENTS_ALSO 通知, 而不必拒绝整个 Child SA 的创建.

还可在此交换中包含 IPCOMP_SUPPORTED 通知, 见第 2.22 节.

创建 Child SA 的失败尝试不应该拆毁 IKE SA: 没有理由浪费为建立 IKE SA 所做的工作. 若创建 Child SA 失败可能出现的错误消息列表见第 2.21 节.

1.3.2. Rekeying IKE SAs with the CREATE_CHILD_SA Exchange (用 CREATE_CHILD_SA 交换对 IKE SA 进行 rekey)

用于对 IKE SA 进行 rekey 的 CREATE_CHILD_SA 请求为:

Initiator                         Responder
-------------------------------------------------------------------
HDR, SK {SA, Ni, KEi} -->

发起方在 SA 载荷中发送 SA 提议, 在 Ni 载荷中发送 nonce, 在 KEi 载荷中发送 Diffie-Hellman 值. KEi 载荷必须被包含. 在 SA 载荷的 SPI 字段中提供新的发起方 SPI. 一旦对等方收到对 IKE SA 进行 rekey 的请求或发出此类请求, 它不应该在被 rekey 的 IKE SA 上启动任何新的 CREATE_CHILD_SA 交换.

用于对 IKE SA 进行 rekey 的 CREATE_CHILD_SA 响应为:

                               <--  HDR, SK {SA, Nr, KEr}

响应方回复 (使用相同的 Message ID) 时在 SA 载荷中给出被接受的提议, 在 Nr 载荷中给出 nonce, 若所选密码套件包含该组, 则在 KEr 载荷中给出 Diffie-Hellman 值. 在 SA 载荷的 SPI 字段中提供新的响应方 SPI.

新的 IKE SA 的消息计数器置为 0, 无论先前 IKE SA 中的值如何. 双方在新 IKE SA 上的第一条 IKE 请求的 Message ID 均为 0. 旧 IKE SA 保留其编号, 因此任何进一步请求 (例如删除 IKE SA) 将使用连续编号. 新 IKE SA 的窗口大小也重置为 1, 且此 rekey 交换中的发起方成为新 IKE SA 的新的 "original initiator (原始发起方)".

第 2.18 节亦详细涵盖 IKE SA 的 rekey.

1.3.3. Rekeying Child SAs with the CREATE_CHILD_SA Exchange (用 CREATE_CHILD_SA 交换对 Child SA 进行 rekey)

用于对 Child SA 进行 rekey 的 CREATE_CHILD_SA 请求为:

Initiator                         Responder
-------------------------------------------------------------------
HDR, SK {N(REKEY_SA), SA, Ni, [KEi,]
TSi, TSr} -->

发起方在 SA 载荷中发送 SA 提议, 在 Ni 载荷中发送 nonce, 可选择地在 KEi 载荷中发送 Diffie-Hellman 值, 并在 TSi 与 TSr 载荷中为拟议 Child SA 提议 Traffic Selector.

第 1.3.1 节所述通知也可在 rekey 交换中发送. 通常这些通知与原始交换中使用的相同, 例如 rekey 传输模式 SA 时将使用 USE_TRANSPORT_MODE 通知.

若交换目的是替换现有 ESP 或 AH SA, 则 REKEY_SA 通知必须包含在 CREATE_CHILD_SA 交换中. 被 rekey 的 SA 由 Notify 载荷中的 SPI 字段标识, 此为交换发起方在入向 ESP 或 AH 分组中预期会看到的 SPI. 该 Notify 消息类型不关联数据. REKEY_SA 通知的 Protocol ID 字段设置为与被 rekey 的 SA 的协议匹配, 例如 ESP 为 3, AH 为 2.

用于对 Child SA 进行 rekey 的 CREATE_CHILD_SA 响应为:

                               <--  HDR, SK {SA, Nr, [KEr,]
TSi, TSr}

响应方回复 (使用相同的 Message ID) 时在 SA 载荷中给出被接受的提议, 在 Nr 载荷中给出 nonce, 若请求中包含 KEi 且所选密码套件包含该组, 则在 KEr 载荷中给出 Diffie-Hellman 值.

将在该 SA 上发送的流量的 Traffic Selector 在响应的 TS 载荷中指定, 其可以是 Child SA 发起方所提议集合的子集.