我的WPF应用连接到Azure Web API。端点将配置为拒绝访问任何非安全(HTTP)或安全性较弱(带有TLS 1.0或更旧版本的HTTPS)请求。但是我也希望我的应用程序永远不要尝试发送不安全或安全性较弱的请求。
Microsoft建议here和there以Framework 4.7为目标,并将ServicePointManager.SecurityProtocol
保留为其默认值,以便操作系统确定要使用的协议。
我提到的第二篇文章还指出Windows 7将依赖TLS 1.0,强烈建议不要依赖TLS 1.0。因此,我了解我可以信任操作系统以获取其可获得的最佳安全性,但是如果最佳选择仍然是一个糟糕的选择,则不能信任操作系统不发送请求。
我的应用依赖System.Net.Http.HttpClient
。我想确保通过此客户端发出的呼叫是:
SecurityProtocolType
enum进行按位组合,但不包括.ssl3
和.Tls
,但这也将排除任何将来的技术(TLS1.4?)。现在this answer字段已添加到枚举,.SystemDefault
仍然为真吗?正如Devs在HttpClient协商从OS传递TLS之前所说,尤其是在W7中。默认情况下,未启用该功能以允许应用程序正确使用该功能。为了解决这个问题,如果您不想在运行应用程序时在计算机上更新.NET框架,或者您不对操作系统进行任何更新,则需要更新注册表上的某些项。您可以通过VB.Net中的代码来实现。在下面的示例中,我想向您显示需要更新/设置的键。同样,如果您获得此代码和cretae .reg文件并尝试执行,则可以解决计算机中的问题,但对于分布式应用程序,则需要通过在安装了应用程序的每台计算机中的代码来执行此操作。请注意,标签v2.0.50727或标签v4.0.30319是计算机上安装的.Net Framework的版本。这意味着您必须先了解安装的版本(也可以通过注册表或代码获取该信息),以及您的应用程序是否在这些版本之一中编译。您只能更新您的应用程序所使用的版本。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v2.0.50727]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SystemDefaultTlsVersions"=dword:00000001
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001