如何指定用于WebClient类

时间:2015-05-27 19:42:00

标签: c# .net ssl webclient

我有一个使用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。

2 个答案:

答案 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,我们也可以专门排除这种情况。