我有一个 .NET 4.8 应用程序,它是一个小型 Excel 插件(因此在 Office/Excel 中运行),它执行 HTTP (REST) 请求并在 Excel 中显示数据。
在网络服务器上,我们重新配置为仅允许 TLS 1.2,突然 HTTP 请求不再与此 WebException 一起工作:
The underlying connection was closed: An unexpected error occurred on a send.
测试客户端操作系统是 Windows 10 和 8(已完全修补)。因此,根据https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls支持 TLS 1.2 :“支持,并默认启用。”
在 PowerShell 中执行以下命令给出:
[Net.ServicePointManager]::SecurityProtocol
SystemDefault
Run Code Online (Sandbox Code Playgroud)
以下注册表项(在文档和博客中经常提到)未设置(它们不存在 - 也不是 WOW6432Node 变体):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SystemDefaultTlsVersions
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp\DefaultSecureProtocols
Run Code Online (Sandbox Code Playgroud)
设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\SchUseStrongCrypto=1“修复”该问题。
我还可以手动启用 TLS 1.2,问题就会消失,但这会将控制权从操作系统移回应用程序,这似乎不是 .NET 4.8 的基本思想:
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13;
我的问题:
SystemDefault.NET 中的计算结果。我怎样才能找到这个?