web-dev-qa-db-fra.com

Impossible de créer un canal sécurisé SSL/TLS, malgré la définition de ServerCertificateValidationCallback

J'essaie d'établir une connexion SSL/TLS au serveur test avec un certificat auto-signé. La communication via un canal non sécurisé a fonctionné sans problèmes.

Voici mon exemple de code, basé sur les solutions suivantes: Autoriser les certificats SSL non approuvés avec HttpClientC # Ignorer les erreurs de certificat?Client .NET se connectant à API Web SSL

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

aussi essayé ceci:

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

et ça

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

mais à chaque fois j'ai une exception:

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

Qu'est-ce que je fais mal? Pourquoi je ne peux pas me connecter à ce serveur (qui possède un certificat auto-signé non valide)

48

Vous le faites bien avec ServerCertificateValidationCallback. Ce n'est pas le problème que vous rencontrez. Le problème que vous rencontrez est probablement la version du protocole SSL/TLS.

Par exemple, si votre serveur ne propose que SSLv3 et TLSv10 et que votre client a besoin de TLSv12, vous recevrez ce message d'erreur. Ce que vous devez faire est de vous assurer que le client et le serveur prennent en charge une version de protocole commune.

Lorsque j'ai besoin d'un client capable de se connecter à autant de serveurs que possible (plutôt que d'être aussi sécurisé que possible), j'utilise ceci (avec la définition du rappel de validation):

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
104
Wapac

En guise de suivi pour tous ceux qui rencontrent encore ce problème, j'avais ajouté les options ServicePointManager.SecurityProfile, comme indiqué dans la solution:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Et pourtant, j'ai continué à obtenir le même message d'erreur «La demande a été abandonnée: impossible de créer un canal sécurisé SSL/TLS». J'essayais de me connecter à d'anciens serveurs de voix avec des interfaces API HTTPS SOAP (messagerie vocale, systèmes de téléphonie IP, etc. installés il y a plusieurs années). Celles-ci ne prennent en charge que les connexions SSL3 telles qu'elles ont été mises à jour il y a des années.

On pourrait penser qu’inclure SSl3 dans la liste des SecurityProtocols ferait l’affaire ici, mais ce n’est pas le cas. Le seul moyen de forcer la connexion était d'inclure SEULEMENT le protocole Ssl3 et aucun autre:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Ensuite, la connexion est établie - cela me semble un bogue, mais cela n’a commencé à générer des erreurs jusqu’à récemment sur les outils que je fournis à ces serveurs qui existent depuis des années - je crois que Microsoft a commencé à appliquer les modifications système apportées à cette mise à jour. comportement pour forcer les connexions TLS sauf s’il n’ya pas d’autre alternative. 

Quoi qu’il en soit, si vous rencontrez toujours ce problème avec certains anciens sites/serveurs, cela vaut la peine de le tenter.

11
Jeff Lindborg

Nous avons résolu le même problème aujourd'hui, et tout ce que vous avez à faire est d'augmenter la version d'exécution de .NET

4.5.2 n'a pas fonctionné pour nous avec le problème ci-dessus, alors que 4.6.1 était OK

Si vous devez conserver la version .NET, définissez

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
11
martinh_kentico

déplacez cette ligne: ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

Avant cette ligne: HttpWebRequest request = (HttpWebRequest) WebRequest.Create (uri);

Message d'origine: La mise à jour de sécurité KB4344167 rompt le code TLS

0
user2686690

Si vous utilisez un nouveau nom de domaine et que vous avez suivi toutes les procédures ci-dessus et que vous obtenez toujours le même message d'erreur, vérifiez si le cache DNS est effacé sur votre PC . Effacez votre DNS for more détails.

Windows® 8

Pour effacer votre cache DNS si vous utilisez Windows 8, procédez comme suit:

Sur votre clavier, appuyez sur Win + X pour ouvrir le menu WinX.

Cliquez avec le bouton droit de la souris sur Invite de commandes et sélectionnez Exécuter en tant qu'administrateur.

Exécutez la commande suivante:

ipconfig/flushdns

Si la commande réussit, le système renvoie le message suivant:

La configuration IP Windows a correctement vidé le cache de résolution DNS.

Windows® 7

Pour effacer votre cache DNS si vous utilisez Windows 7, procédez comme suit:

Cliquez sur Démarrer.

Entrez cmd dans la zone de texte de recherche du menu Démarrer.

Cliquez avec le bouton droit de la souris sur Invite de commandes et sélectionnez Exécuter en tant qu'administrateur.

Exécutez la commande suivante:

ipconfig/flushdns

Si la commande aboutit, le système renvoie le message suivant: La configuration IP de Windows a vidé le cache de résolution DNS.

0
Aviva

Je suis tombé sur ce fil parce que j'avais aussi l'erreur Impossible de créer le canal sécurisé SSL/TLS. Dans mon cas, j'essayais d'accéder à une API de configuration Siebel REST à partir de PowerShell à l'aide de Invoke-RestMethod, et aucune des suggestions ci-dessus ne m'a aidé. 

Finalement, je suis tombé sur la cause de mon problème: le serveur avec lequel je contactais l’authentification de certificat client requise.

Pour que les appels fonctionnent, je devais fournir au certificat du client (y compris la clé privée) le paramètre -Certificate:

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.Host/api/' -Certificate $Pfx -OtherParam ...

J'espère que mon expérience pourra aider quelqu'un d'autre qui a mon goût particulier pour ce problème.

0
paulf