HttpClient 证书错误

Posted

技术标签:

【中文标题】HttpClient 证书错误【英文标题】:HttpClient Certificate Errors 【发布时间】:2017-11-30 17:42:04 【问题描述】:

谁能告诉我为什么这会引发证书无效的错误?在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 标头设置为与证书匹配,我就从未见过此问题。

【问题讨论】:

【参考方案1】:

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 是绕过证书问题的原因。

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

【讨论】:

非常感谢这样的调试提示!【参考方案2】:

你也可以使用DangerousAcceptAnyServerCertificateValidator:

HttpClientHandler httpClientHandler = new()  
  ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
;

【讨论】:

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

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

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

找不到 SSL 证书的 Java HttpClient 错误,在代码中使用证书作为字符串?

HttpClient 无法忽略或绕过自签名证书错误

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

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