Comment utiliser SSL3 au lieu de TLS dans un HttpWebRequest?
Ma demande a parler à des hôtes différents sur https, et le paramètre par défaut de ServicePointManager.SecurityProtocol = TLS
m'a bien servi jusqu'à ce jour. Maintenant j'ai quelques hôtes qui (comme System.Net
journal de suivi) ne réponds pas à la première poignée de main TLS message, mais de garder la connexion sous-jacente jusqu'à ce qu'elle expire, en lançant une exception délai. J'ai essayé de réglage HttpWebRequest
's timeout pour autant que 5 minutes, avec le même résultat. Sans doute ces hôtes sont en attente d'une SSL3 poignée de main depuis IE et Firefox sont en mesure de se connecter à ces hôtes après 30 à 40 secondes de retard. Il semble y avoir un mécanisme de secours .NET qui se dégrade de TLS pour SSL3, mais il n'est pas un coup de pied dans pour une raison quelconque.
FWIW, voici le message de handshake ma demande (envoi régulier TLS 1.0 CLIENT BONJOUR, message):
00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9..
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l.
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./
00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2
00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8..............
00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00 : ............
Est-il un moyen d'utiliser le protocole SSL3 au lieu de TLS dans un HttpWebRequest
, ou de la force de secours? Il semble que ServicePointManager
's réglage est global, et j'ai vraiment hate d'avoir à dégrader le protocole de sécurité réglage de SSL3 pour l'ensemble de l'application.
Oui, l'hypothèse s'est avérée correcte. Les hôtes ont été Netware, et il semble que c'est Netware sujet la politique de non reconnue/non valide les demandes de ne pas répondre ou de donner des messages d'erreur, sans doute pour réduire la surface d'attaque.
OriginalL'auteur Anton Tykhyy | 2010-06-12
Vous devez vous connecter pour publier un commentaire.
En fait,
ServicePointManager
paramètres sont par domaine d'application. Cela m'a permis de contourner le problème en créer un autre domaine d'application configuré pour utiliser uniquement SSL3, faire ma collecte de données objetMarshalByRefObject
(les deuxWebClient
etWebRequest
sont maréchal-par-ref, mais il vaut mieux réduire le nombre de croix-domaine d'application à des appels) et de la création. A fonctionné parfaitement combiné avec un délai d'attente de détection basé sur le schéma.System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
ou à qui cela peut concerner:
ServicePointManager
objet vient deSystem.Net
espace de noms, et maintient une statique de l'état. De la sorte, seuls "à l'aide" de l'espace de nom & exécuterServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
avant d'exécuter l'opération en cause(s) fait l'affaire.OriginalL'auteur Anton Tykhyy
.NET contient des dispositions pour négocier automatiquement vers le bas pour baisser les versions du protocole. La valeur de
ServicePointManager.SecurityProtocol
détermine le comportement. Il peut prendre 3 valeurs différentes:SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls
. Même si, il peut être modifié selon les besoins.Je ne peux pas trouver une solution sans avoir accès à un serveur avec le même comportement incorrect. Sur la seule suggestion que je puisse faire est de tenter de se connecter avec le
Ssl3 | Tls
paramètre, et si cela ne fonctionne pas puis réessayer avec leSsl3
réglage. Essayez de réduire le délai d'attente et la capture de l'exception délai puis de réessayer.MODIFIER
Beaucoup de ce que j'ai écrit dans la version précédente de cette réponse était erronée.
ServicePointManager.SecurityProtocol
doit rester le même pendant toute la durée de la demande, donc je l'ai fait d'une autre manière.OriginalL'auteur James K Polk