c# https webclient

c# - Problemas de WebClient+HTTPS



(3)

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''). Primer código que va antes de usar un objeto WebClient () o HttpWebRequest ():

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

Actualmente me estoy integrando con un sistema creado por un tercero. Este sistema requiere que envíe una solicitud usando XML / HTTPS. El tercero me envió el certificado y lo instalé

Yo uso 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 una relación de confianza para el canal seguro SSL / TLS.

ACTUALIZACIÓN Debido a que es un servidor de prueba contra el que estoy trabajando, el certificado no es confiable y la validación falla ... Para omitir esto en el 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 "falsa"

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

Lea más aquí y aquí


La notación más corta del código para permitir todos los certificados es en realidad:

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.


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