C# 控制台应用程序 HttpClient 抛出 "System.Net.Http.WinHttpException: A security error occurred"
C# Console Application HttpClient throws "System.Net.Http.WinHttpException: A security error occurred"
我在 Windows Server 2012 R2 中有一个带有 .Net framework 4.6 运行 的 C# 控制台应用程序。我正在使用 "IIS Crypto 3.1" 更改安全协议中的一些设置,但在使用 "IIS Crypto" 中称为 "Best Practices" 的功能(自动设置客户端和服务器协议)后,我无法获得我的应用程序再次通过 HttpClient 调用任何 URL(它以前可以工作)。这是我的代码:
using (HttpClient hc = new HttpClient())
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11
| SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain,
errors) => { return true; };
var response = await hc.GetAsync(download_path);
content = response.Content;
}
这是我在点击 "hc.GetAsync()" 后得到的异常:
System.AggregateException: One or more errors occurred. ---> System.AggregateExc
eption: One or more errors occurred. ---> System.Net.Http.HttpRequestException:
An error occurred while sending the request. ---> System.Net.Http.WinHttpExcepti
on: A security error occurred
这是我的安全协议的当前设置:
不幸的是,我不知道如何恢复我在此处更改的设置(此应用更改了一些注册表项)。
更新:
所以问题似乎只出现在为 Telegram Bot API 调用特定 URL 时(就像 https://api.telegram.org/....)。对于其他 URLs(据我所知),这个全新的设置仍然有效。我必须说之前的设置可以完美地与这个相同的 URL.
经过7个小时的不断奋斗,终于找到了问题所在。显然 "IIS Crypto" 在 windows 服务器 2012 R2 中更改了 "Cipher Suites" 的顺序。我只是 enabling/disabling 协议本身,而不是它们的密码顺序。将密码套件的顺序更改为默认顺序后(请注意,此顺序是 OS 特定的。因此它在 Windows Server 2008、2012、2016 中有所不同,...我找到了默认值在 "IIS Crypto" 网页中。)
似乎 Telegram 服务器对密码套件的顺序很敏感,并且在更改时不响应(我不知道这里的确切技术)。所以这就是它在 Windows Server 2012 R2 中的样子:
此外,我在笔记本电脑 运行ning windows 10 中检查了 IIS Crypto,在使用完全相同的功能(即 "best practices")后,我没有 运行 任何问题。所以这个问题似乎与 Windows Server 2012 R2
有某种关系
我在 Windows Server 2012 R2 中有一个带有 .Net framework 4.6 运行 的 C# 控制台应用程序。我正在使用 "IIS Crypto 3.1" 更改安全协议中的一些设置,但在使用 "IIS Crypto" 中称为 "Best Practices" 的功能(自动设置客户端和服务器协议)后,我无法获得我的应用程序再次通过 HttpClient 调用任何 URL(它以前可以工作)。这是我的代码:
using (HttpClient hc = new HttpClient())
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11
| SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain,
errors) => { return true; };
var response = await hc.GetAsync(download_path);
content = response.Content;
}
这是我在点击 "hc.GetAsync()" 后得到的异常:
System.AggregateException: One or more errors occurred. ---> System.AggregateExc
eption: One or more errors occurred. ---> System.Net.Http.HttpRequestException:
An error occurred while sending the request. ---> System.Net.Http.WinHttpExcepti
on: A security error occurred
这是我的安全协议的当前设置:
不幸的是,我不知道如何恢复我在此处更改的设置(此应用更改了一些注册表项)。
更新:
所以问题似乎只出现在为 Telegram Bot API 调用特定 URL 时(就像 https://api.telegram.org/....)。对于其他 URLs(据我所知),这个全新的设置仍然有效。我必须说之前的设置可以完美地与这个相同的 URL.
经过7个小时的不断奋斗,终于找到了问题所在。显然 "IIS Crypto" 在 windows 服务器 2012 R2 中更改了 "Cipher Suites" 的顺序。我只是 enabling/disabling 协议本身,而不是它们的密码顺序。将密码套件的顺序更改为默认顺序后(请注意,此顺序是 OS 特定的。因此它在 Windows Server 2008、2012、2016 中有所不同,...我找到了默认值在 "IIS Crypto" 网页中。) 似乎 Telegram 服务器对密码套件的顺序很敏感,并且在更改时不响应(我不知道这里的确切技术)。所以这就是它在 Windows Server 2012 R2 中的样子:
此外,我在笔记本电脑 运行ning windows 10 中检查了 IIS Crypto,在使用完全相同的功能(即 "best practices")后,我没有 运行 任何问题。所以这个问题似乎与 Windows Server 2012 R2
有某种关系