Как игнорировать проверку сертификатов при использовании протокола 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;
}
}
10 ответов:
Так как есть только один глобальный ServicePointManager установка ServicePointManager.ServerCertificateValidationCallback приведет к тому, что все последующие запросы будут наследовать эту политику. Поскольку это глобальная "настройка", было бы предпочтительно установить ее в событий Application_Start метод глобальные.асакс.
настройки вызов переопределяет поведение по умолчанию, и вы можете сами создать пользовательскую проверку обычный.
для всех, кто заинтересован в применении этого решения на основе каждого запроса, это опция и использует лямбда-выражение. То же самое лямбда-выражение может быть применено и к глобальному фильтру, упомянутому 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 лямбда-выражение может быть применено к глобальному фильтру как таковому
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Кажется, чтобы сделать трюк.
У меня была та же проблема, поэтому я создал класс, Чем помочь с моими кодами. Но используйте 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; } } }
Comments