【发布时间】:2022-01-06 04:38:18
【问题描述】:
在 .NET 6 应用程序中使用 HttpClient 时,我遇到了一个奇怪的 TLS 错误。该代码非常简单,并且在 99.9% 的时间里都能正常工作。但是,有一个站点 (ultipro.com) 在 TLS 握手上一直失败。我查看了他们的站点/证书,他们使用 TLS1.2,这对于这个版本的 .NET 来说应该没问题。
我的代码:
try
{
string url;
//Examples: These do not work --> SSL Error
url = "https://recruiting.ultipro.com/LOS1000LADOD/JobBoard/5365ad6e-23ff-4703-bb77-1e9451fb855e/OpportunityDetail?opportunityId=3b914758-c414-4f1d-a8f2-7d5c0e453cca";
//url = "https://recruiting.ultipro.com/GRA1017GRYT/JobBoard/ae441110-89bd-444d-8ad2-b76c7b9db7a9/OpportunityDetail?opportunityId=acb56de2-b21f-49a1-9c48-7da6d7e47491"
//Example: Works fine
//url = "https://www.foxcareers.com/Search/JobDetail/R50016539";
using (var client = new HttpClient())
{
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, url);
var response = await client.SendAsync(httpRequestMessage);
if (response.IsSuccessStatusCode)
{
using (var contentStream = await response.Content.ReadAsStreamAsync())
{
StreamReader reader = new StreamReader(contentStream, Encoding.GetEncoding("utf-8"));
string content = reader.ReadToEnd();
}
}
else
{
Console.WriteLine("Internal server Error");
}
}
}
catch (Exception ex)
{
string errormsg = ex.Message;
}
错误:
The SSL connection could not be established, see inner exception.
Inner Exception: Authentication failed because the remote party sent a TLS alert: 'HandshakeFailure'.
Source: System.Net.Security
我已经尝试了所有我能想到的方法,包括添加/删除不同的标头和指定 TLS 版本。例如:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
这些 URL 在我的浏览器和 Postman 中运行良好。关于我忽略了什么的任何想法?
【问题讨论】:
-
可以通过ssllabs.com/ssltest/index.html查看详细信息和差异
-
尝试指定 HttpClientHandler.SslProtocols 来定义 TLS 协议。
-
我说“无法与安全服务器通信”,用于招聘.ultipro.com:ssllabs.com/ssltest/…。奇怪!
-
@Julian - 很好的提示,我注意到了同样的事情。也许这是他们的问题。但我仍然不明白为什么 Postman 和任何浏览器(Chrome/FF/Safari)都能正常工作??
标签: c# asp.net-core tls1.2 dotnet-httpclient .net-6.0