2009-02-11 4 views
61

Ich bin derzeit mit einem System von einer Drittpartei integriert. Dieses System erfordert, dass ich eine Anfrage mit XML/HTTPS sende. Die dritte Partei mir das Zertifikat schicken und ich installierte esWebClient + HTTPS Probleme

Ich verwende den folgenden Code ein:

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

Dieser Code gibt die folgenden WebException:

Die zugrunde liegende Verbindung wurde geschlossen: Kann nicht etablieren Vertrauensstellung für den sicheren SSL/TLS-Kanal.

UPDATE Weil es ein Test-Server ist gegen arbeite ich, wird das Zertifikat nicht vertrauenswürdig und die Validierung fehlschlägt ... dies in Test/Debug-Umgebung zu umgehen, erstellen Sie ein neues ServerCertificateValidationCallback

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

und hier ist mein "fake" Rückruf

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

Lesen Sie mehr here und here

+4

+1 mit dem Code für die Aktualisierung Sie verwendet haben. Schöne schnelle Lösung für mich deswegen. –

+0

Dies war sehr nützlich, anstatt den fiddler CA root in meine dev-Maschine zu registrieren, wenn SSL webservices debuggen! Ich habe nur einen #if DEBUG um den Teil gelegt, der den Dummy-Callback hinzugefügt hat, um ihn nicht in den Produktionscode zu schreiben. – jishi

+0

Go [hier.] (Http://forums.asp.net/p/1174025/1972251.aspx) – Lonzo

Antwort

8

Für die VB.NET-Version der ursprünglichen Antwort, hier gehen Sie (Konverter funktionieren nicht gut, wenn Ereignisse mit dem "AddressOf" -Operator verbunden werden müssen). 1. Code, der eine WebClient() oder HttpWebRequest() unter Verwendung von Objekt geht vor:

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

..und die verdrahtet Codeverfahren:

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

Die kürzeste Notation des Code alle Zertifikate zu erlauben, tatsächlich:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Und funktioniert gut für diesen Fehler. Unnötig zu erwähnen, dass Sie eine Implementierung bereitstellen sollten, die das Zertifikat tatsächlich überprüft und basierend auf den Zertifikatsinformationen entscheidet, ob die Kommunikation sicher ist. Verwenden Sie zu Testzwecken die obige Codezeile.

+0

Sehr hilfreich für meine Integrationstests in der Tat! –

-1

Try this, es funktioniert:

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

Könnten Sie bitte erläutern, wie Ihre Lösung das Problem HTTP_S_ behebt? –