SecurityProtocol par défaut in.NET 4,5
Quel est le protocole de sécurité par défaut pour communiquer avec les serveurs qui prennent en charge jusqu'à TLS 1.2
? .NET
par défaut, choisissez le protocole de sécurité le plus élevé pris en charge du côté du serveur ou dois-je ajouter explicitement cette ligne de code:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
y a-t-il un moyen de changer cette valeur par défaut, à part un changement de code?
enfin, .NET 4.0
ne supporte-t-il que TLS 1.0
? i.e. je dois mettre à jour le client projets à 4.5 pour soutenir TLS 1.2
.
ma motivation est de supprimer le support pour SSLv3
côté client même si le serveur le supporte (j'ai déjà un script powershell pour désactiver cela dans le registre de la machine) et de supporter le protocole TLS le plus élevé que le serveur supporte.
mise à Jour:
En regardant la classe ServicePointManager
dans .NET 4.0
Je ne vois aucune valeur énumérée pour TLS 1.0
et 1.1
. Dans les deux .NET 4.0/4.5
, la valeur par défaut est SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
. Espérons que cette valeur par défaut ne se brisera pas en désactivant SSLv3
dans le registre.
cependant, j'ai décidé que je dois mettre à jour toutes les applications à .NET 4.5
et d'ajouter explicitement SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
de toute façon à tous les code de bootstrapping de toutes les applications.
il s'agit de faire des demandes sortantes à divers IPA et services de ne pas rétrograder à SSLv3
et de sélectionner le niveau le plus élevé de TLS
.
cette approche raisonnable ou excessif? J'ai beaucoup d'applications à mettre à jour, et je veux les tester à l'avenir puisque j'entends même TLS 1.0
peut être déprécié dans un proche avenir par certains fournisseurs.
en tant que client faisant des requêtes sortantes aux API, est-ce que la désactivation de SSL3 dans le registre a même un effet dans le cadre .NET? Je vois par défaut, TLS 1.1 et 1.2 ne sont pas activés, devons-nous l'activer via le registre? RE http://support.microsoft.com/kb/245030 .
après un peu d'enquête, je crois que les paramètres du registre n'auront aucun effet puisqu'ils s'appliquent à IIS (serveur subkey) et les navigateurs (client subkey).
Désolé ce post s'est transformé en plusieurs questions, suivi de "peut-être" des réponses.
13 réponses
certains de ceux qui quittent les commentaires ont noté que le réglage de System.Net.ServicePointManager.SecurityProtocol
à des valeurs spécifiques signifie que votre application ne sera pas en mesure de tirer profit des versions futures de TLS qui peuvent devenir les valeurs par défaut dans les mises à jour futures .NET. Au lieu de spécifier une liste fixe de protocoles, vous pouvez à la place activer ou désactiver les protocoles que vous connaissez et qui vous intéressent, en laissant les autres tels qu'ils sont.
pour allumer TLS 1.1 et 1.2 sans affecter les autres protocoles:
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
remarquez l'utilisation de |=
pour allumer ces drapeaux sans en éteindre d'autres.
pour désactiver SSL3 sans affecter les autres protocoles:
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
la valeur par défaut System.Net.ServicePointManager.SecurityProtocol
dans les deux .net 4.0/4.5
est SecurityProtocolType.Tls|SecurityProtocolType.Ssl3
.
.NET 4.0
supporte jusqu'à TLS 1.0
tandis que .NET 4.5
supporte jusqu'à TLS 1.2
cependant, une application ciblant .NET 4.0
peut encore supporter TLS 1.2
si .NET 4.5
est installé dans le même environnement. .NET 4.5
installe sur le dessus de .NET 4.0
, en remplaçant System.dll
.
j'ai vérifié ceci en respectant le protocole de sécurité correct défini dans le trafic avec fiddler4
et en réglant manuellement les valeurs énumérées dans un .NET 4.0
projet:
ServicePointManager.SecurityProtocol = (SecurityProtocolType)192 |
(SecurityProtocolType)768 | (SecurityProtocolType)3072;
référence:
namespace System.Net
{
[System.Flags]
public enum SecurityProtocolType
{
Ssl3 = 48,
Tls = 192,
Tls11 = 768,
Tls12 = 3072,
}
}
si vous tentez le piratage sur un environnement avec seulement .NET 4.0
installé, vous obtiendrez l'exception:
Exception Non Gérée: System.NotSupportedException: le protocole de sécurité demandé n'est pas soutenu. at System.Net.ServicePointManager.set_SecurityProtocol(SecurityProtocolType v auue)
cependant, je ne recommande pas ce "hack" depuis un futur patch, etc. risquez de les casser.*
par conséquent, j'ai décidé que la meilleure façon de supprimer le support pour SSLv3
est de:
- Mise à niveau de toutes les applications de
.NET 4.5
-
ajouter ce qui suit: code boostrapping pour outrepasser la valeur par défaut et la tester dans le futur:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
*Quelqu'un me corrige si ce hack est mauvais, mais les premiers tests je vois ça marche
vous pouvez outrepasser le comportement par défaut dans le Registre suivant:
Key : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1
et
Key : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319
Value: SchUseStrongCrypto
Type: REG_DWORD
Data : 1
pour plus de détails, voir implementation of ServicePointManager
.
créer un fichier texte avec une extension .reg
et le contenu suivant:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
ou téléchargez-le à partir de la source suivante:
https://tls1test.salesforce.com/s/NET40-Enable-TLS-1_2.reg
double-cliquez pour installer...
j'ai constaté que lorsque je spécifie seulement TLS 1.2 qu'il sera encore en baisse négocier à 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
j'ai spécifié ceci dans le Global.méthode de démarrage asax pour mon application web .net 4.5.
le mécanisme de changement de Registre a fonctionné pour moi après une lutte. En fait, mon application tournait en 32 bits. J'ai donc dû changer la valeur de path.
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319
le type de valeur doit être DWORD et la valeur supérieure à 0 .Mieux utiliser 1.
j'ai eu le problème quand mon client a mis à jour TLS de 1.0 à 1.2. Mon application utilise .net framework 3.5 et tourne sur le serveur. Alors je l'ai réparé de cette façon:
- fixer le programme
avant d'appeler HttpWebRequest.GetResponse () ajouter cette commande:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolTypeExtensions.Tls11 | SecurityProtocolTypeExtensions.Tls12;
Extensions 2 DLLs en ajoutant 2 nouvelles classes: System.Net et système.Sécurité.Authentification
namespace System.Net
{
using System.Security.Authentication;
public static class SecurityProtocolTypeExtensions
{
public const SecurityProtocolType Tls12 = (SecurityProtocolType)SslProtocolsExtensions.Tls12;
public const SecurityProtocolType Tls11 = (SecurityProtocolType)SslProtocolsExtensions.Tls11;
public const SecurityProtocolType SystemDefault = (SecurityProtocolType)0;
}
}
namespace System.Security.Authentication
{
public static class SslProtocolsExtensions
{
public const SslProtocols Tls12 = (SslProtocols)0x00000C00;
public const SslProtocols Tls11 = (SslProtocols)0x00000300;
}
}
- mise à jour de Microsoft batch
Télécharger batch:
- Pour windows 2008 R2: windows6.1-kb3154518-x64.msu
- Pour windows 2012 R2: windows8.1-kb3154520-x64.msu
pour télécharger le lot et plus de détails, vous pouvez voir ici:
Je cours sous .NET 4.5.2, et je n'étais pas satisfait de ces réponses. Comme je parle à un système qui supporte TLS 1.2, et vu que SSL3, TLS 1.0, et TLS 1.1 sont tous défectueux et dangereux à utiliser, Je ne veux pas activer ces protocoles. Sous .NET 4.5.2, les protocoles SSL3 et TLS 1.0 sont activés par défaut, ce que je peux voir dans le code en inspectant ServicePointManager.SecurityProtocol
. Sous .NET 4.7, il y a le nouveau mode de protocole SystemDefault
qui permet explicitement la sélection du le protocole à L'OS, où je crois qu'il serait approprié de se fier au registre ou à d'autres paramètres de configuration du système. Cela ne semble pas être pris en charge sous .NET 4.5.2 cependant. Dans l'intérêt de l'écriture forwards-compatible code, qui continuera à prendre les bonnes décisions, même lorsque TLS 1.2 est inévitablement cassé à l'avenir, ou lorsque je mets à niveau vers .NET 4.7+ et de passer plus de responsabilité pour le choix d'un protocole approprié à L'OS, j'ai adopté le code suivant:
SecurityProtocolType securityProtocols = ServicePointManager.SecurityProtocol;
if (securityProtocols.HasFlag(SecurityProtocolType.Ssl3) || securityProtocols.HasFlag(SecurityProtocolType.Tls) || securityProtocols.HasFlag(SecurityProtocolType.Tls11))
{
securityProtocols &= ~(SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11);
if (securityProtocols == 0)
{
securityProtocols |= SecurityProtocolType.Tls12;
}
ServicePointManager.SecurityProtocol = securityProtocols;
}
ce code détectera quand un protocole non sécurisé connu est activé, et dans ce cas, nous supprimerons ces protocoles non sécurisés. S'il ne reste aucun autre protocole explicite, nous allons alors forcer TLS 1.2, comme le seul protocole sécurisé connu supporté par .NET à ce stade. Ce code est compatible forwards, car il prendra en considération les nouveaux types de protocole qu'il ne sait pas s'ils seront ajoutés dans le futur, et il jouera aussi bien avec le nouvel état SystemDefault
dans .NET 4.7, ce qui veut dire que je n'aurai pas à revisiter ce code à l'avenir. Je recommande fortement d'adopter une approche comme celle-ci, plutôt que de codifier un protocole de sécurité particulier sans condition, sinon vous devrez recompiler et remplacer votre client par une nouvelle version afin de passer à un nouveau protocole de sécurité lorsque TLS 1.2 sera inévitablement cassé, ou plus probablement vous devrez laisser les protocoles non sécurisés existants allumés pendant des années sur votre serveur, faisant de votre organisation une cible pour attaques.
le code suivant sera:
- impression de protocoles activés
- imprimer les protocoles disponibles
- activer TLS1.2 si la plate-forme le supporte et si elle n'est pas activée à commencer par
- désactiver SSL3 s'il est activé "151950920 impression" résultat final
les autres protocoles ne seront pas touchés. Ceci rend ceci compatible avec les futurs protocoles (Tls1.3, etc.).
Code
Console.WriteLine("Runtime: " + System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(int).Assembly.Location).ProductVersion);
Console.WriteLine("Enabled protocols: " + ServicePointManager.SecurityProtocol);
Console.WriteLine("Available protocols: ");
Boolean platformSupportsTls12 = false;
foreach (SecurityProtocolType protocol in Enum.GetValues(typeof(SecurityProtocolType))) {
Console.WriteLine(protocol.GetHashCode());
if (protocol.GetHashCode() == 3072){
platformSupportsTls12 = true;
}
}
Console.WriteLine("Is Tls12 enabled: " + ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072));
// enable Tls12, if possible
if (!ServicePointManager.SecurityProtocol.HasFlag((SecurityProtocolType)3072){
if (platformSupportsTls12){
Console.WriteLine("Platform supports Tls12, but it is not enabled. Enabling it now.");
ServicePointManager.SecurityProtocol |= (SecurityProtocolType)3072;
} else {
Console.WriteLine("Platform does not supports Tls12.");
}
}
if (ServicePointManager.SecurityProtocol.HasFlag(SecurityProtocolType.Ssl3))
{
Console.WriteLine("Ssl3SSL3 is enabled. Disabling it now.");
// disable SSL3. Has no negative impact if SSL3 is already disabled. The enclosing "if" if just for illustration.
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Ssl3;
}
Console.WriteLine("Enabled protocols: " + ServicePointManager.SecurityProtocol);
sortie
48-SSL3, 192 - TLS1, 768-TLS1.1, 3072-TLS1.2
Runtime: 4.7.2114.0
Enabled protocols: Ssl3, Tls
Available protocols:
0
48
192
768
3072
Is Tls12 enabled: False
Platform supports Tls12, but it is not enabled. Enabling it now.
Ssl3 is enabled. Disabling it now.
Enabled protocols: Tls, Tls12
pour être complet, voici un script Powershell qui définit les clés de registre susmentionnées:
new-itemproperty -path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord";
new-itemproperty -path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -name "SchUseStrongCrypto" -Value 1 -PropertyType "DWord"
la meilleure solution à ce problème semble être de mettre à jour au moins .NET 4.6 ou plus tard, qui choisira automatiquement des protocoles forts ainsi que des chiffreurs forts.
si vous ne pouvez pas passer à .NET 4.6, le Conseil de paramétrage
Système.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 / SecurityProtocolType.Tls12;
et en utilisant les paramètres du registre:
HKEY_LOCAL_MACHINE\SOFTWARE \ Microsoft.Netfram framework\v4.0.30319-SchUseStrongCrypto = DWORD de 1 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node \ Microsoft.Netfram framework\v4.0.30319-SchUseStrongCrypto = DWORD du 1
se traduit par l'utilisation de quelque chose d'autre que TLS 1.0 et un cryptage fort.
dans mon test, seul le réglage du Wow6432Node a fait la différence, même si mon application de test a été construite pour N'importe quel CPU.
une alternative au codage dur ServicePointManager.SecurityProtocol
ou la clé explicite SchUseStrongCrypto comme mentionné ci-dessus:
Vous pouvez dire à .NET d'utiliser les paramètres par défaut de SCHANNEL avec la touche SystemDefaultTlsVersions,
par exemple:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SystemDefaultTlsVersions"=dword:00000001
pour la clé: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.Netfram framework\v4.0.30319 Valeur: SchUseStrongCrypto
Vous devez définir la valeur à 1.