当服务器提供的证书上的名称都与 pszTargetName 参数(本质上是服务器的名称)不匹配时,InitializeSecurityContext (Schannel) 失败并显示 SEC_E_WRONG_PRINCIPAL。
如果您有一个完整的安全上下文,您可以通过调用 QueryContextAttributes 获取 SECPKG_ATTR_REMOTE_CERT_CONTEXT 来获取服务器的证书。如果将来自失败的 InitializeSecurityContext 协商的部分形成的安全上下文用作 phContext 参数,则对 QueryContextAttributes 的调用失败并显示 SEC_E_INVALID_HANDLE。
在这种情况下,客户端是否有办法访问服务器发送的证书,以便我们可以报告证书上的名称?
注意。如果我们真的想这样做,我们可能会重做协商,指定 ISC_REQ_MANUAL_CRED_VALIDATION,然后在该安全上下文上调用 QueryContextAttributes(然后立即销毁它),但这似乎很愚蠢。