更新 .NET Web 服务以使用 TLS 1.2

Posted

技术标签:

【中文标题】更新 .NET Web 服务以使用 TLS 1.2【英文标题】:Update .NET web service to use TLS 1.2 【发布时间】:2017-07-28 20:53:56 【问题描述】:

我需要使用 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。 support.quovadisglobal.com/kb/a433/… 【参考方案1】:

我们实际上只是将 .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>

并且连接更改为 TLS 1.2,因为 IIS 现在在 4.6(明确告知)中运行 Web 服务,而 4.6 默认使用 TLS 1.2。

【讨论】:

这是我们用于研究的文档:HTTPRuntime, RenderingCompatibility 在我们的案例中将编译更改为 4.6 并添加 httpRuntime 4.6 就足够了,感谢您的解决方案! 这完全是正确的答案。最近刚刚经历了这个。这是一篇关于它的博客文章:blog.thelevelup.com/pci-security-is-your-restaurant-ready 和一个执行此操作的 GitHub 项目:github.com/TheLevelUp/pos-tls-patcher docs.microsoft.com/en-us/dotnet/framework/network-programming/… 我觉得有义务指出,最好的解决方案是以 .NET 4.7 为目标——如果您的特定平台支持 4.7 并且升级 .NET 是一个真正的选择。【参考方案2】:

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

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

或者为了向后兼容 TLS 1.1 和更早版本:

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

【讨论】:

是的,我已经这样做了,但错误消息仍然指示 .NET 4.0。 那是你的 CLR 版本。 .Net CLR 有两个版本,2.0 和 4.0。在 IIS 中,您指定 CLR 版本,而不是 Framework 版本。 IIS 不会告诉你.Net 4.6,因为它不关心这个。如果您使用 4.6 编译,那么您使用的是 4.6。 从 .NET 4.5 开始支持 TLS 1.2 在这种情况下,|= 优于仅 =。它们是二进制标志,不要不必要地覆盖其他所有内容。 @JohnWu - 请注意上面 Izzy 的评论。您的代码告诉 .NET 在连接到 HTTPS 资源时明确使用 TLS 1.2。 IE。如果服务器只有 TLS 1.1,你的代码会阻止它连接,因为它只使用 TLS 1.2。当客户端和服务器协商使用哪个协议时,您应该使用 |= 告诉您的代码“也尝试使用 TLS 1.2 作为选项”。【参考方案3】:

如果您使用早于 4.5 的 .Net,则枚举中不会包含 Tls12,因此会明确提及状态 here

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

【讨论】:

谢谢。这帮助了我。对于任何研究我试图在 AzureFileStorage 中创建一个新文件夹的人:fileDirectory.CreateIfNotExists(); fileDirectory 是一个 CloudFileDirectory 对象。我只是简单地放置了 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;在此之前,它就像一个魅力。再次感谢。 这意味着机器上的 .Net 4.5,而不是您的应用程序针对 4.5 的编译。它是支持 TLS 1.2 的操作系统,但应用程序仍然必须通过 SecurityProtocol 设置允许它使用。【参考方案4】:

需要三个步骤:

    通过将Enabled=0DisabledByDefault=1 添加到您的注册表(完整路径为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols),在您的服务器计算机上明确将SSL2.0、TLS1.0、TLS1.1 标记为禁止。详情见屏幕

    按照 1 中的步骤显式启用 TLS1.2。只需分别使用 Enabled=1DisabledByDefault=0

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

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

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

希望本指南有所帮助。

更新 正如@Subbu 所说:Official guide

【讨论】:

官方参考-technet.microsoft.com/en-us/library/… 嗨@Artem 添加 tls 后我需要重新启动服务器吗? @Simba 你可能已经解决了这个问题,但是刚刚这样做我不需要重新启动服务器。【参考方案5】:

对我来说,以下工作:

第 1 步: 从应用服务器上的https://www.microsoft.com/en-us/download/details.aspx?id=48137 下载并安装 web Installer 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 requires a ScriptResourceMapping for 'jquery'. Please add a ScriptResourceMapping named jquery(case -sensitive)”,为了解决这个错误,我在 web.config 文件中的 appsettings 中添加了下面的键

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

【讨论】:

添加 httpRuntime 目标框架对我有用。【参考方案6】:

PowerBI Embedded 需要 TLS 1.2。

Etienne Faucher 的上述答案是您的解决方案。 快速链接到上述答案...quick link to above answer... (https://***.com/a/45442874)

PowerBI 需要 TLS 1.2 2020 年 6 月 - This Is your Answer - 考虑强制您的 IIS 运行时升级到 4.6 以强制您从框架中寻找默认的 TLS 1.2 行为。以上答案为您提供了仅更改配置的解决方案。

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

这些 PowerBI 调用只是停止工作并出现硬 TCP/IP 关闭错误,就像防火墙会阻止连接一样。通常,身份验证步骤有效 - 当您点击特定工作区的服务并报告 id 时,它会失败。

This is the 2020 note from Microsoft PowerBI about TLS 1.2 required

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:无法从传输连接读取数据:现有连接被远程主机强行关闭。

【讨论】:

【参考方案7】:

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

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

服务器只安装了 .Net 4.5,并且电子邮件失败。

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

因此,我们将控制台应用程序移到了具有 .Net 4.6 的服务器上,没有更改任何其他内容,并且电子邮件再次正常工作。

【讨论】:

这与接受的答案不同吗? 是的,因为我们不需要更改任何代码,也不需要对 web.config 文件进行任何更改,也不需要重新编译任何东西。但感谢您检查以防万一。 ?

以上是关于更新 .NET Web 服务以使用 TLS 1.2的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF 和 .NET 4.0 中使用 TLS 1.1 或 1.2?

使用TLS 1.2保护Web请求

获取 Paypal 响应 TLS 1.2 .Net Framework 4.0

Powershell CREDSSP 和 TLS 1.2

如何使 Windows 商店应用程序与 TLS 1.2 一起使用?

限制除 TLS 1.2 服务器端 WCF 之外的任何内容