65 votes

Est-il possible d'envoyer HttpWebRequest en utilisant TLS1.2 sur le framework .NET 4.0 ?

Mon application se connecte au serveur d'Experian et Experian cessera bientôt de supporter TLS 1.0 et TLS 1.1. Toute connectivité utilisant HTTPS doit utiliser TLS version 1.2.

Je veux faire des recherches sur cette question et voir si l'on envoie HttpWebRequest l'utilisation de TLS 1.2 sur le cadre .NET 4.0 fonctionne

Si ce n'est pas le cas, je vais probablement devoir créer une webservice sur .NET 4.5 et appeler ses méthodes, si c'est le cas, je ne dois rien faire.

Quelqu'un a-t-il déjà été confronté à ce problème ?

122voto

Crowcoder Points 191

Oui, il le prend en charge, mais vous devez définir explicitement la version TLS sur l'interface utilisateur. ServicePointManager . Il suffit de faire exécuter ce code à tout moment (dans le même domaine d'application) avant de faire l'appel à Experian :

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

Mise à jour

voir Réponse de @iignatov pour ce que vous devez faire pour le framework v4.0. Mon code fonctionne avec la version 4.5+.

1 votes

J'essaie de mettre en place le changement que vous avez suggéré et le seul SecurityProtocolType les options dont je dispose Ssl3 y Tls . Il n'a pas Tls12

0 votes

Je l'utilise moi-même pour appeler Experian, donc Tim doit avoir raison. Ce n'est pas HttpRequest qui est le problème, c'est la version du framework.

0 votes

Tant que vous n'avez rien à un niveau inférieur du framework qui dépende de ce code, vous pouvez simplement augmenter la version du framework et ajouter cette ligne de code.

50voto

iignatov Points 239

J'ai été confronté au même problème lors de l'intégration de PayPal dans une ancienne application et j'ai trouvé la solution suivante pour .NET 4.0 qui semble faire l'affaire :

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

En fait, la solution de contournement consiste à attribuer directement le port pour TLS 1.2.

Tout le mérite revient au commentateur de CodeProject .

1 votes

Cette ligne magique a fait l'affaire ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 Merci beaucoup !

5 votes

Pour info, ce hack ne fonctionne que si .net 4.5 est également installé sur le serveur.

1 votes

Comme l'a dit @CathalMF, cela ne fonctionne que si .NET 4.5 est installé sur le serveur. Malheureusement, la version 4.5 ne prend pas en charge Windows 2003.

6voto

Matt G Points 11

La traduction VB.NET de La réponse de iignatov :

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

5voto

Sedat Kumcu Points 121

J'ai été résolu avec cette méthode.

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

3voto

keremercan Points 21

Vous pouvez également utiliser ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X