Quel est le protocole de sécurité par défaut pour communiquer avec les serveurs qui prennent en charge jusqu'à TLS 1.2
? Est-ce que .NET
par défaut, choisir le protocole de sécurité le plus élevé pris en charge sur le côté serveur ou dois - je ajouter explicitement cette ligne de code:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Existe-t-il un moyen de modifier cette valeur par défaut, en plus d'un changement de code?
Enfin, ne prend en .NET 4.0
charge que jusqu'à TLS 1.0
? c'est-à-dire que je dois mettre à niveau les projets clients vers 4.5 pour les soutenirTLS 1.2
.
Ma motivation est de supprimer le support pour SSLv3
côté client même si le serveur le prend en charge (j'ai déjà un script PowerShell pour le désactiver dans le registre de la machine) et de prendre en charge le protocole TLS le plus élevé pris en charge par le serveur.
Mise à jour:
En regardant la ServicePointManager
classe dans .NET 4.0
je ne vois aucune valeur énumérée pour TLS 1.0
et 1.1
. Dans les deux cas .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 cassera pas en désactivant SSLv3
le registre.
Cependant, j'ai décidé de mettre à niveau toutes les applications vers .NET 4.5
et d'ajouter de SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
toute façon explicitement à tout le code d'amorçage de toutes les applications.
Cela fera des demandes sortantes vers divers API et services pour ne pas rétrograder SSLv3
et devrait sélectionner le niveau le plus élevé de TLS
.
Cette approche semble-t-elle raisonnable ou excessive? J'ai de nombreuses applications à mettre à jour, et je veux les pérenniser car j'entends même qu'elles TLS 1.0
pourraient être dépréciées dans un proche avenir par certains fournisseurs.
En tant que client effectuant des requêtes sortantes vers des API, la désactivation de SSL3 dans le registre a-t-elle même un effet dans le framework .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'investigation, je pense que les paramètres de registre n'auront aucun effet car ils s'appliquent à IIS (sous-clé serveur) et aux navigateurs (sous-clé client).
Désolé, ce message s'est transformé en plusieurs questions, suivi de réponses «peut-être».
Réponses:
Certains de ceux qui ont laissé des commentaires ont noté que
System.Net.ServicePointManager.SecurityProtocol
de valeurs spécifiques signifie que votre application ne pourra pas tirer parti des futures versions de TLS qui pourraient devenir les valeurs par défaut dans les futures mises à jour de .NET. Au lieu de spécifier une liste fixe de protocoles, vous pouvez activer ou désactiver les protocoles que vous connaissez et qui vous intéressent, en laissant les autres tels quels.Pour activer TLS 1.1 et 1.2 sans affecter les autres protocoles:
Notez l'utilisation de
|=
pour activer ces indicateurs sans désactiver les autres.Pour désactiver SSL3 sans affecter les autres protocoles:
la source
[Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12)
Invoke-RestMethod s'appuie sur les mêmes bibliothèques de framework .NET sous-jacentes.Net.ServicePointManager.SecurityProtocol = Net.ServicePointManager.SecurityProtocol OR Net.SecurityProtocolType.Tls12 OR Net.SecurityProtocolType.Tls12
La valeur
System.Net.ServicePointManager.SecurityProtocol
par défaut dans les deux .NET4.0/4.5
estSecurityProtocolType.Tls|SecurityProtocolType.Ssl3
..NET 4.0
prend en charge jusqu'àTLS 1.0
tandis que.NET 4.5
prend en charge jusqu'àTLS 1.2
Cependant, un ciblage d'application
.NET 4.0
peut toujours prendre en charge jusqu'àTLS 1.2
s'il.NET 4.5
est installé dans le même environnement..NET 4.5
installe par-dessus.NET 4.0
, remplaceSystem.dll
.J'ai vérifié cela en observant le protocole de sécurité correct défini dans le trafic avec
fiddler4
et en définissant manuellement les valeurs énumérées dans un.NET 4.0
projet:Référence:
Si vous tentez de pirater un environnement avec UNIQUEMENT
.NET 4.0
installé, vous obtiendrez l'exception:Cependant, je ne recommanderais pas ce "hack" car un futur patch, etc. pourrait le casser. *
Par conséquent, j'ai décidé que la meilleure façon de supprimer le support
SSLv3
est de:.NET 4.5
Ajoutez ce qui suit pour booster le code pour remplacer la valeur par défaut et la pérenniser:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
* Quelqu'un me corrige si ce hack est faux, mais les premiers tests je vois que ça marche
la source
ServicePointManager.cs
voir referencesource.microsoft.com/#System/net/System/Net/….NET 4.5
valeurs par défaut de Tls12 - mais comme vous l'avez indiqué ici, ce n'est pas le cas. Il vous donne la possibilité de l'utiliser pourSecurityProtocol
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12
selon support.microsoft.com/en-us/help/3069494/…Vous pouvez remplacer le comportement par défaut dans le registre suivant:
et
Pour plus de détails, veuillez consulter la mise en œuvre de
ServicePointManager
.la source
reg add HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /v SchUseStrongCrypto /t REG_DWORD /d 1 /reg:64
(et / ou/reg:32
)Créez un fichier texte avec une
.reg
extension et le contenu suivant: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 ...
la source
J'ai trouvé que lorsque je spécifie uniquement TLS 1.2, il négociera toujours à 1.1.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Je l'ai spécifié dans la méthode de démarrage Global.asax pour mon application Web .net 4.5.
la source
Le code suivant:
Constantes:
Les autres protocoles ne seront pas affectés. Cela rend cela compatible avec les futurs protocoles (Tls1.3, etc.).
Code
Production
la source
J'ai eu le problème lorsque mon client a mis à niveau TLS de 1.0 à 1.2. Mon application utilise .net framework 3.5 et s'exécute sur le serveur. Je l'ai donc corrigé de cette façon:
Avant d'appeler HttpWebRequest.GetResponse (), ajoutez cette commande:
Extensions 2 DLL en ajoutant 2 nouvelles classes: System.Net et System.Security.Authentication
Télécharger le lot:
Pour télécharger le lot et plus de détails, vous pouvez voir ici:
https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-.net-framework-3.5.1-on-windows-7 -sp1-et-serveur-2008-r2-sp1
la source
Le mécanisme de changement de registre a fonctionné pour moi après une lutte. En fait, mon application fonctionnait en 32 bits. J'ai donc dû changer la valeur sous chemin.
Le type de valeur doit être DWORD et une valeur supérieure à 0. Mieux utiliser 1.
la source
J'exécute sous .NET 4.5.2 et je n'étais satisfait d'aucune de ces réponses. Comme je parle à un système qui prend en charge TLS 1.2 et que SSL3, TLS 1.0 et TLS 1.1 sont tous cassés et dangereux à utiliser, je ne veux pas activer ces protocoles. Sous .NET 4.5.2, les protocoles SSL3 et TLS 1.0 sont tous deux 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 nouveauSystemDefault
le mode de protocole qui transfère explicitement la sélection du protocole au système d'exploitation, où je pense que s'appuyer sur le registre ou d'autres paramètres de configuration du système serait approprié. Cependant, cela ne semble pas être pris en charge sous .NET 4.5.2. Dans l'intérêt d'écrire du code compatible avec les versions ultérieures, cela continuera à prendre les bonnes décisions même lorsque TLS 1.2 sera inévitablement cassé à l'avenir, ou lorsque je passerai à .NET 4.7+ et confierai plus de responsabilités pour la sélection d'un protocole approprié pour le système d'exploitation. , J'ai adopté le code suivant:Ce code détectera lorsqu'un protocole connu non sécurisé est activé, et dans ce cas, nous supprimerons ces protocoles non sécurisés. S'il ne reste aucun autre protocole explicite, nous forcerons alors l'activation de TLS 1.2, en tant que seul protocole sécurisé connu pris en charge par .NET à ce stade. Ce code est compatible vers l'avant, car il prendra en considération les nouveaux types de protocoles qu'il ne sait pas être ajoutés à l'avenir, et il jouera également bien avec le nouveau
SystemDefault
état dans .NET 4.7, ce qui signifie que je n'aurai pas à revisiter ce code à l'avenir. Je recommanderais fortement d'adopter une approche comme celle-ci, plutôt que de coder en dur des états de protocole de sécurité particuliers 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 est inévitablement cassé, ou plus probablement vous devrez laisser les protocoles non sécurisés existants activés pendant des années sur votre serveur, faisant de votre organisation une cible pour les attaques.la source
SecurityProtocolType.SystemDefault
drapeau est évalué0
, donc vérifierif (securityProtocols == 0)
avec le bitwise inclus ou le drapeau pour TLS 1.2 inclura toujours TLS 1.2, même après les "pauses", n'est-ce pas? Pas de prise de vue nette ici. J'essaie vraiment de trouver la meilleure voie à suivre.if (!Enum.IsDefined(typeof(SecurityProtocolType), 0) && securityProtocols == 0) { securityProtocols |= SecurityProtocolType.Tls12; }
.securityProtocols |= SecurityProtocolType.Tls12;
(sans bloc si) ne maintient pas SystemDefault, les securityProtocols n'ont que TLS2 par la suite. Donc, voulez-vous dire que lorsque la valeur est SystemDefault, aucune valeur ne doit être mise à jour? Concernant la compatibilité ascendante, supposez-vous que le système d'exploitation se chargerait d'activer un protocole plus récent comme TLS 1.3?securityProtocols |= SecurityProtocolType.Tls12;' will add TLS 1.2, but because the
énumération de la ligne SecurityProtocolType` a un[Flags]
attribut, et la valeur d'énumération SystemDefault est0
, la valeur SystemDefault sera supprimée, même si elle a été précédemment définie. Le résultat final est que vous pouvez soit définir la valeurSevicePointManager.SecurityProtocol
0, soit toute combinaison des autres valeurs d'énumération. Si vous le définissez sur SystemDefault, vous désactivez essentiellement la spécification du protocole vous-même et laissez le système d'exploitation décider.Microsoft a récemment publié les meilleures pratiques à ce sujet. https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
Résumé
Ciblez .Net Framework 4.7, supprimez tout code définissant le protocole de sécurité, ainsi le système d'exploitation vous garantira d'utiliser la solution la plus sécurisée.
NB: Vous devrez également vous assurer que la dernière version de TLS est prise en charge et activée sur votre système d'exploitation.
Pour plus d'informations et d'anciens cadres, veuillez vous référer au lien MS.
la source
if (System.Environment.OSVersion.Version < new Version(6, 2) /* Windows 8 */) ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; else ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
Pour être complet, voici un script Powershell qui définit les clés de registre susmentionnées:
la source
Une alternative au codage en dur
ServicePointManager.SecurityProtocol
ou à la clé SchUseStrongCrypto explicite comme mentionné ci-dessus:Vous pouvez dire à .NET d'utiliser les paramètres SCHANNEL par défaut avec la clé SystemDefaultTlsVersions,
par exemple:
la source
La meilleure solution à ce problème semble être de mettre à niveau au moins .NET 4.6 ou version ultérieure, qui choisira automatiquement des protocoles forts ainsi que des chiffrements solides.
Si vous ne pouvez pas mettre à niveau vers .NET 4.6, les conseils de configuration
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Et en utilisant les paramètres du registre:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD sur 1 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft.NETFramework \ v4.0.30319 - SchUseStrongCrypto = DWORD
Résultats en utilisant autre chose que TLS 1.0 et un chiffrement fort.
Lors de mes tests, seul le paramètre du Wow6432Node a fait la différence, même si mon application de test a été conçue pour n'importe quel processeur.
la source
Selon les meilleures pratiques de TLS (Transport Layer Security) avec le .NET Framework : Pour garantir la sécurité des applications .NET Framework, la version TLS ne doit pas être codée en dur. Définissez plutôt les clés de registre:
SystemDefaultTlsVersions
etSchUseStrongCrypto
:la source
Si vous pouvez utiliser .NET 4.7.1 ou une version plus récente, il utilisera TLS 1.2 comme protocole minimum en fonction des capacités du système d'exploitation. Par recommandation Microsoft:
la source
Pour la clé: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft.NETFramework \ v4.0.30319 Valeur: SchUseStrongCrypto
Vous devez définir la valeur sur 1.
la source