创建 Schannel 安全上下文

若要建立可保护客户端和服务器之间的通信 的安全上下文 ,两者都必须参与以下信息交换过程:

客户端

  1. 客户端调用 InitializeSecurityContext (General) 函数。
  2. Schannel 开始根据所选安全协议的规则创建安全上下文。 函数的返回代码指示客户端是否必须再次调用函数。 InitializeSecurityContext (常规) 可能会返回表示上下文的标记。
  3. 如果返回令牌,客户端会将令牌发送到服务器。
  4. 当 InitializeSecurityContext (常规) 返回SEC_E_OK时,客户端完成。 如果函数返回SEC_I_CONTINUE_NEEDED,则客户端必须等待服务器向其发送令牌。 当客户端具有来自服务器的令牌时,它必须再次调用 InitializeSecurityContext (General) 函数 。 (返回到步骤 2.)

服务器

  1. 服务器等待客户端发送包含安全令牌的消息。 服务器将从客户端收到的令牌传递到 AcceptSecurityContext (General) 函数。
  2. Schannel 基于令牌表示的部分安全上下文。 Schannel 向服务器返回令牌,以及指示服务器是否必须再次调用函数的返回代码。
  3. 如果返回了令牌,则服务器会将其发送到客户端。
  4. 当 AcceptSecurityContext (常规) 返回SEC_E_OK时,服务器即完成。 如果函数返回SEC_I_CONTINUE_NEEDED,则服务器必须等待客户端向其发送令牌。 当服务器具有来自客户端的令牌时,它必须再次调用 AcceptSecurityContext (General) 函数。 (返回到步骤 2.)

如果任一函数返回SEC_E_OK以外的值,SEC_I_CONTINUE_NEEDED或SEC_E_INCOMPLETE_MESSAGE (请参阅以下段落) 发生错误。 客户端和服务器应调用 DeleteSecurityContext 函数来删除部分建立的安全上下文。

可以更改客户端和服务器处理的一种特殊情况是,从另一方向客户端或服务器发送的信息太少或太多。 如果信息太少,这两个函数都返回SEC_E_INCOMPLETE_MESSAGE。 有关识别和处理不足或多余的信息的信息,请参阅 Schannel 返回的额外缓冲区

使用 Schannel 执行身份验证

映射证书

手动验证 Schannel 凭据