2009-02-11 4 views
61

В настоящее время я интегрируюсь с системой, созданной сторонней стороной. Эта система требует от меня отправки запроса с использованием XML/HTTPS. Третья сторона посылает мне сертификат и я установил егоПроблемы с WebClient + HTTPS

Я использую следующий код:

using (WebClient client = new WebClient()) 
{ 
    client.Headers.Add(HttpRequestHeader.ContentType, "text/xml"); 

    System.Text.ASCIIEncoding encoding=new System.Text.ASCIIEncoding(); 
    var response = client.UploadData(address, "POST", encoding.GetBytes(msg)); 
} 

Этот код возвращает следующие WebException:

Базовое соединение закрыто: не удалось установить доверия для защищенного канала SSL/TLS.

UPDATE Поскольку это тестовый сервер, я работаю с, сертификат не является доверенным и проверка не пройдена ... Для того, чтобы обойти это в тест/отладки окружающей среды, создать новый ServerCertificateValidationCallback

ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(bypassAllCertificateStuff); 

и вот мой «подделка» обратный вызов

private static bool bypassAllCertificateStuff(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error) 
{ 
    return true; 
} 

подробнее here и here

+4

+1 для обновления с кодом, который вы использовали. Из-за этого приятно быстро исправить ситуацию. –

+0

Это было очень полезно, а не регистрировать корень CA-скрипта в моей dev-машине при отладке веб-сервисов SSL! Я просто положил #if DEBUG вокруг части, которая добавила ответный фиктивный код, чтобы не помещать его в производственный код. – jishi

+0

Go [здесь.] (Http://forums.asp.net/p/1174025/1972251.aspx) – Lonzo

ответ

8

Для версии исходного ответа VB.NET здесь вы идете (преобразователи не работают хорошо, когда необходимо подключать события с помощью оператора AddressOf). Первый код, который идет перед использованием WebClient() или HttpWebRequest() объекта:

ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf bypassAllCertificateStuff) 

..И проводной вверх код метода:

Private Shared Function bypassAllCertificateStuff(ByVal sender As Object, ByVal cert As X509Certificate, ByVal chain As X509Chain, ByVal [error] As System.Net.Security.SslPolicyErrors) As Boolean 
    Return True 
End Function 
68

Кратчайший обозначение кода, чтобы позволить все сертификаты является фактически:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

И хорошо работает для этой ошибки. Излишне говорить, что вы должны предоставить реализацию, которая фактически проверяет сертификат и решает на основе информации сертификата, если сообщение безопасно. Для целей тестирования используйте приведенную выше строку кода.

+0

Очень полезно для моих тестов интеграции! –

-1

Попробуйте, это работает:

class Ejemplo 
{ 
    static void Main(string[] args) 
    { 
     string _response = null; 
     string _auth = "Basic"; 
     Uri _uri = new Uri(@"http://api.olr.com/Service.svc"); 

     string addres = @"http://api.olr.com/Service.svc"; 
     string proxy = @"http://xx.xx.xx.xx:xxxx"; 
     string user = @"platinum"; 
     string pass = @"01CFE4BF-11BA"; 


     NetworkCredential net = new NetworkCredential(user, pass); 
     CredentialCache _cc = new CredentialCache(); 

     WebCustom page = new WebCustom(addres, proxy); 
     page.connectProxy(); 

     _cc.Add(_uri, _auth, net); 

     page.myWebClient.Credentials = _cc; 

     Console.WriteLine(page.copyWeb()); 
    } 

} 

public class WebCustom 
{ 
     private string proxy; 
     private string url; 
     public WebClient myWebClient; 
     public WebProxy proxyObj; 
     public string webPageData; 


     public WebCustom(string _url, string _proxy) 
     { 
      url = _url; 
      proxy = _proxy; 
      myWebClient = new WebClient(); 
     } 

     public void connectProxy() 
     { 
      proxyObj = new WebProxy(proxy, true); 
      proxyObj.Credentials = CredentialCache.DefaultCredentials; 
      myWebClient.Proxy = proxyObj; 
     } 

     public string copyWeb() 
     { return webPageData = myWebClient.DownloadString(url); } 
} 
+2

Не могли бы вы объяснить, как ваше решение устраняет проблему HTTP_S_? –