2009-02-11 7 views
61

Je suis actuellement en train d'intégrer un système créé par un tiers. Ce système m'oblige à envoyer une requête en utilisant XML/HTTPS. La 3ème partie me faire parvenir le certificat et je l'ai installéWebClient + Problèmes HTTPS

J'utilise le code suivant:

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

Ce code renvoie les éléments suivants WebException:

La connexion sous-jacente a été fermée: Impossible d'établir relation de confiance pour le canal sécurisé SSL/TLS.

MISE À JOUR Parce qu'il est un serveur de test je travaille contre, le certificat est pas digne de confiance et validation échoue ... Pour contourner ce dans le test/environnement de débogage, créez un nouveau ServerCertificateValidationCallback

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

et voici mon rappel "faux"

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

En savoir plus here et here

+4

+1 pour la mise à jour avec le code utilisé. Belle solution rapide pour moi à cause de ça. –

+0

Cela a été très utile au lieu d'enregistrer la racine CA du fiddler dans mon dev-machine lors du débogage des services web SSL! Je viens de mettre un # DEBUG autour de la partie qui a ajouté le rappel factice pour ne pas le mettre en code de production. – jishi

+0

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

Répondre

8

Pour la version VB.NET de la réponse originale, c'est parti (les convertisseurs ne fonctionnent pas bien quand il faut câbler des événements avec l'opérateur 'AddressOf'). 1er code qui va avant d'utiliser un WebClient() ou HttpWebRequest() objet:

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

..et le code de méthode câblé:

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 plus courte notation du code pour permettre à tous les certificats est en fait:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Et fonctionne bien pour cette erreur. Inutile de dire que vous devez fournir une implémentation qui vérifie réellement le certificat et décide en fonction des informations de certificat si la communication est sûre. À des fins de test, utilisez la ligne de code ci-dessus.

+0

Très utile pour mes tests d'intégration en effet! –

-1

Essayez ceci, cela fonctionne:

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

Pourriez-vous expliquer comment votre solution corrige le problème HTTP_S_? –