web-dev-qa-db-fra.com

Problèmes WebClient + HTTPS

J'intègre actuellement un système créé par un tiers. Ce système nécessite que j'envoie une demande en utilisant XML/HTTPS. Le tiers m'envoie le certificat et je l'ai installé

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 le WebException suivant:

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

[~ # ~] mise à jour [~ # ~] Parce que c'est un serveur de test sur lequel je travaille, le certificat n'est pas approuvé et la validation échoue .. Pour contourner cela dans un environnement de test/débogage, créez un nouveau ServerCertificateValidationCallback

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

et voici mon "faux" rappel

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

En savoir plus ici et ici

62
rudigrobler

La notation la plus courte du code pour autoriser 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 du certificat si la communication est sûre. À des fins de test, utilisez la ligne de code ci-dessus.

70
Koen Zomers

Pour la version VB.NET de la réponse d'origine, c'est parti (les convertisseurs ne fonctionnent pas bien lorsqu'ils doivent câbler des événements avec l'opérateur 'AddressOf'). 1er code qui précède l'utilisation d'un objet WebClient () ou HttpWebRequest ():

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

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

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
8
atconway