jueves, 3 de noviembre de 2011

Llamando a un web service sobre https (ssl) desde sharepoint 2010

He estado trabajando en un proyecto donde teniamos que integrar una aplicación externa, esta integración la hacemos mediante servicios webs. Estos servicios webs contienen datos privados por lo que están securizados mediante certificados (el mensaje) y además la información viaja por un medio seguro, es decir, ssl.

Bueno hasta aquí nada nuevo, hice mis pruebas con un proyecto de test, colocando los certificados en los diferentes repositiorios, dependiendo de su función: Trusted Root Certification Authorities, Intermediate Certification Authorities, etc. y todo funcionaba a las mil maravillas.

Pero esta llamada al servicio web ha de ser hecha desde un entorno SharePoint 2010, pensé que esto no sería ningún problema pues en el otro tipo de proyecto me funcionaba correctamente, pero no fue así, de pronto observé que la llamada al servicio web me estaba devolviendo la siguiente excepción:

Type: System.Net.WebException
Message: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
InnerException: The remote certificate is invalid according to the validation procedure.

Esta excepción me extraño mucho, pues si yo accedía mediante el browser a la url del web service me decía que el certificado estaba correctamente instalado.

Entonces empecé a googlear un poco y leía gente que decía de crear un bypass, mediante la creación de tu propia clase CertificatePolicy que implemente la interfaz ICertificatePolicy, y en el método CheckValidationResult devolver true siempre para que se salte la validación.

public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy()
{}

public bool CheckValidationResult(ServicePoint sp,
X509Certificate cert,WebRequest req, int problem)
{
return true;
}
}


La llamada a esta clase se tendría que hacer justo antes de la llamada a tu servicio web.


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

He visto en muchos foros y blogs que esto lo daban como la solución correcta, pero ojo, aquí estamos aceptando cualquier cosa que nos esté enviando el servidor sin validar el certificado!!


Por lo tanto seguí buscando y el problema reside en la forma que tiene sharepoint de obtener los certificados raíz, que parece ser que usa su propio repositorio de certificados en vez de usar el de la propia máquina. Por lo que tendremos que añadir estos certificados raíz de confianza en el repositorio de sharepoint. Para hacerlo seguiremos los siguientes pasos:



  1. Ir a la administración central

  2. Ir a security

  3. Manage trust

  4. Aquí es donde instalaremos los certificados raíz que nos interese, pulsando new, buscando el certificado y poniéndole un nombre.


Esta información la obtuve del siguiente blog:


http://blog.mattsampson.net/index.php/calling-a-webservice-over-ssl-in-sharepoint-ssl?blog=1