我们正在做同样的事情。要仅支持TLS 1.2且不支持SSL协议,您可以执行以下操作:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
SecurityProtocolType.Tls仅为TLS 1.0,并非所有TLS版本。
作为一方:如果你想检查你的网站是否允许SSL连接,你可以在这里这样做(我不认为这会受到上述设置的影响,我们不得不编辑注册表以强制IIS使用TLS用于传入连接): https://www.ssllabs.com/ssltest/index.html
要在IIS中禁用SSL 2.0和3.0,请参阅此页面: https://www.sslshopper.com/article-how-to-disable-ssl-2.0-in-iis-7.html
我发现最简单的解决方案是添加两个注册表项,如下所示(在具有管理员权限的命令提示符下运行):
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:32 reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
这些条目似乎影响.NET CLR在作为客户端建立安全连接时选择协议的方式。
此处有关于此注册表项的更多信息:
https://docs.microsoft.com/en-us/security-updates/SecurityAdvisories/2015/2960358#suggested-actions
这不仅简单,而且假设它适用于您的情况,远比基于代码的解决方案更强大,这需要开发人员跟踪协议和开发并更新所有相关代码。希望可以为TLS 1.3及更高版本进行类似的环境更改,只要.NET保持愚蠢到不能自动选择最高可用协议。
的 注意 强> :尽管如上所述,根据上面的文章,这只是假设禁用RC4,人们不会认为这会改变是否允许.NET客户端使用TLS1.2 +,由于某种原因它确实具有这种效果。
的 注意 强> :正如@Jordan Rieger在评论中指出的那样,这不是POODLE的解决方案,因为它没有 禁用 较旧的协议a - 它只允许客户端使用较新的协议,例如当修补的服务器禁用旧协议时。然而,在MITM攻击中,显然受损的服务器将为客户端提供较旧的协议,客户端将很乐意使用该协议。
的 去做 强> :尝试使用这些注册表项禁用客户端使用TLS1.0和TLS1.1,但我不知道.NET http客户端库是否遵循这些设置:
https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-10
https://docs.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-11
@沃森
在Windows窗体上,它可以在课程顶部放置
static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; //other stuff here }
因为windows是单线程的,所以你需要它,如果它是一个服务你需要把它放在服务的调用之上(因为没有告诉你将在哪个线程)。
using System.Security.Principal
也需要。
我不得不抛出等价的整数来解决我仍在使用.NET 4.0这一事实
System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; /* Note the property type [System.Flags] public enum SecurityProtocolType { Ssl3 = 48, Tls = 192, Tls11 = 768, Tls12 = 3072, } */
如果您对.NET支持的协议感到好奇,可以尝试使用HttpClient https://www.howsmyssl.com/
// set proxy if you need to // WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128"); File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result); // alternative using WebClient for older framework versions // new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html");
结果是该死的:
您的客户端正在使用TLS 1.0,它很老,可能容易受到BEAST攻击,并且没有可用的最佳密码套件。用于替换MD5-SHA-1的AES-GCM和SHA256等附加功能不适用于TLS 1.0客户端以及更多现代密码套件。
正如Eddie上面解释的那样,您可以手动启用更好的协议:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
我不知道它为什么会使用开箱即用的坏协议。这似乎是一个糟糕的设置选择,相当于一个主要的安全漏洞(我打赌大量的应用程序不会改变默认值)。我们怎么报告呢?