Ian Kemp 的答案没有问题,但我只是想提供另一个答案,这意味着您不必重新编译代码。
任何高于 .NET 4.5 的版本都可以支持 TLS 1.2,但低于 .NET 4.7 的默认版本是 TLS 1.1。因此,如果您需要使用 TLS 1.2 访问某些内容,则会出现错误,因为它将尝试使用默认值。
您可以将以下代码添加到配置文件中,以覆盖默认值。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
</runtime>
更新
对于 .NET Framework 4.7 及更高版本,默认由操作系统选择最佳安全协议和版本。
对于 .NET Framework 4.6 到 4.6.2,AppContext 开关可以放在 app.config 或 webconfig 中,因为系统默认设置为较低的 TLS 或 SSL 版本。
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=false"/>
</runtime>
对于 .NET Framework 4.5 到 4.5.2,需要设置注册表项 SchUseStrongCrypto 和 SystemDefaultTlsVersions。
HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SchUseStrongCrypto
SchUseStrongCrypto 注册表项具有 DWORD 类型的值。值 1 会导致您的应用使用强加密,值 0 会禁用强加密。强加密使用更安全的网络协议(TLS 1.2、TLS 1.1 和 TLS 1.0)并阻止不安全的协议。对于 .NET Framework 4.5.2 或更早版本,键默认为 0。在这种情况下,您应该将其值显式设置为 1。
HKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node\]Microsoft\.NETFramework\<VERSION>: SystemDefaultTlsVersions
SystemDefaultTlsVersions 注册表项具有 DWORD 类型的值。值为 1 会使您的应用程序允许操作系统选择协议。值 0 会导致您的应用使用 .NET Framework 选择的协议。
如果应用程序以 .NET Framework 4.6.1 或更早版本为目标,则键默认为 0。在这种情况下,您应该将其值显式设置为 1。
对于在 32 位操作系统上运行的 32 位应用程序和在 64 位操作系统上运行的 64 位应用程序的示例,请更新以下子项值:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001
对于在 64 位操作系统上运行的 32 位应用程序,请更新以下子项值:
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions" = dword:00000001
"SchUseStrongCrypto" = dword:00000001