Thursday, April 20, 2006

Consumiendo WebServices usando HTTPS(SSL)

Este post es para compartir con ustedes esta experiencia que tuve al estar realizando pruebas sobre un WebService que estamos desarrollando.

Cuando se utilizan WebServices algo primordial es la seguridad, estoy debido a que los mensajes SOAP son transmitidos en texto plano por la red, asi que cualquiera con un sniffer pudiera interceptar el mensaje SOAP y leerlo. Claro que esto pudiera suceder tambien con informacion transmitida en modo binario pero requiere un poco mas de habilidades de "Hacker".

Asi que una solucion a esto es utilzar HTTPS (SSL) en lugar de HTTP, de esta manera la información viaja encriptada. Para lograr esto es necesario conseguir e instalar un certificado en el WebServer. En ambiente de produccion lo mas seguro es que se requiera comprar un certificado de alguna autoridad como Verisign. Si solo deseamos hacer nuestros primeros pininos con HTTPS, SSL y certificados o nuetro proyecto aun se encuentra en desarrrollo pudieramos crear nuestro propio certificado usando la herramienta MakeCert.exe la cual se encuentra incluida en el SDK de .NET

Despues de todo este desmoder se agrega el certificado a algun website en el IIS, y se establece un puerto el cual va a ser utilizado por HTTPS.
Al navegar hacia un sitio HTTPS, normalmente se recibe un cuadro de dialogo donde se te pregunta si confias en el certificado proveido por el webserver al que estas contactando. Asi que la responsabilidad de aceptar dicho certificado es responsabilidad del usuario.

Ahora, si desearamos invocar un WebService que se encuentre en un webserver que utilice SSL y HTTPS habria un problema. Si hacemos la llamada desde codigo no va a haber ningun cuadro de dialogo que nos pregunte si vamos a confiar o no en el certificado.
Asi que normalmente obtendriamos una excepcion del tipo System.Net.WebException ( no se puede establecer una conexion segura con el servidor remoto).

Ahora les voy a presentar la solucion a este pekeño problemilla. La manera de resolver esto es creando nuestra propia clase de políticas la cual implementaria la interface ICertificatePolicy. Lo uniko que tenemos ke hacer es implementar el metodo CheckValidationResult la cual regresa un valor de tipo booleano, asi como si estuvieramos presionando el boton de "Si, confio en el certificado"

Con fines de muestra, la clase siguiente solo regresa un true de manera que acepta tooooodos los certificados

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy{ public TrustAllCertificatePolicy() {}public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) { return true; }}

Si keremos hacer mas segura se pueden agregar algunas otras validaciones usando el parametro del certificadoX509.

Ah, por cierto. hay que usar esta linea de codigo:

System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();

Solo una vez durante el ciclo de vida de la aplicacion para indicar el uso de nuestra clase.


(Articulo traducido del blog de Jan Tielen)
Thank You Jan for such a useful and interesting post.

3 Comments:

At 1:37 AM, Blogger Miguel Madero said...

Jaime, recuerda el atributo de Obsolete y la sugerencia a usar el Delegate o EventHandler en lugar de la clase....

 
At 8:17 PM, Anonymous Anonymous said...

soy novato en esto, como lo implementas??, esa clase va en el servicio o como se usa??

YK

 
At 7:01 PM, Anonymous Anonymous said...

donde van estas lineas, te lo agradeceria bastante, estoy atorada en esto, y se necesitan algunos espacios de nombres??

Graciass

 

Post a Comment

<< Home