当前位置: 首页 > 知识库问答 >
问题:

NET 4.5中的默认SecurityProtocol

薛兴言
2023-03-14

与最多支持TLS1.2的服务器通信的默认安全协议是什么?默认情况下,.net是选择服务器端支持的安全性最高的协议,还是必须显式添加以下代码行:

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

除了代码更改之外,还有没有方法可以更改此默认值?

最后,.NET 4.0仅支持TLS1.0吗?也就是说,我必须将客户端项目升级到4.5以支持TLS1.2

我的动机是删除客户端对SSLv3的支持,即使服务器支持它(我已经有一个powershell脚本在计算机注册表中禁用它),并支持服务器支持的最高TLS协议。

更新:查看.NET 4.0中的ServicePointManager类,我没有看到TLS 1.01.1的枚举值。在.NET 4.0/4.5中,默认值都是SecurityProtocolType.tlsSecurityProtocolType.ssl3。希望在注册表中禁用sslv3不会破坏此默认值。

但是,我决定必须将所有应用程序升级到.NET4.5,并将SecurityProtocolType.tls SecurityProtocolType.tls11 SecurityProtocolType.tls12;显式添加到所有应用程序的所有引导代码中。

这将使对各种API和服务的出站请求不降级为SSLv3,并应选择最高级别的TLS

这种做法听起来是合理还是矫枉过正?我有许多应用程序要更新,我想在将来证明他们,因为我听说甚至TLS1.0可能会在不久的将来被一些提供商弃用。

作为一个向API发出出站请求的客户端,在注册表中禁用SSL3对.NET Framework有影响吗?默认情况下,TLS1.1和1.2没有启用,我们必须通过注册表启用它吗?请访问http://support.microsoft.com/kb/245030。

经过一些调查,我相信注册表设置不会有任何影响,因为它们适用于IIS(服务器子项)和浏览器(客户端子项)。

抱歉,这篇文章变成了多个问题,接着是“可能”的答案。

共有1个答案

桓宜
2023-03-14

一些留下评论的人注意到,将System.Net.ServicePointManager.SecurityProtocol设置为特定值意味着您的应用程序将无法利用将来的TLS版本,而将来的TLS版本可能会成为.NET将来更新时的默认值。您不需要指定固定的协议列表,而是可以打开或关闭您知道和关心的协议,而保留其他协议。

要在不影响其他协议的情况下打开TLS 1.1和1.2,请执行以下操作:

System.Net.ServicePointManager.SecurityProtocol |= 
    SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

注意使用=打开这些标志而不关闭其他标志。

关闭SSL3而不影响其他协议:

System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
 类似资料:
  • 问题内容: 在我的应用程序中,我有一个“编辑用户详细信息”页面,我想在相应的editText字段中显示当前名称,电子邮件地址等,然后用户可以删除它们并根据需要输入一个新名称。 有没有办法做到这一点?谢谢你的帮助 问题答案: 您可以用来设置EditText字段的当前文本。 例:

  • 问题内容: 我正在使用Hibernate来持久化该bean。 有什么用? 问题答案: CascadeType 默认为空数组 。请参见注释类型OneToOne中的CascadeType。 默认情况下,没有操作级联。

  • 问题内容: make中是否有一种机制可以允许默认的全局隐式规则在任何地方都可用,类似于内置规则? Make提供了一些内置的隐式规则来编译C / C ++ / Fortran文件,甚至不需要简单的情况。但是,在编译其他语言(例如Go编程语言文件)时,始终需要a。我想扩展我的Makeenvironment,使其默认具有隐式规则。 问题答案: 通常这是不可取的,因为这会导致Makefile的可移植性降低

  • 问题内容: 如何在Doctrine 2中设置默认值? 问题答案: 数据库默认值不受“便携式”支持。使用数据库默认值的唯一方法是通过mapping属性,在该属性中为字段所映射的列指定代码段(包括原因在内)。 您可以使用: 最好使用PHP级别的默认值,因为这些值也可以在新创建和持久保存的对象上正确使用(持久保存新对象以获取默认值后,Doctrine不会返回数据库)。

  • 我有一个关于RDD中默认分区的问题。 我不知道为什么会这样。你能帮忙吗。 谢了!