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

nas*_*sch 68 .net c# tls1.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?

Eti*_*her 101

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

  • 这是我们用于研究的文档:[HTTPRuntime](https://blogs.msdn.microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/),[RenderingCompatibility](https:// msdn.microsoft.com/en-us/library/system.web.ui.control.renderingcompatibility(v=vs.110).aspx) (3认同)
  • 这完全是正确的答案。最近刚刚经历了这个。这是一篇关于它的博客文章:http://blog.thelevelup.com/pci-security-is-your-restaurant-ready/ 和一个 GitHub 项目:https://github.com/TheLevelUp/pos-tls -修补程序 (3认同)
  • 在本例中,将编译更改为4.6并添加httpRuntime 4.6就足够了,谢谢您的解决方案! (2认同)
  • https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls (2认同)
  • 我觉得有必要指出,最好的解决方案是以 .NET 4.7 为目标 — 如果您的特定平台支持 4.7 并且升级 .NET 是一个真正的选择。 (2认同)

Joh*_* Wu 66

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

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

或者为了向后兼容:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
Run Code Online (Sandbox Code Playgroud)

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

bre*_*per 20

如果你使用早于4.5的.Net,你就不会在枚举中使用Tls12,所以这里明确提到状态

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Run Code Online (Sandbox Code Playgroud)


Art*_*tem 12

需要三个步骤:

  1. 通过添加Enabled=0DisabledByDefault=1注册表(完整路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols),在服务器计算机上明确标记SSL2.0,TLS1.0,TLS1.1 .有关详情,请参见屏幕 注册处

  2. TLS1.2按照以下步骤显式启用1. 分别使用Enabled=1DisabledByDefault=0.

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

  1. TLS1.2仅在应用级别启用,例如上面提到的@John Wu建议.

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

希望本指南有所帮助.

更新 正如@Subbu所说:官方指南

  • 官方参考 - https://technet.microsoft.com/en-us/library/dn786418(v=ws.11).aspx#BKMK_SchannelTR_TLS12 (2认同)

KRM*_*KRM 6

对我来说,下面的工作:

步骤 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>
Run Code Online (Sandbox Code Playgroud)

第 3 步:完成第 1 步和第 2 步后,出现错误“ WebForms UnobtrusiveValidationMode 需要 ScriptResourceMapping for 'jquery'。请添加名为 jquery(case-sensitive) 的 ScriptResourceMapping ”并解决此错误,我在appsettings 中添加了以下键在我的web.config文件中

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)