TLS 1.2 ne sont pas négociés sur .NET de 4,7 sans explicites ServicePointManager.SecurityProtocol appel

J'ai besoin de mettre à niveau un .NET application pour prendre en charge un appel à une API sur un site qui ne prend en charge TLS 1.2. De ce que j'ai lu, si l'application cible 4.6 ou plus, alors, il va utiliser le protocole TLS 1.2 par défaut.

Pour tester, j'ai créé une application Windows Forms qui cible 4.7. Malheureusement, il erreurs lorsque je n'ai pas explicitement défini ServicePointManager.SecurityProtocol. Voici le code:

HttpClient _client = new HttpClient();

var msg = new StringBuilder();

//If I uncomment the next line it works, but fails even with 4.7
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://sandbox.authorize.net");

httpWebRequest.KeepAlive = false;

try
{
    var httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse();

    msg.AppendLine("The HTTP request Headers for the first request are: ");

    foreach (var header in httpWebRequest.Headers)
    {
        msg.AppendLine(header.ToString());
    }

    ResponseTextBox.Text = msg.ToString();

}
catch (Exception exception)
{
   ResponseTextBox.Text = exception.Message;

   if (exception.InnerException != null)
   {
       ResponseTextBox.Text += Environment.NewLine + @"  ->" + exception.InnerException.Message;

       if (exception.InnerException.InnerException != null)
       {
            ResponseTextBox.Text += Environment.NewLine + @"     ->" + exception.InnerException.InnerException.Message;
       }
   }
}

Si vous décommentez la ligne suivante:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

il fonctionne. Ce n'est pas une bonne solution, car il est difficile de codes quels TLS version à utiliser, donc il ne serait pas utiliser le protocole TLS 1.3 dans l'avenir.

De quoi dois-je faire pour le faire fonctionner sans avoir cette ligne. Je suis en essais à partir d'une Fenêtre de 10 machine avec 4,7 installé.

Mise à jour

J'ai essayé un test avec HttpClient et avaient les mêmes résultats, j'ai eu à définir explicitement SecurityProtocol.

Code:

var msg = new StringBuilder();

//Need to uncomment code below for TLS 1.2 to be used
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

try
{
   var response = await _client.GetAsync(@"https://sandbox.authorize.net");

   msg.AppendLine("response.IsSuccessStatusCode : " + response.IsSuccessStatusCode);

   msg.AppendLine(await response.Content.ReadAsStringAsync());

   textBox.Text = msg.ToString();
  }

  catch (Exception exception)
  {
      textBox.Text = exception.Message;

      if (exception.InnerException != null)
      {
          textBox.Text += Environment.NewLine + @"  ->" + exception.InnerException.Message;
      }
   }
Vous pouvez OU la tls versions ensemble pour soutenir tous si vous le souhaitez. Mais, afin d'éviter la nécessité pour cet usage HttpClient (si vous pouvez faire de votre code asynchrone, sans blocage des appels)
Je ne veux pas de définir le protocole de sécurité parce que quand un nouveau, tels que TLS 1.3 devient disponible, il ne sera pas utilisé car il n'est pas dans la liste. Je vais réécrire mon test avec HttpClient, quel est le Protocole de Sécurité par défaut utilisé par HttpClient vs HttpWebResponse?
Ne prenez pas mon mot pour lui, mais je suppose HttpClient aurez en charge la négociation de la plus haute protocole disponible pour la version du CLR. Donc, votre prochaine mur de briques besoin d'un CLR mise à niveau au lieu de mise à niveau du code. C'est probablement une idée horrible, mais je me demande ce qui se passera si vous venez de tourner sur tous les bits: SecurityProtocolType s = (SecurityProtocolType)2147483647;
même résultat avec HttpClient, mis à jour en question le code utilisé.
Intéressant. Découvrez cette version note à propos de la v4.7 github.com/Microsoft/dotnet/blob/master/releases/net47/...

OriginalL'auteur Josh | 2017-06-25