Si tenemos un certificado digital en nuestro servidor también podemos, al igual que con las páginas web, habilitarlo para que nuestros servicios web sean utilizados a través de un canal seguro SSL.
Sin embargo, es probable que las máquinas de desarrollo no dispongan de certificado digital y que, tal y como contábamos hace algún tiempo en otro artículo, hayamos creado un certificado digital de prueba para poder hacer experimentos y comprobar que las cosas funcionan.
Como veíamos entonces, estos certificados digitales de prueba lanzaban una alerta en los navegadores de los clientes cuando intentaban acceder a nuestras páginas a través de https. Con los servicios web ocurre lo mismo. Si tratamos de acceder a un servicio web a través de https, nuestro programa cliente lanzará una excepción indicando que el certificado no puede ser comprobado a través de ninguna entidad certificadora.
Para resolver este problema podemos utilizar un pequeño truco, que consiste en crear nuestro propio comprobador de certificados digitales para utilizarlo en el cliente.
Primer paso. Creamos el cliente
En primer lugar creamos el cliente para nuestro servicio web sobre https. Si ya has creado un cliente y sólamente quieres saber cómo cónseguir que acepte un certificado digital de prueba puedes saltar directamente al segundo paso. Si por el contrario todavía no has creado el cliente puedes hacerlo de la siguiente forma:
- Creamos un nuevo proyecto. Si no tenemos ningún inconveniente, lo más sencillo es crear una aplicación de consola.
- Una vez creado, pinchamos con el botón derecho en References y seleccionamos «Add Web Reference…».
- En la siguiente pantalla tenemos que escribir la URL del fichero WSDL de nuestro servicio web funcionando sobre SSL:
https://www.miSitio.es/MiServicioWeb.asmx?wsdl - Le damos un nombre a la referencia (por ejemplo MiReferencia) y pulsamos sobre «Add Reference» para que Visual Studio genere automáticamente los stubs del cliente.
- Una vez hecho esto, ya podemos usar los métodos del servicio web como si de los métodos de una simple librería se tratase. Lo haremos de la siguiente forma:
//Primero instanciamos el servicio MiReferencia.MiServicioWeb ws = new MiReferencia.MiServicioWeb(); //Ahora ya podemos usar sus métodos Console.WriteLine(ws.MiMetodo());
Si probamos ahora el cliente veremos la excepción que comentabamos hace un momento, indicando que algo anda mal con el certificado digital.
Segundo paso. Creamos el comprobador de certificados y lo utilizamos
Primero tenemos que crear la siguiente clase:
public class MyPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint , X509Certificate certificate , WebRequest request , int certificateProblem) { //Return True to force the certificate to be accepted. return true; } }
Como vemos claramente, lo único que hace es devolver que "SÍ es correcto" a cualquier certificado digital que reciba sin hacer más comprobaciones.
A continuación debemos incluir la siguiente línea de código justo antes de instanciar el servicio web.
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
Si ahora probamos nuestro nuevo cliente vamos a comprobar que funciona perfectamente y no recibimos ninguna excepción ni mensajes de error.