2014-01-24 2 views
9

Я делаю веб-запрос в приложении winforms. Я обеспечиваю проверку пользовательских сертификатов, так как:Почему мой ServicePointManager.ServerCertificateValidationCallback игнорируется?

ServicePointManager.ServerCertificateValidationCallback += 
     new RemoteCertificateValidationCallback(certValidator.ValidateRemoteCertificate); 

где certValidator.ValidateRemoteCertificate является

public bool ValidateRemoteCertificate(object sender, X509Certificate certificate, 
             X509Chain chain, SslPolicyErrors policyErrors) 
{ 
     return false; 
} 

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

Моя проблема заключается в том, что этот обратный вызов полностью игнорируется. Я отправляю запрос https и работает как шарм. Наблюдая за этим в отладчике, я вижу, что ValidateRemoteCertificate никогда не вызывается.

Почему мой обратный вызов замены никогда не возвращался?

EDIT: LB попросил WebRequest, так вот она:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sourceUrl); 
request.UseDefaultCredentials = true; 
request.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))";  

request.KeepAlive = false; 
request.Headers.Add("Accept-Language", "en-us,en;q=1.0"); 
request.Method = "GET"; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

EDIT 2: Это, вероятно, связаны между собой, но в файле .config Поручаю его использовать настроенный прокси-сервер следующим образом:

<system.net> 
    <defaultProxy useDefaultCredentials="true"/> 
</system.net> 

EDIT 3: Ниже приведен полный, минимальный пример, демонстрирующий поведение. Я ожидаю, что в этом примере выйдет исключение, потому что все сертификаты должны быть отклонены, но все работает отлично.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Text; 

namespace SPMCertCallbackDemonstrator 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ServicePointManager.ServerCertificateValidationCallback = delegate { return false;}; 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com"); 
      request.Method = "GET"; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     } 
    } 
} 

Почему мой обратный вызов замены никогда не перезвонил?

+0

'Я отправляю запрос https и работает как шарм. 'Где код для этого? –

+0

Отредактировано для включения кода запроса https. – Eric

+0

В какой момент вы фактически регистрируете обратный вызов валидации? При запуске приложения или ...? –

ответ

4

Не было ничего плохого в исходном коде, который я опубликовал. Я запрашивал http вместо https. Таким образом, проверка сертификата не требовалась. Как только я вызвал запрос https, он работал нормально.

Смежные вопросы