手动验证 Schannel 凭据

默认情况下,Schannel 通过调用 WinVerifyTrust 函数来验证服务器证书;但是,如果使用 ISC_REQ_MANUAL_CRED_VALIDATION 标志禁用此功能,则必须验证尝试建立其标识的服务器提供的证书。

若要手动验证服务器证书,必须先获取它。 使用 QueryContextAttributes (General) 函数并指定 SECPKG_ATTR_REMOTE_CERT_CONTEXT 属性值。 此属性返回 CERT_CONTEXT 结构,其中包含服务器提供的证书链。 此证书链包含叶证书。 它称为叶证书,因为它是证书链中的最后一个证书,并且离 根证书最远。 SSPI 上下文缓冲区中的证书排序并不意味着任何证书链接关系。

使用叶证书必须验证以下内容:

  • 证书链已完成,根证书来自受信任的 证书颁发机构 (CA) 。
  • 当前时间不会超过证书链中每个证书的开始和结束日期。
  • 证书链中的证书均未吊销。
  • 叶证书的深度不大于证书扩展中指定的最大允许深度。 仅当指定了深度时才需要此检查。
  • 证书的使用是正确的,例如,不应使用 客户端证书 对服务器进行身份验证。
  • 对于服务器身份验证,服务器叶证书中包含的服务器标识与客户端尝试联系的服务器匹配。 通常,客户端会将证书的“使用者名称”字段中的某些项与服务器的 IP 地址或 DNS 名称匹配。