我在“客户端”计算机的本地计算机/个人证书存储中拥有不可导出的客户端证书,并且在使用System.Net.Http.HttpClient
进行Web请求时,我想将此证书用于客户端身份验证。
我曾尝试这样使用HttpClientHandler
:
var subject = /* Distinctive subject name of the certificate known to exist in the store */;
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindBySubjectName, subject, true);
// Known/verifiable at this point that certificates[0] is the correct client cert
var clientHandler = new HttpClientHandler();
clientHandler.ClientCertificates.Add(certificates[0]);
using (var client = new HttpClient(clientHandler))
{
var response = await client.GetAsync(URL.Text);
var result = await response.Content.ReadAsStringAsync();
// ... etc...
}
...但是GetAsync
调用会引发以下异常消息:
请求已中止:无法创建SSL / TLS安全通道。
我已经能够验证这是客户端问题,并且从商店中返回了正确的证书。
据我了解,我只是附加了公共部分(因为它不可导出),因此身份验证失败。肯定有一种方法可以使用私有的,不可导出的密钥来达到此目的,对吗?我该怎么办?