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

如何使用C#HttpClient将不可导出的客户端证书附加到请求?,c#,ssl,x509certificate,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.M

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

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

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

据我所知,我只附加公共部分(因为它是不可导出的),所以身份验证失败。一定有办法使用私有的、不可导出的密钥来达到这个目的,对吗?如何操作?

问题不在私钥的导出状态。我怀疑您的客户端对存储在计算机存储中的私钥没有权限。您需要将证书移动到当前用户(运行您的客户端)或授予对私钥的访问权限。发现如果我以管理员身份运行客户端应用,并确认该问题与权限有关,则可以使用私钥。