我无法在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中的一个错误吗?是否有解决方法?