Instalando un certificado SSL/TLS de Let's Encrypt en un servidor Windows [#12]

El uso de HTTPS (TLS sobre HTTP) es obligatorio en estos días para cualquier tipo de sitio web. A pesar de que los certificados son más accesibles hoy en día que una década atrás y las herramientas hacen que la gestión de estos sea mucho más fácil, aun encuentro algunos sitios web usando una conexión no segura. Cuando he tenido la oportunidad de preguntar acerca de los motivos por los cuales un sitio no usaba HTTPS la respuesta ha sido a la falta de información, ya sea por la idea de altos costos que requiere la compra de un certificado o el tiempo requerido para su configuración.

Este articulo te mostrara como emitir un certificado gratuito y como instalarlo en un Servidor Windows que usa IIS. En este caso vamos a usar un emisor de certificados (CA, por sus siglas en inglés) llamado Let's Encrypt, este emisor emite certificados gratuitos pero los mismos tienen algunas limitaciones. Antes de seguir los pasos de emisión del certificado e instalación te recomiendo revisar las limitaciones que explico a continuación y que tipo de certificado requieres para tu sitio web, ya que en algunos casos puede que necesites un tipo de certificado más "avanzado".

Términos y lenguaje relacionado a los certificados

Antes de revisar los pasos para generar e instalar el certificado hay ciertos términos y acrónimos que debemos tener claros para poder entender el resto.

  • CA: Es la entidad emisora de los certificados (Certification Authority, por sus siglas en inglés). Para poder habilitar HTTPS en un sitio web requerimos de un certificado, este certificado es emitido por una entidad la cual llamamos Certification Authority. Algunos CA's conocidos de certificados pagados son Commodo SSL Store y Digicert. Por otro lado, en los certificados gratuitos tenemos a Let's Encrypt.

  • CSR: Petición de firmado de certificado (Certificate Signing Request).

  • ACME: (Automatic Certificate Management Environment por sus siglas en inglés). ACME es un protocolo que provee un estandar para la automatización de tareas relacionadas a la administración de un certificado. En el pasado estas solían tomar algunas horas a un web master. El protocolo brinda un API (HTTP requests y JSON) para solicitar acciones de administración de certificados.

  • HTTPS: (Hypertext Transfer Protocol Secure, por sus siglas en inglés).

  • SSL Certificate: (Secure Socket Layer certificate, por sus siglas en inglés).

  • TSL: (Transport Secure Layer, por sus siglas en ingles).

  • pfx: Es un formato de archivo propietario de Windows que combina las llave privada y pública de un certificado. Este archivo es requerido por IIS para habilitar HTTPS en un sitio web.

¿Como es que grandes empresas de tecnología han promovido la adopción de SSL?

  • Hace ya un buen tiempo los navegadores como Chrome empezaron a alertar a los usuarios cuando una pagina no se encontraba usando HTTPS, incialmente fue requerido para sitios web donde se exponia informacion del usuario como paginas que requerian autenticacion o ecommerce. Actualmente es requerido para toda pagina web, en caso de que el sitio no cuente con HTTPS la conexion sera marcada como no segura.

    Google Chrome flags websites missing HTTPS as not secure
  • Los sitios web que no proveen una conexión HTTPS son impactados negativamente en SEO. Google publico hace unos años un artículo donde mencionaban que iban a considerar las conexiones seguras para el factor de ranking de su algoritmo.

    HTTPS impact in SEO
  • Algunos APIs como geolocalización y el clipboard solo funcionan en producción si es que el sitio web cuenta con un certificado TLS.

¿Como puedes obtener un certificado SSL/TLS?

Si es que tu sitio web se encuentra alojado por un proveedor como GoDaddy o HostGator tu plan probablemente incluya un certificado SSL, como un primer paso te recomiendo verificar eso. En el caso de que te encuentres tu sitio web en un servidor on-premise (una instalación propia) o en un servicio como AWS EC2 donde tienes control total de tu servidor cuentas con dos opciones, la primera es comprar un certificado de algún CA, y la segunda es generar uno usando un proveedor como Let's Encrypt.

Let's Encrypt es una organización que emite certificados gratuitamente, sin embargo, hay algunas limitaciones. Let's Encrypt solo realiza validaciones de dominio (DV, por sus siglas en ingles), donde solo se verifica que quien realice el certificado tenga control sobre el dominio. Las opciones pagadas ofrecen otras opciones mas "avanzadas" como la validación de organización (OV) y la validación extendida (EV) donde se verifica la identidad real de quien realiza el pedido.

¿Como generar un certificado para tu sitio web?

Para generar un certificado TLS vamos a requerir un cliente ACME. Let's Encrypt recomienda usar Certbot, el cual es una excelente opción para sistemas Linux. También es posible instalarlo en sistemas Windows pero puede que tengas realizar algunos pasos adicionales si estas usando IIS. La razón es que IIS requiere un archivo de formato pfx para habilitar HTTPS en un sitio web. Certbot no genera este archivo ya que es de uso exclusivo de Windows, por ende, si decides usar Certbot vas a tener algunos pasos adicionales para generar el archivo pfx ya sea manualmente o de manera automatizada.

Este articulo está enfocado en sistemas Windows, a continuación, vamos a ver los pasos requeridos usando un cliente Windows open-source. Hay varias opciones, puedes probar con algunos de la lista publicada en la web de Let's Encrypt aquí. En este caso voy a usar un cliente que nos brinda una interfaz de usuario ya que nos brindara mas detalles en caso de que cometamos algún error durante la emisión o la renovación del certificado en el futuro.

En este caso voy a usar un cliente que nos brinda una interfaz de usuario ya que nos brindara mas detalles en caso de que cometamos algun error durante la emision o la renovacion del certificado en el futuro.

  • Download a Windows ACME client to the server that is hosting the web site. In this case we will use Certify The Web, you can download it from it's website: https://certifytheweb.com/

  • Once it is installed. Open the application and click on "New Certificate". The application will ask you to choose a Certification Authority and input an email address which will be used to contact you for reminders related to the certificate status. Fill in the fields, check the terms and conditions box and click on "Register Contact"

  • If you have applications running on IIS, Certify the Web will show a dropdown with the list of apps. You can select the app from the dropdown or input the domain manually. In this case I will select the only website I have running in this EC2 instance.

  • There are some other configurations you can set, we will use the defautls.

    The Authorization section will allow you to select between two options to validate your domain. Let's Encrypt provides HTTP validation and DNS validation, in this case we will use HTTP validation. This validation method will create a file in the following location /.well-known/acme-challenge and will be accessed during the process using port 80 and the followin URL http:///.well-known/acme-challenge/

    The Deployment section allows you to deploy the certificate to other environment such as Azure App Service. We are not changing nothing here since our website is runnig on this server.

    The Tasks section allows you to execute a previous or post deployment script. We will not add anything here in this case.

  • The Preview section will show us a summary of all the configuration from the previous steps.

  • Now we are ready to start the process. Click on "Request Certificate", the process may take a few seconds. When it is

  • Now, if you go back to the "Managed Certificates" tab, you should see the status of of the certificate as "Certificate Active".

    We can also verify the certificate has been properly setup using chrome.