web-dev-qa-db-fra.com

La demande a été abandonnée: impossible de créer le canal sécurisé SSL/TLS

Mon client m'a informé de problèmes avec son SSL et Internet Explorer. Ils ont déclaré avoir des problèmes de confiance lorsqu'ils accédaient à l'URL. 

J'accède au JSON via HTTPS. Le site Web repose sur un serveur et j'utilise l'application de console sur mon ordinateur local. J'essaie de contourner le certificat SSL, cependant, mon code échoue toujours.

Puis-je modifier HttpWebRequest pour résoudre ce problème?

Je reçois cette erreur en utilisant ce code:

    // You must change the URL to point to your Web server.
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = "GET";
        req.AllowAutoRedirect = true;

        // allows for validation of SSL conversations
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };


        WebResponse respon = req.GetResponse();
        Stream res = respon.GetResponseStream();

        string ret = "";
        byte[] buffer = new byte[1048];
        int read = 0;
        while ((read = res.Read(buffer, 0, buffer.Length)) > 0)
        {
            //Console.Write(Encoding.ASCII.GetString(buffer, 0, read));
            ret += Encoding.ASCII.GetString(buffer, 0, read);
        }
        return ret;
51
Joseph Anderson

J'ai activé la journalisation en utilisant ce code:

http://blogs.msdn.com/b/dgorti/archive/2005/09/18/471003.aspx

Le journal était dans le dossier bin/debug (j'étais en mode débogage pour mon application de console). Vous devez ajouter le type de protocole de sécurité SSL 3.

J'ai reçu une incompatibilité d'algorithme dans le journal. Voici mon nouveau code:

        // You must change the URL to point to your Web server.
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = "GET";
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;


        // Skip validation of SSL/TLS certificate
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };


        WebResponse respon = req.GetResponse();
        Stream res = respon.GetResponseStream();

        string ret = "";
        byte[] buffer = new byte[1048];
        int read = 0;
        while ((read = res.Read(buffer, 0, buffer.Length)) > 0)
        {
            Console.Write(Encoding.ASCII.GetString(buffer, 0, read));
            ret += Encoding.ASCII.GetString(buffer, 0, read);
        }
        return ret;
19
Joseph Anderson

Je devais activer d'autres versions du protocole de sécurité pour résoudre le problème:

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

Semblable à une réponse existante mais dans PowerShell:

[System.Net.ServicePointManager]::SecurityProtocol = `
[System.Net.SecurityProtocolType]::Tls11 -bor 
[System.Net.SecurityProtocolType]::Tls12 -bor `   
[System.Net.SecurityProtocolType]::Tls -bor `
[System.Net.SecurityProtocolType]::Ssl3

Puis appeler Invoke-WebRequest devrait fonctionner.

Cela provient de commentaires anonymes, bonne suggestion: Une façon plus simple d’écrire ceci serait:

[System.Net.ServicePointManager]::SecurityProtocol = @("Tls12","Tls11","Tls","Ssl3")

J'ai trouvé cet article fantastique et connexe de Jaykul: Validation de certificats auto-signés de .Net et PowerShell

10
Craig - MSFT

Cela peut être causé par plusieurs facteurs (du plus probable au moins probable):

  1. Le certificat SSL du serveur n'est pas approuvé par le client. La vérification la plus simple consiste à pointer un navigateur sur l'URL et à voir si vous obtenez une icône de verrou SSL. Si vous obtenez un verrou cassé, icône, cliquez dessus pour voir quel est le problème:

    1. Dates expirées - obtenez un nouveau certificat SSL
    2. Le nom ne correspond pas - assurez-vous que votre URL utilise le même nom de serveur que le certificat.
    3. Non signé par une autorité de confiance - achetez un certificat auprès d'une autorité telle que Verisign ou ajoutez-le au magasin de certificats de confiance du client.
    4. Dans les environnements de test, vous pouvez mettre à jour votre validateur de certificat pour ignorer les vérifications d'accès. Ne faites pas cela en production.
  2. Le serveur requiert un certificat SSL client. Dans ce cas, vous devez mettre à jour votre code pour signer la demande avec un certificat client.

6
Jon Wagner

S'il vous plaît voir le lien ci-dessous une fois. SecurityProtocolType.SsL3 est maintenant ancien.

http://codemust.com/poodle-vulnerability-fix-openssl/

1
Rajesh Pathakoti