HttpClient不使用.NET Core

时间:2017-06-30 12:52:42

标签: c# .net asp.net-core .net-core kestrel-http-server

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

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

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(10 v1703)上运行时不会发送证书。

我使用.NET Framework运行类似的代码(使用' WebRequestHandler'而不是' HttpClientHandler')。它正确发送客户端证书。

我在网上找到了following,但与此处描述的问题不同,执行了服务器证书回调。我自己生成了证书,但它们都是由根CA(在客户端和服务器上都安装)签名的,所有细节都是正确的。

我还发现了this,这表明客户端证书可以在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 个答案:

答案 0 :(得分:1)

不完全确定我的复制问题是否是由于相同的根本原因造成的。但是,我遇到了同样的问题,结果证明证书没有发送,因为客户端无法验证它。将颁发者证书添加到客户端上“证书”MMC管理单元中的受信任发行者列表后,Windows可以验证证书并且HttpClient开始发送它。如果您有自签名证书,那么我假设您可以将其添加到受信任的发卡商店。这是在.Net 4.6.1上测试的。

在WinHTTP中设置客户端证书的相关代码是here。当您阅读GetEligibleClientCertificate的代码注释时,您会看到MS一直计划添加对证书的额外过滤,以删除受信任的颁发者列表不匹配的任何内容。他们根本没有想过将证书保存在文件中并且不关心证书库的用例。