我正在尝试在.NET应用程序和为以下目的安装了第三方根CA证书和中间CA证书的网站之间建立TLS连接:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var handler = new WebRequestHandler
{
ClientCertificateOptions = ClientCertificateOption.Manual
};
handler.ClientCertificates.Add(someClientCertificate);
var httpClient = new HttpClient(handler);
httpClient.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var httpResponseMessage = httpClient.GetAsync("https://somewebsite.com").Result;
尝试此操作时,在服务器证书验证过程中出现以下错误:
(PartialChain)无法将证书链构建到受信任的 根权限。
当我将根CA证书安装到“受信任的根CA”存储中时,错误消失了。
该行为的原因是什么?通过阅读(请参阅https://security.stackexchange.com/questions/140211/whats-the-difference-between-trusted-root-certification-authorities-and-thir),我有一个印象,即第三方Root CA存储基本上只是Trusted Root CA存储的一个子集,因此应该成功构建链。>
请注意,将根CA证书安装到受信任的根CA存储不是我的选择。
答案 0 :(得分:1)
由于我从未理解的原因,CurrentUser \ ThirdPartyRoot存储似乎没有任何功能。至少,它没有以类似的方式链接到LocalMachine \ ThirdPartyRoot。
http://kreelbits.blogspot.com/2014/02/whats-purpose-of-users-third-party-root.html有点自我发现,表明CurrentUser \ Root存储的后备实现与LocalMachine \ Root的结构不同。由此推断,“根”(而不是“ ThirdPartyRoot”)存储是信任决策中实际使用的唯一存储(通过存储链接包含了LM \ ThirdPartyRoot)。