Error al realizar conexiones SSL, TLS y HTTPS en Mono


Mono, la implementación libre de .NET Framwork, no permite por defecto realizar conexiones que requieran el uso de SSL o TLS. Esto impide, por ejemplo, comunicarse con direcciones https vía código; lanzando una excepción como esta:

Security.Protocol.Tls.TlsException: Invalid certificate received form server.

Este comportamiento no es un bug, es un sistema de seguridad.

Las conexiones seguras, para que realmente lo sean para los usuarios, necesitan que el cliente pueda verificar la legitimidad del servidor remoto. Para ello existen entidades que expiden certificados para asegurar que el interlocutores quien dice ser.

Mensaje de Firefox indicando una conexion segura

Los navegadores web suelen incluir los certificados de varias entidades de confianza. Sin embargo, Mono no lo hace. Prefiere que cada usuario decida en quien quiere confiar.

Para resolver este problema existen dos soluciones sencillas y seguras:

Importar los certificados de Firefox

Este método tiene la ventaja de instalar los certificados de todas las entidades de confianza mas habituales sin tener que buscar la concreta necesaria:

mozroots --import --ask-remove

Importar un certificado concreto

Si no tenemos Firefox, el que necesitamos no viene incluido o solo queremos uno concreto; existe la posibilidad de importar un fichero de certificado:

Como ejemplo, vamos a instalar un certificado de GoDaddy.

  1. Descargamos el archivo gd-class2-root.crt desde https://certs.godaddy.com/anonymous/repository.seam a una carpeta de nuestro ordenador (p. ej.: /home/usuario)
  2. Ejecutamos el siguiente comando en nuestra terminal
certmgr -add -c Trust /home/usuario/gd-class2-root.crt

Una vez completado alguno de los dos métodos podremos escribir código en Mono que se comunique vía SSL o TLS.

Para mas información, se puede consultar http://www.mono-project.com/FAQ:_Security

Anuncios