System.Net.SecurityProtocolType.Tls12定义未找到。

25

我正在尝试将以下代码行添加到网站项目的Global.asax文件中。

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

vs2012 IntelliSense提示Tls12定义存在。但是构建过程报告该定义不存在(请参见屏幕截图)。

screen shot

我尝试将System.Net.dll添加到项目的bin文件夹中,但构建仍然失败。有什么方法可以解决这个问题吗?


2
如果您想要“添加”它,请不要使用=符号。这将删除所有其他内容,只留下Tls12。请改用|= - kuskmen
那会让它首先尝试Tls12吗? - HockChai Lim
2
谢谢,我会深入研究这个。我的流程实际上会调用 Web 服务。我们希望该流程始终首先尝试 Tls12,然后再降级到 Tls11。 - HockChai Lim
1
PCI要求。但即使没有这样的要求,我仍然更喜欢首先尝试最新、更安全的协议。 - HockChai Lim
1
哦,原来你是客户端而不是服务器,并且想首先尝试最安全的TLS版本,现在这很有意义。之前我以为你是服务器。我会尽力找到你想要实现的目标并回复你。 - kuskmen
显示剩余2条评论
7个回答

65

在 Framework 4.0 中,SecurityProtocolType.Tls11 和 SecurityProtocolType.Tls12 枚举值缺失。

SecurityProtocolType 数值对应关系:
SystemDefault (0)
Ssl3 (48 - 0x30)
Tls (192 - 0xC0)
Tls11 (768 - 0x300) 在 Framework 4.0 缺失
Tls12 (3072 - 0xC00) 在 Framework 4.0 缺失

若要在 Framework 4.0 中允许使用 TLS 1.0、1.1 和 1.2,请将以下内容替换:

SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12  

作者:

(SecurityProtocolType)(0xc0 | 0x300 | 0xc00)

1
之前还有一个 SecurityProtocolType.SystemDefault (0x00) 选项,但在某次更新后又消失了。 - Louis Somers
谢谢,这在我的.NET 4.0,Silverlight 5项目中起作用。 - cmartin
1
VB语言中的版本是CType((&HC0 Or &H300 Or &HC00), System.Net.SecurityProtocolType)。 - Mike W
非常感谢这个(SecurityProtocolType)(0xc0 | 0x300 | 0xc00),它救了我的一天 :) - Asaad Mamoun
1
将 (SecurityProtocolType)(0xc0 | 0x300 | 0xc00) 添加进去对我有用。但这太荒谬了,为什么这些协议需要被手动移除再添加才能工作呢? 顺便说一下,我非常感激 @figolu。 - Ali.DM

23

TLS及如何避免连接错误。

  • .NET 4.6及以上版本不需要进行任何额外工作即可支持TLS1.2,因为它默认支持。
  • .NET 4.5支持TLS1.2,但它不是默认协议。您需要选择使用它。执行以下代码将使TLS1.2成为默认协议,请确保在连接到受保护资源之前执行:
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
  • .NET 4.0不支持TLS 1.2,但如果您的系统安装了.NET 4.5(或更高版本),即使您的应用程序框架不支持它,您仍然可以选择使用TLS 1.2。唯一的问题是,.NET 4.0中的SecurityProtocolType没有TLS1.2的条目,因此我们必须使用该枚举值的数字表示:
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
  • .NET 3.5或更低版本。不支持TLS 1.2(*),也没有解决方法。将您的应用程序升级到更高版本的框架。

就我个人而言,在我的.NET 4.0框架中,我使用了一些asp经典文件:

    ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

https://blogs.perficient.com/2016/04/28/tsl-1-2-and-net-support/


1
你好,我在进行HTTP请求时遇到了这个异常错误:“Authentication failed because the remote party has closed the transport stream.”。客户端运行在DotNet 4.0下,我在发送请求之前使用了代码“ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;”。但仍然出现异常错误。你有任何解决方法吗? - Pranesh Janarthanan
你尝试过这个吗:ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00); - Landscaper3345
是的,在调试期间。第一个HTTP请求失败并显示此错误,而后续连续请求则通过。为什么第一个请求会失败? - Pranesh Janarthanan
Vb.net:System.Net.ServicePointManager.SecurityProtocol = CType((&HC0 Or &H300 Or &HC00), SecurityProtocolType) - pghcpa

15

您是否在使用 .NET Framework 4.0?建议您至少升级到 4.5 版本。您可以尝试更新您的 Web 目标框架版本: .NET Framework 4.0 中的 TLS 1.2


这是一个网站项目。有没有一种方法来指定它?我在项目的web.config文件中看到了这个:
<startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
- HockChai Lim
在我重新选择.NET4.5的目标后,它似乎可以工作。详细信息:右键单击项目=>属性页面=>在构建下,重新选择目标框架值=> .NET Framework 4.5(注意:这是当前值)。一旦我这样做了,构建就可以正常工作了。奇怪... - HockChai Lim
可能是在VS缓存中卡在了之前的版本。是的,这听起来很奇怪。 - Teoman shipahi
在我完成上述操作后,我注意到以下内容被添加到了web.config文件中: <system.web> <compilation targetFramework="4.5"> <assemblies> <add assembly="System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> </assemblies> </compilation> <pages controlRenderingCompatibilityVersion="4.0"/> </system.web> - HockChai Lim
1
编译目标框架为"4.5"应该就可以解决问题了。 - Teoman shipahi

2

对于vb.net

ServicePointManager.SecurityProtocol = DirectCast(&HC0 Or &H300 Or &HC00, SecurityProtocolType)

您的答案可以通过添加更多支持性信息来改进。请[编辑]以添加进一步详细信息,例如引用或文档,以便其他人可以确认您的答案的正确性。您可以在帮助中心找到有关编写良好答案的更多信息。 - MD. RAKIB HASAN

1

这个网站已经在 .Net 4.5 上运行,手动将 Compilation > TargetFramework 从 4.0 更新到 4.5 后,问题得到了解决。

以下是更新后的配置:

<compilation debug="true" targetFramework="4.5">
  <assemblies>
    <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
    <add assembly="System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
  </assemblies>
</compilation>

0
ServicePointManager.SecurityProtocol = (SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

0

关于您所关心的应用程序(客户端)和服务器将使用哪个版本的TLS。

以下是从RFC 5246 TLS标准中直接引用的内容。

  • ClientHello 中(客户端向服务器发出的第一个请求)

    客户端希望在此会话期间使用的TLS协议版本。这应该是客户端支持的最新(最高价值)版本。

  • ServerHello 中(服务器响应的第一个请求)

    该字段将包含客户端建议的版本和服务器支持的最高版本中较低的一个。

ClientHelloServerHello是具有字段的结构,这些字段在标准此处中进行了描述。

简而言之

当使用System.Net.WebRequest时,您的应用程序将与服务器协商确定双方都支持的最高TLS版本,并使用它。

关于您的问题。

  • 您可以在.NET 此处找到支持的TLS协议版本,但请验证您正在使用的.NET框架版本并导航到正确的版本msdn。

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