如何使用C#HttpClient将不可导出的客户端证书附加到请求?

时间:2018-06-25 14:43:19

标签: c# ssl x509certificate

我在“客户端”计算机的本地计算机/个人证书存储中拥有不可导出的客户端证书,并且在使用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安全通道。

我已经能够验证这是客户端问题,并且从商店中返回了正确的证书。

  • 我已针对已知的工作端点(需要证书)测试了此代码;其他客户也在工作。
  • 我知道证书是有效的,因为它已被其他客户端代码(我目前无法使用的源)成功用于客户端身份验证

据我了解,我只是附加了公共部分(因为它不可导出),因此身份验证失败。肯定有一种方法可以使用私有的,不可导出的密钥来达到此目的,对吗?我该怎么办?

0 个答案:

没有答案