Peticiones web con SSL desde C#

Cryptographically secure pseudorandom number g...

Una de las acciones que pueden resultar más comunes es hacer una petición de cualquier tipo a una web, ya sea por un servicio web o para obtener directamente el volcado de una página. Para ello se emplean las clases WebRequest y WebResponse

Lo interesante es que ambas clases poseen soporte para SSL de manera nativa, así que si, por ejemplo quisieramos hacer una petición al servidor http://www.servicio.com, podríamos formar nuestra petición de esta manera:

string url = "https://www.servicio.com/";
/*Nótese la s al final de http*/
WebRequest request = WebRequest.Create(url);
WebResponse ws = request.GetResponse();

Una vez se reciba la respuesta, podremos tratar el resultado de la manera más específica para nuestro problema. El hecho de que especifiquemos que queremos usar una conexión HTTPS hace que automáticamente se pase a ejecutar usando encriptación SSL.

El problema puede surgir cuando accedamos a un servicio que tenga un certificado no válido (por ejemplo, estemos usando un servidor de pruebas con un certificado autogenerado). Si ejecutamos este proceso para un servidor de estas características obtendremos una excepción parecida a esta:

El certificado remoto no es válido según el procedimiento de validación.

Esto ocurre al no encontrar una entidad de confianza que valide la información de nuestro servidor, aunque podemos evitar dicho error declarándolo explícitamente antes de la petición.

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


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

Al ejecutar el código, veremos como ya no tenemos dicho problema.