Comment ignorer la vérification du certificate quand ssl

J’essaie de trouver un moyen d’ignorer la vérification du certificate lorsque je demande une ressource Https, jusqu’à présent, j’ai trouvé un article utile sur Internet.

Mais j’ai toujours un problème. S’il vous plaît examiner mon code. Je ne comprends tout simplement pas ce que signifie le code ServicePointManager.ServerCertificateValidationCallback .

Quand cette méthode de délégué sera-t-elle appelée? Et une autre question, à quel endroit dois-je écrire ce code? Avant que ServicePointManager.ServerCertificateValidationCallback exécuté 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 certificatee, X509Chain chain, SslPolicyErrors errors) { return (true); }; Stream stream = request.GetRequestStream(); .... } .... return request; } } 

Comme il n’y a qu’un seul ServicePointManager global, la définition de ServicePointManager.ServerCertificateValidationCallback donnera le résultat que toutes les requêtes ultérieures hériteront de cette stratégie. Comme il s’agit d’un “paramètre” global, il serait préférable de le définir dans la méthode Application_Start dans Global.asax .

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

Pour toute personne intéressée par l’application de cette solution par 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.

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

Dans .NET 4.0, l’expression Lambda peut être appliquée au filtre global en tant que tel

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

Cela a fonctionné pour moi:

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

Snippet from here: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors

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

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Mention a été faite qu’avant .NET 4.5, la propriété de la demande d’access à son ServicePointManager n’était pas disponible.

Voici le code .NET 4.0 qui vous donnera access à ServicePoint pour chaque demande. Il ne vous donne pas access au rappel par demande, mais il devrait vous permettre de trouver plus de détails sur le problème. Accédez simplement aux scvPoint.Certificate (ou ClientCertificate si vous préférez).

 WebRequest request = WebRequest.Create(uri); // oddity: these two .Address values are not necessarily the same! // The service point appears to be related to the .Host, not the Uri itself. // So, check the .Host vlaues before fussing in the debugger. // ServicePoint svcPoint = ServicePointManager.FindServicePoint(uri); if (null != svcPoint) { if (!request.RequestUri.Host.Equals(svcPoint.Address.Host, SsortingngComparison.OrdinalIgnoreCase)) { Debug.WriteLine(".Address == " + request.RequestUri.ToSsortingng()); Debug.WriteLine(".ServicePoint.Address == " + svcPoint.Address.ToSsortingng()); } Debug.WriteLine(".IssuerName == " + svcPoint.Certificate.GetIssuerName()); } 

Sur la base de la réponse d’Adam et du commentaire de Rob, j’ai utilisé ceci:

 ServicePointManager.ServerCertificateValidationCallback += (sender, certificatee, chain, sslPolicyErrors) => certificatee.Issuer == "CN=localhost"; 

ce qui filtre le “ignorer” un peu. D’autres émetteurs peuvent être ajoutés si nécessaire, bien entendu. Cela a été testé dans .NET 2.0 car nous avons besoin de prendre en charge un code hérité.

Tout simplement, il s’agit de la méthode la moins verbeuse pour désactiver toute validation de certificate dans une application donnée, à ma connaissance:

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

En plus des réponses de Sani et de blak3r, j’ai ajouté les éléments suivants au code de démarrage de mon application, mais en VB:

 '** Overriding the certificatee validation check. Net.ServicePointManager.ServerCertificateValidationCallback = Function(sender, certificatee, chain, sslPolicyErrors) True 

Semble faire l’affaire.

J’ai eu le même problème, alors j’ai créé un cours plutôt que d’aider avec mes codes. Mais utilisez un HttpClient:

https://github.com/PicolotoLF/IgnoresSSL

Exemple:

 public async Task DoRequest() { IgnoreSSL Client = new IgnoreSSL(); var client = Client.IgnoreSSLA(); //NOTE(picoloto): Use how a HttpClient var response = await client.GetAsync(URL) } 

Conseil: vous pouvez également utiliser cette méthode pour suivre les certificates qui doivent bientôt expirer. Cela peut sauver votre bacon si vous découvrez un certificate qui est sur le point d’expirer et qui peut le réparer à temps. Bon aussi pour les sociétés tierces – pour nous, c’est DHL / FedEx. DHL se contente de laisser un certificate expirer, ce qui nous dérange 3 jours avant Thanksgiving. Heureusement que je suis là pour le réparer … cette fois!

  private static DateTime? _nextCertWarning; private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { if (error == SslPolicyErrors.None) { var cert2 = cert as X509Certificate2; if (cert2 != null) { // If cert expires within 2 days send an alert every 2 hours if (cert2.NotAfter.AddDays(-2) < DateTime.Now) { if (_nextCertWarning == null || _nextCertWarning < DateTime.Now) { _nextCertWarning = DateTime.Now.AddHours(2); ProwlUtil.StepReached("CERT EXPIRING WITHIN 2 DAYS " + cert, cert.GetCertHashString()); // this is my own function } } } return true; } else { switch (cert.GetCertHashString()) { // Machine certs - SELF SIGNED case "066CF9CAD814DE2097D367F22D3A7E398B87C4D6": return true; default: ProwlUtil.StepReached("UNTRUSTED CERT " + cert, cert.GetCertHashString()); return false; } } }