Update .NET web service to use TLS 1.2
我需要使用TLS 1.2从我的.NET Web服务连接到另一个将强制使用TLS 1.2的服务。我发现一个资源说.net 4.6默认使用tls 1.2,所以听起来像是最简单的解决方案。我更新了服务器上的.NET框架并重新启动。在IIS中,我尝试使用.NET 4.6创建应用程序池,但只有4.0是唯一的选项。然后我发现一些东西说它仍然会说4.0,因为4.6是对.NET 4.0的"就地"更新。所以我想也许我完了。然而,在我得到的一个错误页面上,由于不相关的原因,它说Microsoft .NET Framework Version:4.0.30319,所以看起来我没有成功升级。关于如何确保我的应用程序池正在使用.NET 4.6,或者更一般地说,如何启用TLS 1.2,有什么建议吗?
- 我相信TLS12必须在服务器上启用。支持.quovadisglobal.com/kb/a433/…
- 为什么投反对票?
我们实际上只是将.NET Web服务升级到4.6以允许TLS 1.2。
阿耳特姆所说的是我们迈出的第一步。我们将Web服务的框架重新编译为4.6,并尝试更改注册表项以启用TLS 1.2,尽管这不起作用:连接仍在TLS 1.0中。此外,我们不想在计算机上禁用SLL 3.0、TLS 1.0或TLS 1.1:其他Web服务可能正在使用此功能;我们在注册表上回滚了所做的更改。
我们实际上更改了web.config文件,告诉IIS:"嘿,请在4.6中运行我"。
以下是我们在.NET 4.6的web.config+重新编译中添加的更改:
1 2 3 4 5 6 7 8 9
| <system.web>
<compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->
<!--Added this httpRuntime -->
<httpRuntime targetFramework="4.6" />
<pages controlRenderingCompatibilityVersion="4.0"/>
</system.web> |
连接改为TLS 1.2,因为IIS现在在4.6中运行Web服务(明确告知),而4.6默认情况下使用的是TLS 1.2。
- 以下是我们用于研究的文档:httpruntime、renderingcompatibility
- 我对web.config做了这些修改,重新构建、部署,我得到了System.Net.WebException: The request failed with an empty response.,我不知道它是来自我的终端还是另一方面的问题。知道如何验证我使用的是TLS 1.2吗?
- 您可以使用网络协议分析器(如wireshark)来验证连接的状态。
- 我知道了-我没有请求https。在我修好之后,它起作用了。
- @我用的是.NET 4.5。所以我在代码中进行了更改,比如:securityprotocol=tls_tls1_tls2或securityprotocol=tls2??哪一个正确,使其符合TLS。
- @苏妮拉两个都应该没事。在这两种情况下,您都接受TLS 1.2。在第二种情况下,它不应接受tls 1.0/tls1.1作为连接的协议。在我们的例子中,我们没有更改任何代码;我们只更改了应用程序框架。
- 在我们的例子中,将编译改为4.6并添加httpruntime 4.6就足够了,谢谢您的解决方案!
- 这完全是正确的答案。最近刚经历过。这是一篇关于它的博客文章:blog.thelevelup.com/pci-security-is-your-restaurant-ready和一个Github项目:Github.com/thelevelup/pos-tls-patcher
- 谢谢您!--在我的例子中,我有两个并排的程序,都是用4.6版编译的,理论上是用4.6版编译的,一个工作,另一个失败。我顿悟到一个网站使用的是旧的网络技术,因此默认情况下可能使用的是旧版本,我找到了这个答案,瞧。感谢您包括选择框架的其他方法——因为我用3.5呈现,所以心里很平静!
- 所有这些配置在我的项目配置文件中都可用,它用于作为默认版本的tls,但我想使用tls12。然后我添加了system.net.servicePointManager.securityProtocol=securityProtocolType.tls12;因此它强制服务在末尾使用tls12版本。
- docs.microsoft.com/en-us/dotnet/framework/network programmin&zwnj;&8203;g/&hellip;
- 上面的url by spikej=>"带有.NET框架的传输层安全性(tls)最佳实践"
在实例化Web服务客户端之前添加以下代码:
1
| System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; |
或与TLS 1.1及之前版本的向后兼容:
1
| System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; |
- 是的,我已经这样做了,但错误消息仍然指示.NET 4.0。
- 这是你的clr版本。.NET CLR有两个版本,2.0和4.0。在IIS中,您指定的是clr版本,而不是框架版本。我不会告诉你.NET 4.6,因为它不在乎。如果使用4.6进行编译,则使用4.6。
- 从.NET 4.5开始支持TLS 1.2
- 对于vb.net:system.net.servicePointManager.securityProtocol=directcast(3072,system.net.securityProtocolType)
- @johnwu:我相信如果我们在一个项目的主程序中编写这个命令,那么所有具有相同exe的Web请求都将使用指定的协议。如果不是,请纠正我。
- @该协议已经谈判。设置启用它。
- @johnwu:考虑服务器上启用了指定的协议。客户机使用WinForm应用程序在按照建议指定协议后下载数据。然后每个Web请求都将使用相同的协议。正确的?
- 在这种情况下,=优于just=。它们是二进制标志,不要不必要地覆盖其他所有内容。
- @约翰乌-请注意上面伊兹的评论。您的代码告诉.NET在连接到HTTPS资源时只显式使用TLS 1.2。也就是说,如果服务器只有TLS 1.1,那么您的代码会阻止它连接,因为它只使用TLS 1.2。当客户机和服务器协商要使用的协议时,您应该使用=来告诉您的代码"尝试使用TLS 1.2作为选项"。
如果您使用的.NET早于4.5,那么在枚举中就不会有TLS12,因此这里显式地提到了状态
1
| ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; |
需要三个步骤:
通过将Enabled=0和DisabledByDefault=1添加到注册表(完整路径为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols中),在服务器计算机上明确标记ssl2.0、tls1.0、tls1.1为禁止。有关详细信息,请参见屏幕
按照1中的步骤显式启用TLS1.2。只需分别使用Enabled=1和DisabledByDefault=0。
注:验证服务器版本:Windows Server 2003不支持TLS 1.2协议
仅在应用程序级别启用TLS1.2,如上面建议的@john wu。
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
希望本指南能有所帮助。
更新正如@subbu提到的:官方指南
- 官方参考-technet.microsoft.com/en-us/library/&hellip;
- hi@artem添加tls后需要重新启动服务器吗?
- 坦白说,我没有为此做过调查
对我来说,以下工作:
步骤1:从https://www.microsoft.com/en-us/download/details.aspx下载并安装Web安装程序exe?应用服务器上的ID=48137。安装完成后重新启动应用程序服务器。
步骤2:在web.config中添加以下更改
1 2 3 4 5
| <system.web>
<compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->
<!--Added this httpRuntime -->
<httpRuntime targetFramework="4.6" />
</system.web> |
步骤3:完成步骤1和2后,它给出了一个错误:"WebForms UnobtrusiveValidationMode需要'jQuery'的ScriptResourceMapping。"请添加名为jquery(区分大小写)的脚本资源映射,为了解决此错误,我在web.config文件的appsettings中添加了以下键