J'ai besoin de POSTER des données JSON sur un point de terminaison TLS 1.2. Je souhaite que le SecurityProtocol soit spécifié dans App.config au lieu d'être codé en dur dans la source et je ne souhaite pas configurer le registre de la machine pour désactiver TLS 1.1.

Si vous ne spécifiez pas le SecurityProtocol, les protocoles du système d'exploitation sous-jacents sont utilisés, mais ils semblent être par défaut le moins sécurisé au lieu du plus sécurisé. Parce que j'ai plusieurs services exécutés à 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 spécifique utilise TLS 1.2, et lorsque TLS 1.3 sortira, je pourrai le modifier via une configuration spécifique à l'application.

Cette question explique comment le faire via le code: Comment faire spécifier le protocole SSL à utiliser pour la classe WebClient

Cette question explique comment le faire via les paramètres de registre pour l'ensemble de la machine: Sont existe-t-il une implémentation .NET de 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 avait un élément sslStreamSecurity à l'intérieur de system.serviceModel, mais je crois que c'est pour ServiceReferences, pas pour HttpWebRequest normal. Je pense que cela est couvert par system.net mais je ne trouve pas d'é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 à utiliser autre chose que HttpWebRequest / HttpWebResponse mais je voudrais éviter d'installer des packages tiers. J'ai commencé un chemin avec System.Net.Http.HttpClient qui semble plus récent que HttpWebRequest mais je suis rapidement tombé sur les mêmes problèmes.

7
Carson Evans 3 août 2017 à 21:31

2 réponses

Meilleure réponse

Pour l'instant, j'ai mis une valeur entière dans App.config qui spécifie la valeur d'énumération à définir System.Net.ServicePointManager.SecurityProtocol. Je pense toujours qu'il y a peut-être une façon plus élégante de le faire et j'attends avec impatience d'autres réponses. J'ai é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>
2
Carson Evans 9 sept. 2017 à 01:04

Exemple utilisant le nom du protocole au lieu de codes entiers.

string securityProtocol = ConfigurationManager.AppSettings["SecurityProtocol"].ToString();

try
{
    System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)Enum.Parse(typeof(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));
    }
}

Pour App.Config

<appSettings>
    <add key="SecurityProtocol" value="Tls12" />
</appSettings>
3
Muhammad Yousaf Sulahria 21 juin 2018 à 22:14