148 votes

Comment ignorer la vérification du certificat lorsque ssl

J'essaie de trouver un moyen d'ignorer la vérification du certificat lorsque je demande une ressource Https, jusqu'à présent, j'ai trouvé quelques articles utiles sur Internet.

Mais j'ai toujours un problème. Veuillez revoir mon code. Je ne comprends pas ce que fait le code ServicePointManager.ServerCertificateValidationCallback moyen.

Quand cette méthode déléguée sera-t-elle appelée ? Et une dernière question, à quel endroit dois-je écrire ce code ? Avant ServicePointManager.ServerCertificateValidationCallback exécuter ou avant Stream stream = request.GetRequestStream() ?

public HttpWebRequest GetRequest()
{
    CookieContainer cookieContainer = new CookieContainer();

    // Create a request to the server
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_remoteUrl);

    #region Set request parameters

    request.Method = _context.Request.HttpMethod;
    request.UserAgent = _context.Request.UserAgent;
    request.KeepAlive = true;
    request.CookieContainer = cookieContainer;
    request.PreAuthenticate = true;
    request.AllowAutoRedirect = false;

    #endregion

    // For POST, write the post data extracted from the incoming request
    if (request.Method == "POST")
    {
        Stream clientStream = _context.Request.InputStream;
        request.ContentType = _context.Request.ContentType;
        request.ContentLength = clientStream.Length;

        ServicePointManager.ServerCertificateValidationCallback = delegate(
            Object obj, X509Certificate certificate, X509Chain chain, 
            SslPolicyErrors errors)
            {
                return (true);
            };

            Stream stream = request.GetRequestStream();

            ....
        }

        ....

        return request;
    }
}

195voto

Adam Venezia Points 251

Pour ceux qui souhaitent appliquer cette solution à chaque demande, il s'agit d'une option qui utilise une expression Lambda. La même expression Lambda peut également être appliquée au filtre global mentionné par blak3r. Cette méthode semble nécessiter .NET 4.5.

String url = "https://www.stackoverflow.com";
HttpWebRequest request = HttpWebRequest.CreateHttp(url);
request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

En .NET 4.0, l'expression lambda peut être appliquée au filtre global de la manière suivante

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

73voto

Sani Huttunen Points 10433

Puisqu'il n'y a qu'une seule ServicePointManager , réglage ServicePointManager.ServerCertificateValidationCallback aura pour résultat que toutes les demandes suivantes hériteront de cette politique. Étant donné qu'il s'agit d'un "paramètre" global, il serait préférable de le définir dans l'onglet Application_Start méthode dans Global.asax .

La définition de la fonction de rappel annule le comportement par défaut et vous pouvez créer vous-même une routine de validation personnalisée.

58voto

blak3r Points 5096

Cela a marché pour moi :

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                        System.Security.Cryptography.X509Certificates.X509Chain chain,
                        System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true; // **** Always accept
    };

Un extrait d'ici : http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors

29voto

Andrej Rommel Points 298

Il y a aussi la solution du délégué court :

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

10voto

Soit dit en passant, c'est la façon la moins verbeuse que je connaisse pour désactiver toute validation de certificat dans une application donnée :

ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X