HttpClient未使用客户端证书进行双向TLS身份验证

5

问题

为什么我的HttpClient实例不会使用我提供的客户端证书进行相互认证?

背景

我正在使用HttpClient进行相互TLS。作为客户端,我将客户端证书添加到WebRequestHandler中,然后在新的HttpClient中使用该处理程序。

该证书未安装在我的计算机上。我已经成功地将其加载到处理程序中,并且在调试时可以看到它(密码也正确)。

我正在测试几个不同的测试域名:

两个测试应用程序都没有显示发送了证书。

代码

    var clientCert = new X509Certificate2("badssl.pem", "badssl.com");

    var webHandler = new WebRequestHandler();
    webHandler.ClientCertificates.Add(clientCert);
    var httpClient = new HttpClient(webHandler);

    var result = await (await httpClient.GetAsync(uri)).Content.ReadAsStringAsync();

除非证书与服务器在握手过程中发送的CA列表匹配,否则证书将不会被发送。因此,请确保证书上有正确的根授权机构。同时,请确保您使用的副本实际包含私钥。 - John Wu
谢谢,@JohnW。问题出在私钥上,但根据我对双向 TLS 的(有限)了解,我不认为根证书需要匹配客户端证书。我(非常个人的)经验显示,安装后发送的是自签名证书。 - Justin Self
这取决于服务器的配置。在握手期间,它可以发送CA列表,客户端应该只响应符合它们的证书。但它也可以发送一个空列表,客户端可以发送任何东西。正是这些细节使得故障排除变得如此困难。 - John Wu
1个回答

3
X509Certificate2类似乎无法从PEM证书中读取私钥。
    var clientCert = new X509Certificate2("badssl.com-client.pem", "badssl.com");
    if(!clientCert.HasPrivateKey)
        throw new ApplicationException("Cert doesn't contain private key");

抛出错误。

在badssl.com的情况下,他们有一个可用的PKCS #12证书(又名PFX)。我能够使用该证书使您的代码正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接