2009-02-11 17 views
61

Actualmente me estoy integrando con un sistema creado por un tercero. Este sistema requiere que envíe una solicitud usando XML/HTTPS. La tercera parte me envía el certificado y lo instalóWebClient + HTTPS Issues

utilizo el siguiente código:

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

Este código devuelve la siguiente WebException:

la conexión subyacente se cerró: No se pudo establecer relación de confianza para el canal seguro SSL/TLS.

ACTUALIZACIÓN Debido a que es un servidor de prueba estoy trabajando en contra, el certificado no es de confianza y validación falla ... Para evitar esto en entorno de prueba/depuración, cree un nuevo ServerCertificateValidationCallback

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

y aquí está mi devolución de llamada "falso"

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

Leer más here y here

+4

+1 para la actualización con el código que utilizó. Buena solución rápida para mí por eso. –

+0

¡Esto fue muy útil en vez de registrar la raíz de Fiddler CA en mi dev-machine al depurar los servicios web SSL! Acabo de poner #if DEBUG alrededor de la parte que agregó la devolución de llamada ficticia para no ponerlo en el código de producción. – jishi

+0

Ir [aquí.] (Http://forums.asp.net/p/1174025/1972251.aspx) – Lonzo

Respuesta

8

Para la versión VB.NET de la respuesta original, aquí va (los convertidores no funcionan bien cuando necesitan cablear eventos con el operador 'AddressOf'). Primero código que va antes de utilizar un cliente Web() o HttpWebRequest() del objeto:

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

..y el código del método cableado:

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 notación más corta del código para permitir que todos los certificados es de hecho:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

Y funciona bien para este error. Huelga decir que debe proporcionar una implementación que realmente verifique el certificado y decida en base a la información del certificado si la comunicación es segura. Para propósitos de prueba, use la línea de código anterior.

+0

¡Muy útil para mis pruebas de integración! –

-1

probar esto, funciona:

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

¿Podría explicarnos cómo su solución corrige el problema HTTP_S_? –