在使用.NET Core时,HttpClient在Windows上不会发送客户端证书。

7

我无法在Windows上使用.NET Core使HttpClient类发送客户端证书。

以下是我正在使用的代码:

X509Certificate2 certificate = new X509Certificate2(@"C:\Repos\selly\client1.pfx", "password");
HttpClientHandler handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = (a,b,c,d) => { return true; };
handler.ClientCertificates.Add(certificate);

HttpClient client = new HttpClient(handler);
var content = new StringContent("");
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
client.PostAsync("https://client2:5002/api/values", content).Wait();

代码在Linux上(Ubuntu 16.04)表现正常(显然,路径已更改)。但在Windows上无法运行。
通过Wireshark查看交换,发现当在Windows上运行时,客户端没有发送证书。
我使用.NET Framework运行了类似的代码(使用“WebRequestHandler”而不是“HttpClientHandler”),它可以正确地发送客户端证书。
我在网上找到了这篇文章,但与描述的问题不同,服务器证书回调已执行。 我自己生成了证书,但它们都由根CA签名,(已安装在客户端和服务器上),所有详细信息都是正确的。
我还发现了这个答案,它表明在Windows的.NET Core上,HttpClient和客户端证书确实可以一起使用。
我还尝试了明确定义TLS版本,然而问题仍然存在。
我正在使用Kestrel作为Web服务器。 它的配置如下:
.UseKestrel(options =>
{
    var sslOps = new HttpsConnectionFilterOptions();
    sslOps.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
    sslOps.ClientCertificateValidation = CheckClientCertificateLogic.CheckClientCertificate;
    sslOps.ServerCertificate = new X509Certificate2(@"C:\Repos\selly\client2.pfx", "password");
    options.UseHttps(sslOps);
})

'ClientCertificateValidation'回调在从Windows客户端接收的请求上不会执行,可能是因为它没有收到证书来进行检查...

这是.NET Core中的一个错误吗?是否有解决方法?


1
是的,Windows和Linux使用不同的处理程序(Windows上的Winhttp,Linux上的libcurl)。简要查看了.NET Core代码后,似乎winhttp处理程序不支持客户端证书成员。您可以尝试使用wip托管处理程序。请参见:https://github.com/dotnet/corefx/blob/93ee4ba40c82d5aca978447cb3e14c4ef7e7fd53/src/System.Net.Http/src/System/Net/Http/Managed/README.md - Will
1个回答

4
我不完全确定我重新复制这个问题是否是由于相同的根本原因。然而,我遇到了同样的问题,结果证书未被发送是因为客户端无法验证它。在客户端的“证书”MMC快照中将发行人证书添加到我的受信任发行商列表中后,Windows可以验证证书并启动HttpClient发送它。如果您有自签名证书,那么我认为您可以将其添加到受信任的发行商存储中。这在.Net 4.6.1上进行了测试。
设置WinHTTP中客户端证书的相关代码在此处。当您阅读GetEligibleClientCertificate的代码注释时,您会看到微软一直计划添加其他过滤证书的功能,以删除任何与受信任发行商列表不匹配的内容。他们只是没有考虑过您将证书保存在文件中并且不关心证书存储的情况。

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