Я пытаюсь найти способ игнорировать проверку сертификата при запросе ресурса 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;
}
}
c#
ssl
httpwebrequest
certificate
Joe.wang
источник
источник
Ответы:
Поскольку существует только один глобальный ServicePointManager , установка ServicePointManager.ServerCertificateValidationCallback приведет к тому, что все последующие запросы будут наследовать эту политику. Поскольку это глобальная «настройка», было бы предпочтительнее установить ее в методе Application_Start в Global.asax .
Установка обратного вызова переопределяет поведение по умолчанию, и вы можете сами создать собственную процедуру проверки.
источник
HttpWebRequest
. Если вы используете какие-либо другие средства, вам нужно будет посмотреть в документации, как это сделать.Для всех, кто заинтересован в применении этого решения для каждого запроса, это вариант, использующий лямбда-выражение. То же лямбда-выражение можно применить и к глобальному фильтру, упомянутому blak3r. Похоже, для этого метода требуется .NET 4.5.
В .NET 4.0 лямбда-выражение может применяться к глобальному фильтру как таковому.
источник
true
- это то, что вы можете сделать, экспериментируя во время разработки, но это небезопасно. Это должно быть условно.(HttpWebRequest)WebRequest.Create(url)
вполне допустимо, но в моем случаеHttpWebRequest.Create(url)
все еще существует в проекте, ориентированном на .Net 4.6.2. Выбор шеф-повара, но на данный моментHttpClient
это, вероятно, лучший API для использования.Это сработало для меня:
Фрагмент отсюда: http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
источник
Также есть решение для короткого делегата:
источник
true
небезопасно.Было упомянуто, что до .NET 4.5 свойство в запросе на доступ к нему
ServicePointManager
было недоступно.Вот код .NET 4.0, который предоставит вам доступ для
ServicePoint
каждого запроса. Он не дает вам доступа к обратному вызову для каждого запроса, но должен позволить вам узнать более подробную информацию о проблеме. Просто откройтеscvPoint.Certificate
(или,ClientCertificate
если хотите) свойства.источник
ignore
им, а не доверять им.ServicePoint
я не могу всегда доверять всем SSL-сертификатам, а также игнорировать все сертификаты , потому что неServerCertificateValidationCallback
делегировал в ServicePointКстати, это наименее подробный способ отключить всю проверку сертификатов в данном приложении, о котором я знаю:
источник
Вместо того, чтобы добавлять обратный вызов в ServicePointManager, который переопределит проверку сертификата глобально, вы можете установить обратный вызов для локального экземпляра HttpClient. Этот подход должен влиять только на вызовы, сделанные с использованием этого экземпляра HttpClient.
Вот пример кода, показывающий, как игнорирование ошибок проверки сертификатов для конкретных серверов может быть реализовано в контроллере веб-API.
источник
Основываясь на ответе Адама и комментарии Роба, я использовал это:
который несколько фильтрует "игнорирование". Конечно, при необходимости могут быть добавлены другие эмитенты. Это было протестировано в .NET 2.0, поскольку нам необходимо поддерживать некоторый устаревший код.
источник
CA5386: инструменты анализа уязвимостей сообщат вам об этих кодах.
Правильный код:
источник
Для ядра .net
источник
Выражено прямо ...
источник
Добавляя к ответам Sani и blak3r, я добавил следующее в код запуска для своего приложения, но в VB:
Кажется, добился цели.
источник
Совет: вы также можете использовать этот метод для отслеживания сертификатов, срок действия которых скоро истечет. Это может спасти ваш бекон, если вы обнаружите сертификат, срок действия которого истекает, и сможете вовремя его исправить. Хорошо также и для сторонних компаний - для нас это DHL / FedEx. DHL просто допустила истечение срока действия сертификата, который нас облажает за 3 дня до Дня Благодарения. К счастью, я могу исправить это ... на этот раз!
источник
ProwlUtil.StepReached
?Несколько ответов выше работают. Мне нужен был подход, при котором мне не приходилось постоянно вносить изменения в код и который не делал мой код небезопасным. Поэтому я создал белый список. Белый список можно вести в любом хранилище данных. Я использовал файл конфигурации, так как это очень маленький список.
Мой код ниже.
источник
Unity C # Версия этого решения:
источник