Problemas con SSL y WCF??


Un gran problema que normalmente se presenta cuando se usa SSL para las comunicaciones es que por supuesto no se cuenta con un certificado SSL valido, claro en los exploradores uno tiene la opcion de entrar indicandole al explorador que uno asume el riesgo, pero con WCF esto no puede ser hecho, asi de facil :)

El truco esta en hacer que el metodo que inspecciona la validez del certificado sea sobrecargado o a su vez sobrepuesto por otro (override), como? Hay una par de posibilidades:

1. Crear un metodo con el delegado RemoteCertificateValidationCallback

Este delegado hace que en el evento de ServerCertificateValidationCallback se ejecute la validación que uno quiera, entonces se crea un metodo como este:

public class clsCertificatePolicy : ICertificatePolicy
{
public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
{
return true;
}

public static bool RemoteCertificateValidationCallback(object sender, X509Certificate certtificate, X509Chain chain, SslPolicyErrors errors)
{

//Aqui las validaciones, yo siempre acepto el certificado, no lo hagan en casa!!
return true;
}
}

Y claro hay que ponerlo como manejador del evento:

ServicePointManager.ServerCertificateValidationCallback =
clsCertificatePolicy.RemoteCertificateValidationCallback;

Este claro debe estar antes de la o las llamadas, les aconsejo lo agreguen en un lugar general, es decir por ejemplo cuando su aplicación inicia.

Pero hay un metodo aun mas facil:

2. Usando una expresion lambda lo podemos hacer asi:

ServicePointManager.ServerCertificateValidationCallback =
((sender, certificate, chain, sslPolicyErrors) => true);

A quien se le ocurrio las epxresiones lambda deberia ser premiado!!

Espero que les sirva…

P.D.: No fui muy explicito en algunos detalles, la clase que propongo debe estar junto al proxy cliente que se usa para la comunicacion del cliente WCF hacia el servidor, y la asignacion del manejador del evento deber ser hecha en lo posible cuando inicia el programa, antes de usar el cliente WCF, solo tiene que ser hecha una sola vez!

Cualquier duda por favor avisenme!

3 comments:

Anonymous said...

Disculpa, estoy empezando con esto de WCF y SSL, podrias poner un ejemplo mas completo, en que parte del codigo iria esta clase, etc.?

Fco Lomas said...

Perdona la demora, he agregado la parte que me pides aclaracion al fin del post, cualquier duda avisame por favor!

Kiquenet said...

Puede aportar más código y configuración .config (la sección servicemodel), así cómo pasos configuración IIS y generación de certificados (de prueba)??

Saludos y gracias.