.net - 禁用 SSL 回退并仅将 TLS 用于 .NET 中的出站连接? ( Poodle 缓解)

标签 .net ssl

我正在尝试减轻我们对 Poodle SSL 3.0 Fallback 的脆弱性攻击。我们的管理员已经开始禁用 SSL 以支持 TLS 用于与我们服务器的入站连接。我们还建议我们的团队在他们的网络浏览器中禁用 SSL。我现在正在查看我们的 .NET 代码库,它通过 System.Net.HttpWebRequest 启动与各种服务的 HTTPS 连接。 .我相信,如果这些连接允许从 TLS 回退到 SSL,它们可能容易受到 MITM 攻击。到目前为止,这是我确定的。有人可以仔细检查一下以验证我是对的吗?这个漏洞是全新的,所以我还没有看到微软关于如何在 .NET 中缓解它的任何指导:

  1. 支持 .NET 中安全通信的 System.Net.Security.SslStream 类允许的协议(protocol)是通过 System.Net.ServicePointManager.SecurityProtocol 为每个 AppDomain 全局设置的属性(property)。

  2. 此属性在 .NET 4.5 中的默认值为 Ssl3 | Tls(尽管我找不到支持它的文档。)SecurityProtocolType 是一个具有 Flags 属性的枚举,因此它是这两个值的按位 OR。您可以使用以下代码行在您的环境中进行检查:

    Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol.ToString());

  3. 在您的应用程序中启动任何连接之前,这应该更改为仅 Tls,或者可能是 Tls12:

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls;

  4. 重要提示:由于该属性支持多个按位标志,我假设 SslStream 在握手期间不会自动回退到其他未指定的协议(protocol)。否则,支持多个标志有什么意义?

TLS 1.0 与 1.1/1.2 的更新:

根据 Google 安全专家 Adam Langley 的说法,TLS 1.0 was later found to be vulnerable to POODLE if not implemented correctly ,因此您应该考虑专门转向 TLS 1.2。

.NET Framework 4.7 及更高版本的更新:

正如 Prof Von Lemongargle 所暗示的那样下面,从 .NET Framework 4.7 版开始,无需使用此 hack,因为默认设置将允许操作系统选择最安全的 TLS 协议(protocol)版本。参见 Transport Layer Security (TLS) best practices with the .NET Framework获取更多信息。

最佳答案

我们正在做同样的事情。要仅支持 TLS 1.2 而不支持 SSL 协议(protocol),您可以这样做:

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

关于.net - 禁用 SSL 回退并仅将 TLS 用于 .NET 中的出站连接? ( Poodle 缓解),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389899/

相关文章:

php - 谷歌音译在 SSL 访问网站中不起作用

php - Codeigniter + SSL + .htaccess + 无限重定向

python foursquare - SSL3证书验证失败

python - 无法使用 Raspberry Pi 删除 Python virtualenv 中的 SSL 安全错误

.net - 如何判断一个对象是否是一个结构体?没有“GetType(Object).IsStructure 函数

c# - 一个语句怎么可能同时有 = 和 ==?

c# - 如何将 A<T> 类型的泛型对象转换为 A<T'>?

java - AIX 上的 "SunX509 TrustManagerFactory not available"(SSL 网络服务客户端)

c# - 如何解决命名空间冲突?

c# - 将参数传递给方法绑定(bind)