web-dev-qa-db-fra.com

Comment spécifier le protocole SSL à utiliser pour la classe WebClient

J'ai une application qui envoie des données à un serveur à l'aide d'un POST HTTPS. J'utilise un objet System.Net.WebClient pour ce faire. Voici une fonction qui envoie des données:

    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;
    }

Nous transmettons un URI commençant par https: //

Cela fonctionne très bien depuis longtemps. Aujourd'hui, nous avons commencé à obtenir l'erreur de connexion suivante: "La connexion sous-jacente a été fermée: une erreur inattendue s'est produite lors d'un envoi". Nous avons effectué un dépannage avec le propriétaire du serveur, et ils l'ont finalement réduit au suivant. Ils ont modifié leur serveur pour bloquer TLS 1.0 et ont déclaré que nous devons maintenant envoyer nos données en utilisant TLS 1.1 ou 1.2.

Que dois-je définir dans mon objet WebClient (ou ailleurs dans ma fonction) pour qu'il utilise TLS 1.1 ou 1.2 au lieu de TLS 1.0?

Nous utilisons .NET Framework 4.5 si cela fait une différence.

33
JoeMjr2

À partir des autres questions suggérées, j'ai pu le résoudre en ajoutant la ligne suivante à mon code:

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

Cela a désactivé TLS 1.0 du client, puis le serveur a accepté la connexion.

J'espère que cela aide quelqu'un d'autre avec le même problème. Bien que la réponse soit similaire à ces autres questions, il n'était pas évident d'après les questions posées que c'était le cas, donc je ne pense pas que ce soit un doublon.

66
JoeMjr2