X509Chain 在 RemoteCertificateValidationCallback 期间未构建完整链

本文关键字:构建 RemoteCertificateValidationCallback X509Chain | 更新日期: 2023-09-27 18:35:36

我的 Windows 服务正在尝试连接到由证书 C 签名的网站。 C 由 Symantec Class 3 Secure Server CA - G4(中间 CA)

和 Symantec Class 3 Secure Server CA - G4 签名,由 VeriSign Class 3 公共主要证书颁发机构 - G5(根 CA)签名。

注意:我的 Windows 服务在网络服务的权限下运行。

在安装了Windows服务的客户端计算机中,我正在尝试验证服务器证书。在本地计算机的证书存储中,我在受信任的根 CA 中具有 VeriSign 3 类公共主要证书颁发机构 - G5(根 CA),但我在受信任的中间根中没有中间 CA。

现在在 RemoteCertificateValidationCallback 的回调中,X509Chain 只包含 1 个元素,即证书 C。

谁能解释为什么以及需要做什么才能建立完整的链。

其他观察:注意:当我在同一台计算机上以管理员组中的用户X身份运行Windows服务时。构建了完整链,并将中间证书安装在用户存储受信任的中间证书中。

注意:当我将网络服务提升为管理员组的一部分时,问题仍然存在,并且没有构建完整的链。

注意:当我以本地系统帐户运行Windows服务并且登录用户是同一台计算机上管理员组的一部分时,问题仍然存在,并且未构建完整链。

X509Chain 在 RemoteCertificateValidationCallback 期间未构建完整链

没有构建完整链的主要原因是由于缺少代理配置! 在Windows机器中,有3类应用程序,为它们配置代理的方式是不同的。这3个类是

  1. 具有自己的使用 winsock 的代理设置的应用程序。这些应用程序必须自己管理代理设置。
  2. 使用 WinINET
  3. 库的应用程序 - WinINET 是 Internet Explorer 的核心,也可以由其他应用程序使用。使用此库的任何应用程序都将使用 Internet Explorer 中提供的代理设置。
  4. 使用 WinHTTP 库
  5. 的应用程序 - 非交互式应用程序主要使用 WinHTTP 库。WinHTTP 库不会使用 Internet Explorer 中提供的代理设置。

问题中的Windows服务属于第三类,它没有使用Internet Exploror的代理设置。所以.net的链式构建引擎无法下载中间CA!一旦我们配置了 Win HTTP 的代理服务器设置,它就起作用了!

此外,下面的链接解释了证书链是如何构建的。https://technet.microsoft.com/en-us/library/cc700843.aspx

https://technet.microsoft.com/en-us/library/ee619754(v=ws.10).aspx

链构建的有趣之处在于,它还会在使用AIA(权威信息访问)之前查看磁盘和内存缓存,因此即使您放置wireshark,您也不会找到对AIA url的http调用的痕迹。这是因为它存在于内存缓存中,要查看AIA呼叫,需要使缓存设置无效或删除它们。

位置:

每个用户 ==>C:''Users''username''AppData''LocalLow'' Microsoft''CryptnetUrlCache

对于我情况下的网络服务 ==>C:''Windows''ServiceProfiles''NetworkService''AppData''LocalLow''Microsoft''CryptnetUrlCache