Как игнорировать проверку сертификата, когда ssl

Я пытаюсь найти способ игнорировать проверку сертификата при запросе ресурса Https, до сих пор я нашел полезную статью в Интернете.

Но у меня все еще есть проблемы. Просмотрите мой код. Я просто не понимаю, что означает код ServicePointManager.ServerCertificateValidationCallback .

Когда будет вызван этот метод делегата? И еще один вопрос, в каком месте я должен писать этот код? Прежде чем ServicePointManager.ServerCertificateValidationCallback выполнит или до 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; } } 

Поскольку существует только один глобальный ServicePointManager , установка ServicePointManager.ServerCertificateValidationCallback приведет к тому, что все последующие запросы наследуют эту политику. Поскольку это глобальная «настройка», было бы желательно установить ее в методе Application_Start в Global.asax .

Установка обратного вызова отменяет поведение по умолчанию, и вы сами можете создать пользовательскую процедуру проверки.

Для всех, кто заинтересован в применении этого решения для каждого запроса, это опция и использует выражение Lambda. То же самое выражение Lambda может быть применено к глобальному фильтру, упомянутому также blak3r. Для этого метода требуется .NET 4.5.

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

В .NET 4.0 выражение Lambda Expression может применяться к глобальному фильтру как таковому

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

Это сработало для меня:

 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 }; 

Фрагмент отсюда: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors

Также есть короткое решение для делегатов:

 ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Было упомянуто, что до .NET 4.5 свойство запроса на доступ к его ServicePointManager было недоступно.

Вот код .NET 4.0, который даст вам доступ к ServicePoint по запросу. Он не дает вам доступа к обратному запросу для каждого запроса, но он должен позволить вам узнать более подробную информацию о проблеме. Просто получите доступ к scvPoint.Certificate (или ClientCertificate если хотите).

 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, StringComparison.OrdinalIgnoreCase)) { Debug.WriteLine(".Address == " + request.RequestUri.ToString()); Debug.WriteLine(".ServicePoint.Address == " + svcPoint.Address.ToString()); } Debug.WriteLine(".IssuerName == " + svcPoint.Certificate.GetIssuerName()); } 

Основываясь на ответе Адама и комментариях Роба, я использовал это:

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

который несколько фильтрует «игнорирование». Другие эмитенты могут быть добавлены, как требуется, конечно. Это было протестировано в .NET 2.0, так как нам нужно поддерживать некоторый унаследованный код.

Просто, кстати, это наименее верный способ отключить проверку сертификата в данном приложении, о котором я знаю:

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

Добавляя к ответам Sani и blak3r, я добавил следующее в код запуска для моего приложения, но в VB:

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

Кажется, делает трюк.

У меня была такая же проблема, поэтому я создал class, чем помощь с моими кодами. Но используйте HttpClient:

https://github.com/PicolotoLF/IgnoresSSL

Пример:

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

Совет. Вы также можете использовать этот метод для отслеживания сертификатов, срок действия которых истекает в ближайшее время. Это может спасти ваш бекон, если вы обнаружите сертификат, срок действия которого истекает, и он может быть исправлен вовремя. Хорошо также для сторонних компаний – для нас это DHL / FedEx. DHL просто позволяет истечь срок действия сертификата, который завязывает нас за 3 дня до Дня Благодарения. К счастью, я собираюсь это исправить … на этот раз!

  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; } } } 
  • Как сообщить `ссылкам` игнорировать истекший SSL-сертификат и продолжить?
  • Принять самоподписанный сертификат ssl сервера в Java-клиенте
  • javax.net.ssl.SSLHandshakeException: удаленное подключение к удаленному хосту во время рукопожатия во время веб-службы Communicaiton
  • Поддержка Android SSL - SNI
  • javax.net.ssl.SSLException: Ошибка чтения: ssl = 0x9524b800: ошибка ввода-вывода во время системного вызова, сброс соединения с помощью одноранговой сети
  • Предупреждения Firefox «Неверное подключение» при посещении уважаемых сайтов HTTPS при использовании учетной записи ребенка
  • Почему некоторые веб-сайты отображают название компании рядом с URL-адресом?
  • java - игнорировать сертификат ssl
  • Импорт пары private-key / public-certificate в Java KeyStore
  • Подписанный SSL-сертификат третьей стороны для localhost или 127.0.0.1?
  • HTTP-HTTPS-туннель
  • Interesting Posts

    Как отключить автоматическое обнаружение монитора в Windows 7?

    Получение видимого прямоугольника содержимого UIScrollView

    Почему я не получаю ошибку сегментации, когда пишу за пределами массива?

    1/252 = 0 в c #?

    Как узнать MAC-адрес моего адаптера WiFi на Ubuntu Linux?

    Как я могу получить путь приложения в консольном приложении .NET?

    Каков эффективный способ реализации одноэлементного шаблона в Java?

    Где находится сообщение «Вы ответили на это сообщение …», хранящиеся в Outlook?

    Как использовать модули npm из машинописного текста?

    Ярлыки клавиш, такие как Ctrl-C, Ctrl-V и Ctrl-Z, не работают в Word 2010 на Windows 7

    Как вы рисуете текст с помощью frameworks на MapView в Android?

    Как проверить базу данных на неустановленном устройстве Android

    Объявлять и инициализировать строковый массив в VBA

    Ошибка: не удалось создать экземпляр пользователя SQL Server

    Как отправить строку из одной активности в другую?

    Давайте будем гением компьютера.