将.NET Web服务更新为使用TLS 1.2

151

我需要使用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?


4
我认为服务器必须启用TLS12。请参考以下链接了解如何在Windows Server 2008 R2上启用TLS 1.2:https://support.quovadisglobal.com/kb/a433/how-to-enable-tls-1_2-on-windows-server-2008-r2.aspx - lcryder
8个回答

197

我们实际上只是将一个.NET web服务升级到了4.6版本,以支持TLS 1.2。

Artem所说的是我们采取的第一步。我们重新编译了web服务的框架为4.6版本,并尝试更改注册表键以启用TLS 1.2,但这没有起作用:连接仍处于TLS 1.0状态。此外,我们不希望禁止机器上的SLL 3.0、TLS 1.0或TLS 1.1,因为其他web服务可能在使用它们。所以我们在注册表上撤销了更改。

我们实际上修改了Web.Config文件,告诉IIS:“嘿,请在4.6中运行我”。

以下是我们在web.config中添加的更改 + 重新编译为.NET 4.6:

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->

    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />

    <authentication mode="Windows"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>

由于IIS现在以4.6的形式运行Web服务,并且4.6默认使用TLS 1.2,因此连接已更改为TLS 1.2。


3
这是我们用于研究的文档:HTTPRuntimeRenderingCompatibility - Etienne Faucher
9
在我们的情况下,将编译版本更改为4.6并添加httpRuntime 4.6就足够了,感谢你提供的解决方案! - krilovich
3
这完全是正确的答案。最近我刚经历了这个过程。以下是一个有关此事的博客文章:http://blog.thelevelup.com/pci-security-is-your-restaurant-ready/ 还有一个可以执行此操作的 GitHub 项目:https://github.com/TheLevelUp/pos-tls-patcher - user24601
2
https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls - spikej
2
我感到有义务指出,最好的解决方案是针对.NET 4.7进行目标设置——如果您特定的平台支持4.7并且升级.NET是一个真正的选择。 - user24601
显示剩余14条评论

170

在实例化您的 Web 服务客户端之前,请添加以下代码:

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

或者为了与TLS 1.1及之前版本兼容:

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

2
是的,我已经这样做了,但错误信息仍然显示.NET 4.0。 - nasch
14
那是您的CLR版本。.Net CLR 有两个版本,2.0和4.0。在IIS中,您需要指定CLR版本,而不是框架版本。 IIS不会告诉您使用的是.Net 4.6,因为它并不关心这一点。如果您使用4.6编译,则正在使用4.6。 - user47589
4
.NET 4.5及以后版本支持TLS 1.2。 - Gilberto Alexandre
6
在这种情况下,使用“|=”比仅使用“=”更好。它们是二进制标志,不必要地覆盖其他所有内容。 - Izzy
2
@JohnWu - 请注意Izzy上面的评论。你的代码告诉.NET在连接HTTPS资源时明确地仅使用TLS 1.2。也就是说,如果服务器只有TLS 1.1,由于代码仅使用TLS 1.2,所以您的代码无法连接。当客户端和服务器协商要使用哪个协议时,您应该使用 |= 告诉您的代码“尝试将TLS 1.2作为选项之一”。 - Don Cheadle
显示剩余8条评论

41

如果您正在使用早于4.5的 .Net 版本,则枚举中将没有 Tls12,因此需要显式说明状态,请参见 这里

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

谢谢。这对我很有帮助。对于任何正在研究的人,我试图在AzureFileStorage中创建一个新文件夹:fileDirectory.CreateIfNotExists(); fileDirectory是一个CloudFileDirectory对象。我只需在此之前放置ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;,它就像魔法一样奏效了。再次感谢。 - SuperVillainPresident
这意味着机器上有 .Net 4.5,而不是你的应用程序针对 4.5 进行编译。操作系统支持 TLS 1.2,但应用程序仍然必须通过 SecurityProtocol 设置允许其使用。 - Suncat2000

23

