C# 在.NET4.0框架上使用TLS1.2发送HttpWebRequest是否可能

C# 在.NET4.0框架上使用TLS1.2发送HttpWebRequest是否可能,c#,.net-4.0,httpwebrequest,.net-4.5,tls1.2,C#,.net 4.0,Httpwebrequest,.net 4.5,Tls1.2,我的应用程序连接到益百利服务器,益百利将很快停止支持TLS 1.0和TLS 1.1。所有使用HTTPS的连接必须使用TLS 1.2版 我想对这个问题做一些研究,看看在.NET4.0框架上使用TLS1.2发送HttpWebRequest 如果没有,我可能需要在.NET4.5上创建一个webservice,并调用它的方法,如果有,我不需要做任何事情 有人已经面临过这个问题吗 是的,它支持TLS,但您必须在ServicePointManager上明确设置TLS版本。在您致电益百利之前,请随时(在同一应

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

我想对这个问题做一些研究,看看在.NET4.0框架上使用TLS1.2发送
HttpWebRequest

如果没有,我可能需要在.NET4.5上创建一个
webservice
,并调用它的方法,如果有,我不需要做任何事情


有人已经面临过这个问题吗

是的,它支持TLS,但您必须在
ServicePointManager
上明确设置TLS版本。在您致电益百利之前,请随时(在同一应用程序域中)运行此代码:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
更新
有关framework v4.0必须执行的操作,请参阅。我的代码适用于4.5+

不幸的是,您不能这样做。Tls12直到.netfx 4.5才添加(请参阅)。请注意,这也要求Windows Server 2008 R2+或Windows 7+正确运行(请注意上的“适用于”部分)。

我在将PayPal集成到旧版应用程序时,不得不处理相同的问题,并为.NET 4.0找到了以下解决方法,似乎可以做到这一点:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.DefaultConnectionLimit = 9999;
基本上,解决方法是直接为TLS1.2分配端口

所有功劳都归于评论人。

VB.NET翻译的:


框架4.0不支持TLS 1.1或1.2 但您可以通过从Nuget manager下载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;
}
您还可以使用以下选项:

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

我就这样解决了

    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();

我正在尝试实施您建议的更改,以及我仅有的
SecurityProtocolType
选项
Ssl3
Tls
。它没有
Tls12
我自己用它来给益百利打电话,所以蒂姆一定是对的。问题不在于HttpRequest,它是框架版本。只要您没有任何较低框架级别的内容依赖于此代码,您就可以升级框架版本并添加一行代码。明确定义TLS1.2会破坏与TLS1.1或更旧SSL的兼容性?@AgustinGarzon如果您想支持其他版本,可以“或”它们一起像:
SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls10
那条神奇的线成功了
ServicePointManager.SecurityProtocol=(SecurityProtocolType)3072
非常感谢!仅供参考,hack仅在服务器上也安装了.net 4.5的情况下才有效。如@CathalMF mentinoed,仅当服务器上安装了.net 4.5时才有效。很遗憾,4.5不支持windows 2003。是否有理由显式设置ServicePointManager.Expect100Continue=true?它与tls 1.2支持有何关系?根据文档,默认情况下这是正确的。@iignatov的答案应该是有效的:ServicePointManager.SecurityProtocol=(SecurityProtocolType)3072Rebex.Http是一款免费试用30天的付费商业产品
    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();