2009-02-11 11 views
61

Attualmente sto effettuando l'integrazione con un sistema creato da una terza parte. Questo sistema richiede l'invio di una richiesta tramite XML/HTTPS. Il 3 ° partito mi inviare il certificato e ho installatoProblemi WebClient + HTTPS

Io uso il seguente codice:

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

Questo codice restituisce il seguente WebException:

La connessione sottostante chiusa: Impossibile stabilire relazione di fiducia per il canale sicuro SSL/TLS.

UPDATE Perché è un server di prova sto lavorando contro, il certificato non è attendibile e la convalida non riesce ... Per bypassare questo ambiente di test/debug, creare un nuovo ServerCertificateValidationCallback

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

e qui è la mia "falso" callback

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

Continua here e here

+4

+1 per l'aggiornamento con il codice è stato utilizzato. Bella soluzione rapida per me a causa di questo. –

+0

Questo è stato molto utile invece di registrare la radice CA del violinista nella mia dev-machine durante il debug dei servizi web SSL! Ho appena inserito un #if DEBUG sulla parte che ha aggiunto il dummy callback per non inserirlo nel codice di produzione. – jishi

+0

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

risposta

8

Per la versione VB.NET della risposta originale, ecco qui (i convertitori non funzionano bene quando è necessario collegare eventi con l'operatore 'AddressOf'). 1 ° codice che va prima di usare un WebClient() o HttpWebRequest() oggetto:

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

..e il codice del metodo cablato:

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

La più breve notazione del codice per consentire a tutti i certificati è effettivamente:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

E funziona bene per questo errore. Inutile dire che dovresti fornire un'implementazione che controlli effettivamente il certificato e decida in base alle informazioni del certificato se la comunicazione è sicura. Per scopi di test, utilizzare la riga di codice sopra.

+0

Molto utile per i miei test di integrazione! –

-1

Prova questa, funziona:

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

Potrebbe spiegare come la soluzione risolve il problema HTTP_S_? –