0

J'ai besoin d'envoyer des données JSON à un point de terminaison TLS 1.2. Je voudrais avoir le SecurityProtocol spécifié dans App.config au lieu d'être codé en dur dans la source et ne pas vouloir définir le registre de la machine pour désactiver TLS 1.1. Si vous ne spécifiez pas le protocole SecurityProtocol, les protocoles de système d'exploitation sous-jacents sont utilisés, mais ils semblent être les moins sécurisés et non les plus sécurisés. Étant donné que plusieurs services s'exécutent à partir de la machine, je ne peux pas configurer le système d'exploitation pour utiliser uniquement TLS1.2, mais je veux toujours que ce client utilise TLS 1.2 et que TLS 1.3 soit capable de le modifier via une configuration spécifique.Spécification de SSL/TLS pour System.Net.HttpWebRequest via App.config

Cette question explique comment le faire via le code: How to specify SSL protocol to use for WebClient class

Cette question explique comment le faire via les paramètres du Registre pour toute la machine: Are there .NET implementation of TLS 1.2?

// this is what I want to avoid 
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocol.Tls12; 

System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url); 

using (System.IO.StreamWriter sw = new System.IO.StreamWriter(request.GetRequestStream())) 
{ 
    sw.write(json); 
} 

System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse(); 
using System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream())) 
{ 
    content = sr.ReadToEnd(); 
} 

Je n'ai rien dans mon App .config pour ce client actuellement mais c'est ce que je voudrais changer.

J'ai trouvé qu'il y a un élément sslStreamSecurity dans system.serviceModel, mais je crois que c'est pour ServiceReferences, pas HttpWebRequest normal. Je crois que cela est couvert par system.net mais je ne peux pas trouver un équivalent.

<system.serviceModel> 
    <bindings> 
    <customBinding> 
     <binding name="myBinding"> 
     <sslStreamSecurity sslProtocls="Tls12"> 
     </binding> 
    </customBinding> 
    </bindings> 
    <client> 
    <endpoint address="https://myserver.com" binding="customBinding" bindingConfiguration="myBinding" name="myEndpoint" /> 
    </client> 
</system.ServiceModel> 

Je suis assez ouvert à l'aide d'autre chose que HttpWebRequest/HttpWebResponse mais aimerait rester loin de l'installation des logiciels tiers. J'ai commencé un chemin avec System.Net.Http.HttpClient qui semble plus récent que HttpWebRequest, mais a rapidement rencontré les mêmes problèmes.

Répondre

0

Pour l'instant j'ai mis une valeur entière dans le App.config qui spécifie la valeur enum pour définir System.Net.ServicePointManager.SecurityProtocol à. Je pense toujours qu'il pourrait y avoir une façon plus élégante de le faire et d'attendre d'autres réponses. J'été guidé dans cette direction par https://stackoverflow.com/a/35325333/5221761

int securityProtocol = Convert.ToInt32(ConfigurationManager.AppSettings["SecurityProtocol"]); 

try 
{ 
    System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)securityProtocol; 
} 
catch(Exception ex) 
{ 
    Console.WriteLine("Could not setup SecurityProtocol. Try a different integer value: " + ex.Message); 
    foreach (System.Net.SecurityProtocolType protocolType in Enum.GetValues(typeof(System.Net.SecurityProtocolType))) 
    { 
     Console.WriteLine(string.Foramt("SecurityProtocol: {0} - {1}", protocolType.ToString(), (int)protocolType)); 
    } 
} 

App.config:

<appSettings> 
    <add key="SecurityProtocol" value="3072" /> 
</appSettings>