重新协商 Schannel 连接

若要更改连接的属性(例如密码套件或客户端身份验证),可以请求对连接进行“重做”或重新协商。

如果要更改的属性由凭据控制,则必须在重新协商连接之前获取新凭据。 有关详细信息,请参阅 获取 Schannel 凭据

若要从客户端应用程序请求重做,请调用 InitializeSecurityContext (Schannel) 函数。 服务器应用程序调用 AcceptSecurityContext (Schannel) 函数。 按如下所示设置参数:

  • phContext 参数中指定现有安全上下文
  • (客户端仅) 在 pszTargetName 参数) 指定与建立上下文时指定的相同服务器名称 (。
  • 使用 phCredential 参数指定新凭据(如果适用)。
  • 如果要更改与凭据无关的上下文属性,请使用 fContextReq 参数指定这些属性。

调用相应的函数后,应用程序应将结果发送到客户端,并继续使用 DecryptMessage (Schannel) 函数处理传入的消息。

当 Schannel 准备好继续应用程序时, DecryptMessage (Schannel) 函数将返回SEC_I_RENEGOTIATE。 收到SEC_I_RENEGOTIATE返回代码时,应用程序必须 调用 AcceptSecurityContext (Schannel) (服务器) 或 InitializeSecurityContext (Schannel) (客户端) ,并在SECBUFFER_TOKEN中传递从 DecryptMessage 返回的SECBUFFER_EXTRA的内容。 此调用返回值后,继续操作,就像应用程序正在创建新连接一样。