我有一个使用HTTPS POST将数据发送到服务器的应用程序。我使用System.Net.WebClient对象来执行此操作。这是一个发送一些数据的函数:
private byte[] PostNameValuePairs(string uri, NameValueCollection pairs)
{
byte[] response;
String responsestring = "";
using (WebClient client = new WebClient())
{
client.Headers = GetAuthenticationHeader();
string DataSent = GetNameValueCollectionValuesString(pairs);
try
{
response = client.UploadValues(uri, pairs);
responsestring = Encoding.ASCII.GetString(response);
}
catch (Exception e)
{
responsestring = "CONNECTION ERROR: " + e.Message;
return Encoding.ASCII.GetBytes(responsestring);
}
finally
{
_communicationLogger.LogCommunication(uri, client.Headers.ToString(), DataSent, responsestring);
}
}
return response;
}
我们传入的是以https://
开头的URI这已经很长时间了。今天,我们开始收到以下连接错误:"基础连接已关闭:发送时出现意外错误"。我们对服务器的所有者进行了一些故障排除,他们最终将其缩小到以下内容。他们对服务器进行了更改以阻止TLS 1.0,并表示我们现在需要使用TLS 1.1或1.2发送数据。
我需要在我的WebClient对象(或我的函数中的其他位置)中设置什么才能使用TLS 1.1或1.2代替TLS 1.0?
如果有所不同,我们正在使用.NET Framework 4.5。
答案 0 :(得分:64)
根据建议的其他问题,我可以通过在我的代码中添加以下行来解决它:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
从客户端禁用TLS 1.0,然后服务器接受连接。
希望这可以帮助其他人解决同样的问题。虽然答案与其他问题的答案类似,但从提出的问题来看,情况并不明显,所以我不认为这是重复的。
答案 1 :(得分:3)
我发现在c#中启用和禁用TLS版本的要求更为严格。
这可以与.Net 4.5及更高版本一起使用。
// Remove insecure protocols (SSL3, TLS 1.0, TLS 1.1)
ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Tls;
ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Tls11;
// Add TLS 1.2
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
这可以确保即使服务器能够使用1.0或1.1,我们也可以专门排除这种情况。