2009-02-18 9 views
89

Estoy escribiendo un programa que lee el contenido de una URL proporcionada por el usuario. Mi problema está en el código que dice algo como esto:¿Cómo uso WebRequest para acceder a un sitio encriptado SSL usando https?

Uri uri = new Uri(url); 
WebRequest webRequest = WebRequest.Create(uri); 
WebResponse webResponse = webRequest.GetResponse(); 
ReadFrom(webResponse.GetResponseStream()); 

Y esto es romper si el proporcionado url es un "https: //" URL. ¿Alguien puede ayudarme a cambiar este código para que funcione con contenido cifrado SSL? Gracias.

Respuesta

150

Lo está haciendo de la manera correcta, pero los usuarios pueden estar proporcionando URL a los sitios que tienen certificados SSL no válidos instalados. Puede pasar por alto esos problemas cert si pones esta línea en antes de hacer la solicitud web actual:

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

donde AcceptAllCertifications se define como

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) 
{ 
    return true; 
} 
+1

Este fue mi problema exactamente. Lo estaba haciendo correctamente, excepto que cuando estaba probando mi código ofrecía https: // localhost que dio como resultado un error porque el certificado era para www.mycompany.com. Gracias por apuntarme en la dirección correcta. –

+36

¡Gracias por esta respuesta! Para evitar un código inútil, lo utilicé así: ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true; –

+2

Gracias, me ayudó señor. F # lo hace más fácil: '' ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true) '' –

15

Este enlace será de interés para usted: http://msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

para las conexiones HTTP, la clases WebRequest y WebResponse utilizan SSL para comunicarse con los servidores web que soportan SSL. La decisión de usar SSL la toma la clase WebRequest, basada en el URI que se le da. Si el URI comienza con "https:", se usa SSL; si el URI comienza con "http:", se utiliza una conexión no encriptada.

+0

Gran enlace. Esa es una distinción importante. – DanM7

+0

Su respuesta implica que el código en la pregunta debería funcionar? –

6

Esto se trabajó para mí:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
+1

El valor predeterminado es" Ssl2 | Tls ". Solo había activado Tls 1.1 y 1.2 en mi servidor. Esto de hecho solucionó el problema! Para LetsEncrypt con nginX en Linux, los protocolos se definen aquí: /etc/letsencrypt/options-ssl-nginx.conf – Jerther

+0

Creo que se trata de un problema diferente. No se trata de Certs no válidos, sino de versiones de TLS superiores. – wp78de

Cuestiones relacionadas