在.NET 4.0框架上,是否可以使用TLS1.2发送HttpWebRequest?

65

我的应用程序连接到 Experian 服务器,而 Experian 将很快停止支持 TLS 1.0 和 TLS 1.1。所有使用 HTTPS 的连接都必须使用 TLS 版本 1.2。

我想对这个问题进行一些研究,并查看在 .NET 4.0 框架上使用 TLS 1.2 发送 HttpWebRequest 是否可行。

如果不行,我可能需要在 .NET 4.5 上创建一个 webservice 并调用其方法;如果可行,我就不必做任何事情。

是否有人已经遇到了这个问题?

10个回答

122

是的,它支持TLS,但您必须在ServicePointManager上明确设置TLS版本。只需在调用Experian之前的任何时间(在同一应用程序域中)运行此代码即可:

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

更新

查看@iignatov的回答,了解您在框架 v4.0 中必须执行的操作。我的代码适用于4.5+。


1
我正在尝试实施你提出的变更,并且我只有两个SecurityProtocolType选项可用,即Ssl3Tls。它没有Tls12 - gene
11
如果你想支持其他版本,可以像这样“或”它们在一起:SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls10 - Crowcoder
3
如果您想让代码具备未来的兼容性,不应该直接将其设置为某个值,而是应该通过添加“|=”符号来实现 - 例如:System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12 - Sean
1
@Crowcoder,"SecurityProtocolType.Tls10" 这个东西不存在,实际上是 "SecurityProtocolType.Tls",它代表的是 Tls 1.0。 - Ezh
感谢这个提示。@Crowcoder的方法适用于.Net 4.5。 - Sedat Kumcu
显示剩余6条评论

50

我在将PayPal集成到旧应用程序中时也遇到了同样的问题,并找到了以下解决方法,适用于.NET 4.0,似乎能解决这个问题:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.DefaultConnectionLimit = 9999;

基本上的解决方法是直接为TLS 1.2分配端口。

所有的功劳归功于在CodeProject的评论者。


1
那个神奇的代码行 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 做到了它的作用。非常感谢! - Renan Araújo
5
请注意,该黑客技巧仅在服务器上安装了.NET 4.5才有效。 - CathalMF
1
正如 @CathalMF 所提到的,这仅在服务器上安装了 .NET 4.5 时才有效。不幸的是,4.5 不支持 Windows 2003。 - Sriwantha Attanayake
1
有没有明确设置ServicePointManager.Expect100Continue = true的理由?它与tls 1.2支持有什么关系?根据文档,它默认情况下已经是true了。 - leonid p

6

iignatov的答案的VB.NET翻译:

ServicePointManager.Expect100Continue = True
ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)
ServicePointManager.DefaultConnectionLimit = 9999

5

我用这种方法解决了问题。

    string url = "https://api.foursquare.com/v2/blablabla...";
    var request = (HttpWebRequest)WebRequest.Create(url);

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
    
    var response = (HttpWebResponse)request.GetResponse();
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

1
最简单的方法 - Venugopal M

3
您也可以使用以下方法:

最初的回答:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | (SecurityProtocolType)768 | (SecurityProtocolType)3072;

所有解决方案的最佳答案都在这个链接 py4u.net/discuss/711097 中。 - keivan kashani

0
很遗憾,您不能这样做。Tls12直到.netfx 4.5才被添加(请参阅文档)。需要注意的是,这还需要Windows Server 2008 R2+或Windows 7+以正确运行(请注意介绍TLS中的适用范围部分)。

1
@iignatov的回答应该可以:ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 - jay-danger

0

使用针对 Framework 4.5 的应用程序(但安装了 SDK 4.8),上述解决方案均不适用于我。

我在注册表中创建了一个名为 SchUseStrongCrypto 的 DWORD 键。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319

并且

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319

具有值为1。

因此,似乎不需要更改ServicePointManager.SecurityProtocol


0

不行,

正如来源所述,

“HttpWebRequest 类仅支持 HTTP 的版本 1.0 和 1.1。将 ProtocolVersion 设置为其他版本会引发异常。”

Source: learn.microsoft.com


0
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

这在我的 .net 3.5 上运行良好


0

FrameWork 4.0 不支持 TLS 1.1 或 1.2 但您可以通过从 Nuget 管理器下载 Rebex.Http 来解决此问题。

Rebex.Licensing.Key = "..."; //Lisans Number
var creator = new HttpRequestCreator();
creator.Register();

WebRequest request = WebRequest.Create("https://www.test.com");
request.Method = "POST";                
request.Headers.Add("utsToken", txtToken.Text);
request.ContentType = "application/json";
request.Method = "POST";

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    string json = "{\"VRG\":\"test\"}";

    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();
}

var httpResponse = (WebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
    txtSonuc.Text += result;
}

Rebex.Http是一款付费商业产品,提供免费的30天试用期。 - Adam Silenko

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