.NET中的TLS-第三方根CA无法识别为受信任的根CA

时间:2018-08-15 09:11:50

标签: .net ssl https certificate tls1.2

我正在尝试在.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存储不是我的选择。

1 个答案:

答案 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)。