需要三个步骤:

  1. 在服务器机器上,通过将 Enabled=0DisabledByDefault=1 添加到注册表(完整路径为 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols),明确标记 SSL2.0、TLS1.0 和 TLS1.1 为禁止。具体信息请参见屏幕截图。 registry

  2. 按照第一步的方法明确启用 TLS1.2,只需分别使用 Enabled=1DisabledByDefault=0 即可。

注意:验证服务器版本:Windows Server 2003 不支持 TLS 1.2 协议

  1. 仅在应用程序级别上启用 TLS1.2,就像 @John Wu 上面建议的那样。

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

希望本指南对您有所帮助。

更新 如 @Subbu 所提到的:官方指南


2
官方参考 - https://technet.microsoft.com/zh-cn/library/dn786418(v=ws.11).aspx#BKMK_SchannelTR_TLS12 - Subbu
嗨 @Artem,添加了TLS之后,我需要重新启动服务器吗? - Shahzad Ahamad
@Simba,你可能已经解决了这个问题,但是我刚刚做这个的时候并不需要重新启动服务器。 - Matt N.
什么都不行,只有这个有效。谢谢。 - Chandan Gupta

9

以下是我使用的方法:

步骤 1:https://www.microsoft.com/en-us/download/details.aspx?id=48137下载并安装了Web安装程序exe文件到应用程序服务器上。安装完成后,重新启动了应用程序服务器。

步骤 2: web.config 中添加下面的更改:

<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。请在我的 web.config 文件的 appsettings 添加 ScriptResourceMapping 名称为 jquery(区分大小写)。为了解决这个错误,我在 web.config 文件的 appsettings 中添加了以下键。

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

为我解决了问题,添加httpRuntime目标框架。 - Mark Redman

1

将服务器更新为 .Net 4.6 或更高版本将使用 TLS 1.2。

通过解决我们的一个控制台应用程序中的电子邮件发送失败问题,我们发现了这一点。

服务器只安装了 .Net 4.5,因此电子邮件发送失败。

在我的本地工作站上,我有 .Net 4.6,在运行控制台应用程序时,电子邮件没有发送失败。

因此,我们将控制台应用程序移动到安装了 .Net 4.6 的服务器上,未更改任何其他内容,电子邮件又可以正常发送了。


这与被接受的答案不同吗? - nasch
是的,因为我们不需要进行任何代码更改或对web.config文件进行任何更改,也不需要重新编译任何内容。但还是谢谢您的检查。 - Bryan

0
有时候服务器需要使用现代的TLS密码套件,而操作系统客户端没有这些密码套件。在这种情况下,命令"ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;"就无法起作用了...唯一的解决办法就是更改服务器操作系统(从Win2021改为Win2019)。

0

PowerBI Embedded需要TLS 1.2。

上面由Etienne Faucher提供的答案是您的解决方案。 快速链接到上面的答案... 快速链接到上面的答案... ( https://dev59.com/7lcO5IYBdhLWcg3wsjpk#45442874 )

PowerBI需要TLS 1.2 2020年6月 - 这是您的答案 - 考虑强制将IIS运行时升级到4.6,以强制从框架中获取您正在寻找的默认TLS 1.2行为。 上面的答案仅提供配置更改解决方案。

症状:强制关闭拒绝与Microsoft PowerBI Embedded的TCP/IP连接,突然在您的系统中出现。

这些PowerBI调用突然停止工作,并显示硬TCP/IP关闭错误,就像防火墙会阻止连接一样。 通常认证步骤有效 - 当您访问特定工作区和报告ID的服务时,它会失败。

这是来自 Microsoft PowerBI 的2020年关于需要 TLS 1.2 的说明

PowerBIClient

出现此问题的方法

GetReportsInGroupAsync GetReportsInGroupAsAdminAsync GetReportsAsync GetReportsAsAdminAsync Microsoft.PowerBI.Api HttpClientHandler 强制使用TLS 1.1 或TLS 1.2

搜索以下错误术语以帮助人们找到此问题: System.Net.Http.HttpRequestException:发送请求时发生错误 System.Net.WebException:底层连接被关闭:发送时发生意外错误。 System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭了现有的连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接