请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest

Posted

技术标签:

【中文标题】请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest【英文标题】:The request was aborted could not create SSL/TLS secure channel - HttpWebRequest 【发布时间】:2021-02-27 11:57:04 【问题描述】:

我正在向 3rd 方 api 发出网络请求,它工作正常。在 API 证书更改之间,现在当我从我们的开发环境发出请求时,我收到响应,因为请求被中止,无法创建 SSL/TLS 安全通道。 我尝试在代码中设置不同的协议,响应没有变化。我在资源管理器中也遇到了不同的错误。但这在启用 SSL 3 后得到修复。 我在代码中使用 httpwebrequest。最初的 dll 在 .net 3.5 中,现在已更新到 .net 4.6。 在 Firefox 中检查证书详细信息时,我可以看到证书是 TLS 1.3。据我了解,.net 4.6.1 不支持它,因为当我设置它的 TLS 值时出现协议不支持错误。 开发环境是 Windows 服务器 2016。相同的 API 在 Microsoft 云中的生产环境中工作。不确定确切的服务器版本。

有什么办法可以解决这个问题。

更新 密码套件中没有证书算法。按照以下文档添加密码套件,问题现已解决。

https://docs.microsoft.com/en-us/windows-server/security/tls/manage-tls

【问题讨论】:

【参考方案1】:

密码套件中没有证书算法。按照以下文档添加密码套件,问题现已解决。

https://docs.microsoft.com/en-us/windows-server/security/tls/manage-tls

【讨论】:

【参考方案2】:

很遗憾,您还无法解决此问题。

.NET Framework 只是委托底层 Windows 平台 WinINet/SChannel API 进行传出 HTTPS 调用,而 Windows Server 2016 上的 WinINet/SChannel 尚未推出,并进行必要的更改以允许 TLS 1.3 传出连接。

面向 Framework 4.7.1 及更高版本的应用程序将自动使用运行它的操作系统上可用的最高 TLS 版本,如果您连接的服务器不支持它,则回退到较低版本,因此您不会不需要以下代码(除非您当前的代码 [或依赖项] 已经使用较低版本调用它)。

如果您被框架

// From .NET Framework 4.8.0, simply use SecurityProtocolType.Tls13
// (or rather don't use this code at all from 4.7.1, configure the TLS versions in the OS)
const SecurityProtocolType tls13 = (SecurityProtocolType)12288;

ServicePointManager.SecurityProtocol = tls13 | SecurityProtocolType.Tls12;

(有些网站可能还要求您附加| SecurityProtocolType.Tls11,但这些网站确实应该更新它们的服务器)。

SecurityProtocolType 的值为 12288,表示 TLS 1.3,现在将面向未来并传递到底层 Windows API 层,但如果您正在调用的站点仅使用 TLS 1.3,则现在将引发异常:

Win32Exception: 客户端和服务器无法通信,因为它们没有共同的算法

因此,此修复仅在 TLS 1.3 支持推广到 Windows Server 之后才有效。

Windows 10 和 Windows Server 1903 对此有实验性支持,但如果您无法从 4.6 升级您的 .NET Framework,我怀疑您是否可以安装使用实验性功能的 Windows Server 版本。

有关详细信息,请参阅以下参考资料:

Microsoft TLS 1.3 Support Reference Transport Layer Security (TLS) best practices with the .NET Framework TLS1.3 is it supported? Protocols in TLS/SSL (Schannel SSP)

【讨论】:

@CodeCaster 当我从资源管理器调用域时,我收到此错误“在高级设置中打开 TLS 1.0、TLS 1.1 和 TLS 1.2 并尝试再次连接。如果此错误仍然存​​在,它此站点可能使用了不受支持的协议或密码套件,例如 RC4(详细信息的链接),这被认为是不安全的。请联系您的站点管理员。”。当我在资源管理器设置中启用 ssl3 时,错误消失了,链接将在资源管理器中开始工作。那么它是如何在同一系统中的资源管理器和其他浏览器中工作但在代码中不起作用的。 @Suhail SSL3 不是 TLS 1.3。 SSL3 是旧的、不安全的,应该被禁用。 IE 使用 SChannel。如果启用 SSL3 可以为 Internet Explorer 修复它,它也应该适用于 C#(因为两者都使用 SChannel),请尝试 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | System.Net.SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 我们都知道这是一个 Windows 问题。我相信作为 Microsoft 更新的一部分,在过去几年中推动将 TLS 1.3 添加到 Windows。我看不出微软不会在所有服务器上实施 TLS 1.3。 c# 中的 TLS 枚举与 windows 中的相同,所有 c# 代码所做的只是将 TLS 模式传递给 windows。 SChannel 是 Windows 中提供一种发出 HTTPS 请求的方式的核心组件,尚未更新以支持 TLS 1.3,除了Windows 10 和 Windows Server 1903 及更高版本,其中包含它用于测试目的,而非生产用途。这不包括 Server 2016。构成 SChannel 的 DLL 不包含在 Windows Server 2016 上使用 TLS 1.3 所需的算法(“密码套件”)。它在“最后一对”中更新添加 TLS 1.3 的年数。 当然,没关系。我知道你说不想一次性跳进篮球圈是什么意思。例如,如果仅在一个地方使用,我不一定会将代码分解为函数。但我认为这些类型的符号常数是不同的。任何时候你发现自己在声明的左边写了一个注释,你可能应该引入一个符号常量。这是一个很好的答案,我真的只是在吹毛求疵,无论是评论还是语法编辑。

以上是关于请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest的主要内容,如果未能解决你的问题,请参考以下文章

HttpClientHandler / 请求被中止:无法创建 SSL/TLS 安全通道

Braintree 中的“请求被中止:无法创建 SSL/TLS 安全通道”错误

请求被中止:无法为 HttpWebRequest 创建 SSL/TLS 安全通道

请求被中止:无法创建 SSL/TLS 安全通道 - 没有证书

错误 Paypal 沙箱:请求被中止:无法创建 SSL/TLS 安全通道

发出请求时出错:请求被中止:无法创建 SSL/TLS 安全通道