在RemoteCertificateValidationCallback期间,X509Chain没有构建完整的链

时间:2016-02-21 05:58:32

标签: c# security ssl certificate

我的Windows服务正在尝试连接到由证书C签名的网站.C由Symantec Class 3安全服务器CA-G4(中间CA)和Symantec Class 3安全服务器CA-G4签署,由VeriSign签署第3类公共主要证书颁发机构 - G5(根CA)。

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

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

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

任何人都可以解释原因和需要做什么,以便建立完整的链。

补充意见: 注意:当我以同一台计算机上的管理员组中的用户X运行Windows服务时。构建了完整的链,并且中间证书安装在用户的存储可信中间证书中。

注意:当我将NETWORK SERVICE作为管理员组的一部分提升时,问题仍然存在且未构建完整链。

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

1 个答案:

答案 0 :(得分:1)

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

  1. 具有使用winsock的自己的代理设置的应用程序。这些应用程序必须自己管理代理设置。
  2. 使用WinINET库的应用程序 - WinINET是Internet Explorer的核心,也可以被其他应用程序使用。使用此库的任何应用程序都将使用Internet Explorer中提供的代理设置。
  3. 使用WinHTTP库的应用程序 - 非交互式应用程序主要使用WinHTTP库。 WinHTTP库不会使用Internet Explorer中提供的代理设置。
  4. 问题中的Windows服务属于第3类,并且未使用Internet Exploror的代理设置。所以.net的Chain构建引擎无法下载中间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调用,需要使缓存设置无效或删除它们。

    地点:

    每位用户==&gt; C:\ Users \ username \ AppData \ LocalLow \ Microsoft \ CryptnetUrlCache

    对于我的网络服务==&gt; C:\的Windows \ ServiceProfiles \网络服务\应用程序数据\ LocalLow \微软\ CryptnetUrlCache