我无法让 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”)。它正确发送客户端证书。
我找到了下列的 https://github.com/dotnet/corefx/issues/17226在线,但与那里描述的问题不同,执行服务器证书回调。我确实自己生成了证书,但它们都是由根 CA(安装在客户端和服务器上)签名的,并且所有详细信息都是正确的。
我还发现this https://stackoverflow.com/questions/40014047/add-client-certificate-to-net-core-httpclient,这表明客户端证书确实可以与 Windows 上 .NET Core 中的 HttpClient 配合使用。
我也尝试过显式设置 TLS 版本,但问题仍然存在。
我使用 Kestrel 作为网络服务器。它的配置如下:
.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 中的错误吗?有解决方法吗?