HttpClient证书错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpClient证书错误相关的知识,希望对你有一定的参考价值。

有人能告诉我为什么这会导致证书无效的错误?在PowerShell中,当我在Invoke-WebRequest中使用IP地址并将主机头设置为与证书中的CN匹配时,我没有得到证书错误。我会认为HttpClient会是一样的吗?

var spHandler = new HttpClientHandler();
var spClient = new HttpClient(spHandler);
spClient.BaseAddress = new Uri("https://10.0.0.24");
var spRequest = new HttpRequestMessage(HttpMethod.Get, "/api/controller/");
spRequest.Headers.Host = "somehost.com";
var spResponse = await spClient.SendAsync(spRequest);

错误:

WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
AuthenticationException: The remote certificate is invalid according to the validation procedure.

此代码是监视器实用程序的一部分,我们需要能够探测负载平衡器后面的每个Web前端。我们使用PowerShell做了很多事情,只要我设置Host标头以匹配证书,我就没有见过这个问题。

答案

HttpClient中的默认行为是,如果证书有任何问题,则抛出错误。

如果要绕过此行为,可以将代码更改为:

var spHandler = new HttpClientHandler()
{
  ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
  {
    Console.WriteLine($"Sender: {sender}");
    Console.WriteLine($"cert: {cert}");
    Console.WriteLine($"chain: {chain}");
    Console.WriteLine($"sslPolicyErrors: {sslPolicyErrors}");
    return true;
  }
};

var spClient = new HttpClient(spHandler);
spClient.BaseAddress = new Uri("https://10.0.0.24");
var spRequest = new HttpRequestMessage(HttpMethod.Get, "/api/controller/");
spRequest.Headers.Host = "somehost.com";
var spResponse = await spClient.SendAsync(spRequest);

所有Console.WriteLine的东西只是你看到证书信息,你可以在你了解正在发生的事情后删除它。

return true绕过了证书问题。

小心在生产中使用它,最好的解决方案是检查证书问题。

以上是关于HttpClient证书错误的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient 证书错误

HttpClient证书错误

C# HttpClient 是不是忽略 SSL 证书错误?

解决httpclient访问ssl资源报证书错误的问题

如何忽略 Apache HttpComponents HttpClient 5.1 中的 SSL 证书错误

HttpClient 怎么忽略证书验证访问https