Définir la SecurityProtocol (Ssl3 ou TLS) sur l' .net HttpWebRequest par demande
Ma demande.net 3.5 sp1) utilise la HttpWebRequest à communiquer avec différents effets, parfois, de ses plus de HTTPS où chaque serveur d'hébergement peut-être un autre protocole de sécurité exigence de dire TLS ou SSL3 ou l'autre.
Généralement les serveurs de jeu agréable et heureux de négocier et de repli sur ce SecurityProtocol pour utiliser TLS ou SSL3, mais certains ne sont pas et quand .net est mis en place comme TLS ou SSL3 (par défaut je crois), ces serveurs qui prennent en charge uniquement SSL3 cause .net pour jeter un envoyer erreur.
De ce que je peux dire .net propose les ServicePointManager objet d'une propriété SecurityProtocol qui peut être définie à TLS, SSL3 ou les deux. Donc, idéalement, lorsque vous réglez à la fois l'idée est que le client et le serveur doivent négocier de quoi l'utiliser, mais comme dit précédemment, qui ne semble pas fonctionner.
Soi-disant, vous pouvez définir la ServicePointManager.SecurityProtocol = Ssl3, mais ce que sur les systèmes d'extrémité qui veulent utiliser TLS?
Le problème que je vois avec la ServicePointManager et la SecurityProtocol est que statique et donc du domaine d'application de large.
Donc à la question..
comment pourrais-je aller sur l'aide de la HttpWebRequest avec un autre SecurityProtocol par exemple
1) de l'adresse url 1 configuré pour utiliser le protocole TLS | Ssl3 (à négocier)
2) url set de 2 à Ssl3 (Ssl3 seulement)
Vous devez vous connecter pour publier un commentaire.
Malheureusement, il n'a pas l'air comme vous pouvez le personnaliser par point de service. Je voudrais vous suggérer de déposer une demande de fonctionnalité à la MS se Connecter site web pour ce domaine.
Comme un sale solution de contournement, vous pouvez essayer d'exécuter les sites qui nécessitent un protocole de sécurité différents dans un nouveau domaine d'application. Statique instances sont par domaine d'application, ce qui devrait vous donner l'isolement dont vous avez besoin.
J'ai eu le même problème et a écrit de la classe proxy, qui ouvre le port sur localhost et transmet l'ensemble du trafic à l'hôte spécifié:port.
si la connexion va comme ceci
[votre code] --- HTTP ---> [proxy localhost:port] --- HTTPS ---> [site web]
en fait, il peut être utilisé pour envelopper un protocole SSL/TLS pas juste HTTP
exemple d'utilisation
Après certains de nos fournisseurs cessé de soutien pour ssl3 tandis que d'autres l'utilisent exclusivement, de nombreuses questions apparaissent dans notre système, qui pourrait être résolu avec la fonctionnalité de cette question. Mais six ans après, nous n'avons pas encore intégré dans le mécanisme pour y parvenir. Notre solution de contournement consiste à définir explicitement le protocole de sécurité qui prendront en charge tous les scénarios, comme ceci:
Comme par cette réponse, le SecurityProtocol réglage est fait par domaine d'application, de sorte que vous pourriez, si vous ont été déterminés à faire un travail, de créer des domaines d'application pour des paramètres distincts, et marshall vos requêtes à travers.
Pas exactement un "pur" de la solution, mais peut faire ce que vous avez besoin d'possible sans avoir recours à des tiers pour les bibliothèques.
Vous pouvez atteindre cet objectif par le présent code pour fermer tous les liens sous-jacents et de la vigueur d'une nouvelle poignée de main.
Net 4.6 il y a HttpClient et WinHttpHandler nuget package est disponible pour windows (à partir de microsoft) pour définir SslProtocols paramètres. Avec Net core, vous pouvez utiliser HttpClientHandler classe pour le même.
Vous pourriez faire un HttpWebRequest utilitaire "classe" avec un statique d'utilité méthode pour la fabrication de HttpWebRequests. En statique méthode utilitaire utiliser l'instruction c# lock autour de réglage de la ServicePointManager.SecurityProtocol et la création d'un particulier HttpWebRequest. L'instruction lock empêche les autres threads du même domaine d'application pour exécuter le même code en même temps, donc le protocole TLS que vous venez de définir n'obtiendrez pas changé jusqu'à ce que l'ensemble de la serrure de bloc (= section critique) est exécutée.
Mais conscient, pour vraiment performante des applications de (très haute performance!) cette approcah pourrait avoir un impact négatif sur les performances.
Ensemble de tout cela. Dans mon application, c'est un travail pour les différents protocoles de sécurité.
Je sais que cette question est ancienne, mais la question reste la même .Net 4.7.2. Dans mon cas, j'ai une application multi-thread qui est en train de parler à deux points de terminaison. D'un point de terminaison ne fonctionne qu'avec TLS 1.2, et l'autre extrémité fonctionne uniquement avec le protocole TLS 1.0 (l'équipe responsable pour que l'on travaille sur la fixation de leur point de terminaison de sorte qu'il sera également en charge de TLS 1.2).
Pour contourner ce problème, j'ai déplacé les appels de service pour le point de terminaison qui fonctionne uniquement avec le protocole TLS 1.0 à une classe distincte dans la même assemblée, puis chargé de l'assemblage dans un autre domaine d'application. En faisant cela, je peux utiliser cette variable globale:
juste pour les appels vers le point de terminaison cassé, tout en ayant aussi des appels à la TLS 1.2 point de terminaison (qui ne nécessitent pas de réglage ServicePointManager.SecurityProtocol à rien de précis) de continuer à travailler. Cela garantit également que lorsque le bon point de terminaison est mis à niveau vers TLS 1.3 je n'ai pas besoin de re-publier mon application. Mon application est multi-thread et de haute capacité, donc, de verrouillage ou de try/finally ne sont pas des solutions adéquates.
Voici le code que j'ai utilisé pour charger l'assembly dans un domaine distinct. Notez que je charge le montage à partir de son emplacement actuel (Aspnet Tempfiles), afin de ne pas bloquer l'ensemble dans le répertoire bin et de bloquer les futurs déploiements.
Il est également à noter que la classe de proxy hérite de MarshalByRefObject, de sorte qu'il est utilisé comme un proxy transparent qui préserve le Système.Net.ServicePointManager avec sa propre valeur dans son propre domaine d'application.
Cela semble comme une bête limitation de la part de l' .Net framework, je souhaite que nous pourrions il suffit de spécifier le Protocole directement sur le web demande au lieu de sauter à travers des cerceaux, surtout après des années de cela. 🙁
Ce code fonctionne, espérons que cela vous aide! 🙂
Puis, dans une catégorie distincte: