web-dev-qa-db-fra.com

Quelles versions de SSL / TLS sont prises en charge par System.Net.WebRequest?

Maintenant que SSL 3 s'est révélé vulnérable à l'attaque POODLE :

Quelles versions de SSL/TLS System.Net.WebRequest utilise-t-il lors de la connexion à un URI https?

J'utilise WebRequest pour me connecter à plusieurs API tierces. L'un d'eux a à présent indiqué qu'il bloquerait toute requête utilisant SSL 3. Mais WebRequest fait partie du framework .Net (à l'aide de la version 4.5). La version utilisée n'est donc pas claire.

77
JK.

Lorsque vous utilisez System.Net.WebRequest, votre application négociera avec le serveur pour déterminer la version TLS la plus récente prise en charge par votre application et par le serveur, et l'utilisera. Vous pouvez voir plus de détails sur la façon dont cela fonctionne ici:

http://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

Si le serveur ne prend pas en charge TLS, il utilisera SSL, il pourrait donc éventuellement utiliser SSL3. Vous pouvez voir toutes les versions prises en charge par .NET 4.5 ici:

http://msdn.Microsoft.com/en-us/library/system.security.authentication.sslprotocols (v = vs.110) .aspx

Afin d'éviter que votre application ne soit vulnérable à POODLE, vous pouvez désactiver SSL3 sur la machine sur laquelle votre application s'exécute en suivant les explications suivantes:

https://serverfault.com/questions/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

47
Gareth Williams

Ceci est une question importante. Le protocole SSL 3 (1996) est irrémédiablement brisé par l'attaque Poodle publiée en 2014. L'IETF a publié "SSLv3 NE DOIT PAS être utilisé" . Les navigateurs Web l’abandonnent. Mozilla Firefox et Google Chrome l'ont déjà fait.

Deux excellents outils pour vérifier la prise en charge du protocole dans les navigateurs sont test client de SSL Lab et https://www.howsmyssl.com/ . Ce dernier ne nécessite pas de Javascript, vous pouvez donc l'essayer à partir de HttpClient : .NET:

_// set proxy if you need to
// WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128");

File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result);

// alternative using WebClient for older framework versions
// new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html");
_

Le résultat est accablant:

Votre client utilise TLS 1.0, qui est très ancien, susceptible de l’attaque de BEAST et ne possède pas les meilleures suites de chiffrement disponibles. Des ajouts tels que AES-GCM et SHA256 pour remplacer MD5-SHA-1 ne sont pas disponibles pour un client TLS 1.0 ainsi que pour de nombreuses suites de chiffrement plus modernes.

C'est préoccupant. C'est comparable à Internet Explorer 7 de 2006.

Pour répertorier exactement les protocoles pris en charge par un client HTTP, vous pouvez essayer les serveurs de test spécifiques à la version ci-dessous:

_var test_servers = new Dictionary<string, string>();
test_servers["SSL 2"] = "https://www.ssllabs.com:10200";
test_servers["SSL 3"] = "https://www.ssllabs.com:10300";
test_servers["TLS 1.0"] = "https://www.ssllabs.com:10301";
test_servers["TLS 1.1"] = "https://www.ssllabs.com:10302";
test_servers["TLS 1.2"] = "https://www.ssllabs.com:10303";

var supported = new Func<string, bool>(url =>
{
    try { return new HttpClient().GetAsync(url).Result.IsSuccessStatusCode; }
    catch { return false; }
});

var supported_protocols = test_servers.Where(server => supported(server.Value));
Console.WriteLine(string.Join(", ", supported_protocols.Select(x => x.Key)));
_

J'utilise .NET Framework 4.6.2. J'ai trouvé que HttpClient ne prend en charge que SSL 3 et TLS 1.0. C'est préoccupant. Ceci est comparable à Internet Explorer 7 de 2006.


Update: HttpClient activé prend en charge TLS 1.1 et 1.2, mais vous devez les activer manuellement à System.Net.ServicePointManager.SecurityProtocol =. Voir https://stackoverflow.com/a/26392698/284795

Je ne sais pas pourquoi il utilise de mauvais protocoles immédiatement. Cela semble être un mauvais choix d’installation, ce qui équivaut à un gros problème de sécurité (je parie que beaucoup d’applications ne changent pas la valeur par défaut). Comment pouvons-nous le signaler?

49
Colonel Panic

J'y ai également mis une réponse, mais l'article de @Colonel Panic fait référence à suggérer de forcer TLS 1.2. Dans le futur, lorsque TLS 1.2 sera compromis ou juste remplacé, le fait de coller votre code sur TLS 1.2 sera considéré comme une lacune. La négociation vers TLS1.2 est activée par défaut dans .Net 4.6. Si vous avez la possibilité de mettre à niveau votre source vers .Net 4.6, je vous recommande fortement de remplacer le forçage de TLS 1.2.

Si vous forcez TLS 1.2, envisagez vivement de laisser un type de fil d'Ariane qui supprimera cette force si vous effectuez une mise à niveau vers la version 4.6 ou supérieure.

8