web-dev-qa-db-fra.com

Demander du HTML sur https avec c # Webclient

J'essaie diverses ressources html via la classe c # WebClient à partir d'un site sur lequel je n'ai aucun contrôle. Lorsque j'essaie d'accéder à des URL telles que " https://archive.org/details/OTRR_In_The_Name_Of_The_Law_Singles "

J'obtiens l'erreur: System.Net.WebException: la demande a été abandonnée: impossible de créer un canal sécurisé SSL/TLS.

J'ai trouvé des solutions qui suggèrent que j'utilise le code suivant pour ignorer l'exigence de certificat et pour que le client Web agisse comme un navigateur, mais je reçois toujours la même erreur

 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(
            delegate
            {
                return true;
            });
            using(WebClient webClient = new WebClient()) {
                webClient.Headers["User-Agent"] = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)";
                webClient.Headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                webClient.Headers["Accept-Language"] = "en-us,en;q=0.5";
                webClient.Headers["Accept-Encoding"] = "gzip,deflate";
                webClient.Headers["Accept-Charset"] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
                StreamReader sr = new StreamReader(webClient.OpenRead(inputString));
}
14
RRadix

Lisez ceci: http://support.Microsoft.com/kb/915599

Le serveur auquel vous accédez ne prend pas en charge TLS, vous devrez donc le forcer à utiliser SSL3.

Ajoutez la ligne suivante à votre appel:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Voici un exemple pleinement fonctionnel:

using System;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main(string[] args)
    {
        Uri address = new Uri("https://archive.org/details/OTRR_In_The_Name_Of_The_Law_Singles");

        ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 ;

        using (WebClient webClient = new WebClient())
        {
            var stream = webClient.OpenRead(address);
            using (StreamReader sr =new StreamReader(stream))
            {
                var page = sr.ReadToEnd();
            }
        }
    }

    /// <summary>
    /// Certificate validation callback.
    /// </summary>
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    {
        // If the certificate is a valid, signed certificate, return true.
        if (error == System.Net.Security.SslPolicyErrors.None)
        {
            return true;
        }

        Console.WriteLine("X509Certificate [{0}] Policy Error: '{1}'",
            cert.Subject,
            error.ToString());

        return false;
    }
23
David Martin

dans .net Framework 4.0, ajoutez

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; //TLS 1.2
11
Sergey S

Ajoutez simplement cette ligne avant var stream = webClient.OpenRead(address);

System.Net.ServicePointManager.ServerCertificateValidationCallback += (send, certificate, chain, sslPolicyErrors) => { return true; };

Cela devrait trier l'erreur SSL/TLS

3
Pierre