c# - 请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest
问题描述
我正在向 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 server 2016。相同的 API 在 Microsoft 云中的生产环境中工作。不确定确切的服务器版本。
有什么办法可以解决这个问题。
更新 密码套件中没有证书算法。按照以下文档添加密码套件,问题现已解决。
https://docs.microsoft.com/en-us/windows-server/security/tls/manage-tls
解决方案
不幸的是,您还不能解决这个问题。
.NET Framework 只是委托底层 Windows 平台 WinINet/SChannel API 进行传出 HTTPS 调用,而 Windows Server 2016 上的 WinINet/SChannel 尚未推出,并进行必要的更改以允许 TLS 1.3 传出连接。
面向 Framework 4.7.1 及更高版本的应用程序将自动使用运行它的操作系统上可用的最高 TLS 版本,如果您连接的服务器不支持它,则回退到较低版本,因此您不需要以下代码(除非您当前的代码 [或依赖项] 已经使用较低版本调用它)。
如果您在 Framework < 4.7.1 上遇到困难,您可以为最终的 Windows 更新准备代码:
// 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 版本。
有关详细信息,请参阅以下参考资料:
推荐阅读
- python - 为什么 python 将我的字典转换为列表?
- visual-studio-code - 如何切换警告曲线vscode
- c++ - 为二维数组和多列实现合并排序
- python - 如何让电报机器人等待回复?
- java - Twilio 在whatsup 中发送位置
- d3.js - 如何使用 d3.scale.linear 在 d3 中为地图着色
- hyperledger-fabric - 如何在fabric中设置只读操作
- db2 - “XHZ64408”没有执行“IMPLICIT CREATE SCHEMA”操作的权限
- angular - 出现错误类型错误:this.fileUpload.upload 不是函数
- swift - 如何在 Xcode 中引用资源?