JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Azure Web Apps #4 - Asociando certificados SSL a tu Web App y configuración avanzada con Cloudflare

En la actualidad toda aplicación web (o sitio web) que se precie debería trabajar con conexiones seguras. Esto no solo da una mejor imagen a los visitantes, sino que ofrece ventajas de todo tipo aparte de las obvias relacionadas con la seguridad. Por ejemplo, mejorará tu posicionamiento en buscadores (Google es adalid de esto), y dependiendo de donde albergues la web, incluso mejorará su rendimiento gracias a que tus visitantes podrán usar automáticamente HTTP2.

Gracias a la existencia de Let's Encrypt y sus certificados SSL gratuitos, ya no hay disculpa. Cloudflare también te proporciona de manera automática un certificado SSL gratuito para tu dominio, así que si, como yo, utilizas este servicio, no te tienes que preocupar de esto. Aún así, si quieres tener Cloudflare con la máxima seguridad disponible te resultará útil saber cómo instalar a mano un certificado SSL en tu Azure Web App.

Existen varias opciones de tener un certificado SSL en tu dominio alojado en Azure web Apps.

Opción 1: Certificados de Microsoft

La primera y más directa es no complicarse la vida y comprarle un certificado a Microsoft desde el propio portal de Azure.

No me voy a extender porque en el enlace anterior tienes todo el proceso muy detallado por la propia Microsoft, pero a mi me parece bastante tediosa y además no es gratis. De todos modos está integrada con las Web Apps y una vez puesta en marcha te olvidas de ellas.

Opción 2: Certificados Let's Encrypt

Otra opción es configurar un certificado gratuito de Let's Encrypt.

Hubo una época en la que esto no era posible. Por suerte el programador sueco Simon J.K. Pedersen ha desarrollado unas extensiones específicas de Azure Web Apps que permiten agregar un certificado Let's Encrypt a tu sitio y renovarlo automáticamente para que te puedas olvidar de él. Además son gratuitas y Open Source.

Vete al apartado Extensions en el lateral y añade una nueva extensión:

Añadiendo extensiones

En la lista que aparece haz scroll hasta encontrar las extensiones de Pendelson (que aparecen con el nombre "SJKP", sus iniciales):

Variantes de la extensión

Como ves hay tres variantes:

  • La primera y la tercera son la misma, una si tu sitio es de 32bits (lo habitual) y la otra si es de 64bits. Repasa la configuración que hemos visto para los sitios para ver qué significa esto.
  • Las anteriores, para hacer la renovación de los certificados que instales, hacen uso de un servicio que tiene tu Azure Web App llamado Web Jobs. Si no te interesa por lo que sea, puedes utilizar esta y evitarlos, pero tendrás que renovar el certificado a mano. No te lo recomiendo. Algunas personas prefieren usar funciones serverless en lugar de Web Jobs, y llamar a la extensión mediante código propio, para hacer varias cosas a la vez desde el mismo sitio. Si este es tu caso, el bueno de Simon te explica cómo hacerlo exactamente.

una vez que aceptes los términos de servicio la tendrás instalada en tu Web App:

Extensión Azure Let's Encrypt instalada

Pero no te llega con esto, sino que tendrás que llevar a cabo toda una serie de pasos para lograr que te funcione.

Nuevamente, no te los detallo pues están muy bien explicados en el enlace anterior.

Al igual que en la opción de certificados de Microsoft, el proceso es bastante tedioso, pero en este caso es totalmente gratuito y una vez que lo tengas en marcha te puedes olvidar de él y tu Web App estará usando comunicaciones seguras sin problema.

Opción 3: Instalación manual de certificados

Azure Web Apps te permite instalar manualmente certificados digitales que adquieras en cualquier servicio de terceras empresas.

En condiciones normales no te recomendaría utilizar esta opción ya que es algo que debes gestionar manualmente. Por lo tanto, cada vez que se deba renovar el certificado tendrías que renovarlo a mano, y luego subirlo de nuevo a tu Azure Web App. Aunque solo sea una vez al año, si tienes muchas aplicaciones es un trabajo tedioso e innecesario.

Sin embargo esta es la opción que vamos a ver, ya que existe un caso en el que puede resultar muy útil, y además tiene bastantes detalles que debes tener en cuenta.

Pero antes de verla, voy a hacer un inciso para entender mejor la necesidad de poner un certificado manual...

Utilizando Cloudflare para disponer de certificados digitales SSL gratuitos

Otra de las ventajas de usar Cloudflare como proxy entre el mundo y tu aplicación es que, de manera automática y sin coste, consigues que todas las comunicaciones con tu aplicación web estén cifradas.

El motivo es que, como todo proxy, por definición, CloudFlare se sitúa entre tus usuarios/visitantes y tu sitio, interceptando las comunicaciones:

Esquema de funcionamiento de Cloudflare

Lo que ocurre es que cuando alguien se conecta a tu Web lo hace en realidad a uno de los servidores "Edge" de Cloudflare distribuidos por todo el mundo. Es este servidor a su vez el que se conecta al servidor real en el que está tu aplicación (en nuestro caso Azure) y solicita las páginas y recursos, devolviéndolos luego al usuario.

Aunque esto pueda parecer costoso, no lo es tanto y además Cloudflare hace caché de muchos de los recursos, que luego no es necesario que pida de nuevo, ahorrando en realidad mucho ancho de banda (y recursos de tu servidor: abaratas costes). Además al tener cientos de nodos de "borde" en todo el mundo, siempre se sirve la información desde el más cercano a cada uno de tus usuarios por lo que reciben la respuesta más rápido y ganas en velocidad.

Cloudflare genera automáticamente un certificado digital para ti, para poder hacer SSL. De este modo, nada más poner tu sitio en Cloudflare empiezas a disfrutar de un certificado digital de manera transparente y sin coste. Está genial.

Dentro de la configuración de Cloudflare para criptografía hay un ajuste importante que define la manera de trabajar de estos certificados:

Ajustes SSL de Cloudflare

Este ajuste controla de qué manera se comunican los servidores de Cloudflare con el tuyo, y puede tomar cuatro valores:

  • Off: no se usará SSL en tu sitio ni se intentará la comunicación segura con tu servidor.
  • SSL Flexible: es para casos en los que no puedes o no quieres instalar un certificado SSL en tu servidor. Los nodos de Cloudflare servirán HTTPS a tus usuarios pero las peticiones a tu servidor de origen las harán mediante HTTP, quedando expuesta a ataques de Man In The Middle (en teoría) la conexión entre CloudFlare y tu servidor (el lado derecho del esquema anterior).
  • SSL Completo: en este caso la conexión entre los nodos de Cloudflare y tu servidor se realiza mediante SSL. Para ello debes tener obligatoriamente un certificado SSL instalado en tu servidor o no podrían establecerse comunicaciones. En este modo no se comprueba la validez del certificado en origen, por lo que te valdría cualquier certificado, incluso uno caducado o uno que no sea para tu dominio, ya que solo se usa para cifrar las comunicaciones, pero no para identificar al servidor.
  • SSL Completo (estricto): es como el anterior pero se comprueba la validez del certificado, por lo que debe ser uno válido, asociado a tu dominio, y no caducado.

Lo ideal sería que usases el modo "SSL Completo", estricto a ser posible.

En el caso de Azure Web Apps, la buena noticia es que el modo SSL Completo lo puedes usar desde el primer instante sin tener que hacer nada en tu Web App. Esto es así porque Microsoft, con cada Web App genera un certificado digital para poder hacer conexiones seguras a tu servidor usando el dominio por defecto que le asignes. Por ejemplo, en mi caso para https://jasoft.azurewebsites.net.

Por lo tanto, cuando Cloudflare en el modo "SSL Completo" intente conectarse mediante HTTPS al servidor de Azure Web Apps, recibirá un certificado digital no válido para mi dominio (solo es válido para el dominio por defecto), pero hará caso omiso de esto y lo utilizará igual. No es perfecto pero lo suficientemente bueno para la mayor parte de los casos, y no tendremos que hacer nada.

El problema viene cuando queremos usar el modo "SSL Completo (estricto)", ya que entonces necesitaremos un certificado digital válido en el servidor de Azure. Podemos recurrir a alguna de las opciones automáticas que vimos hace un momento, o podemos hacer algo mejor, como vamos a ver ahora.

Obteniendo un certificado de origen en Cloudflare

Para este tipo de casos, Cloudflare ofrece una opción estupenda denominada "Certificados de origen". Se trata de certificados digitales que genera para que puedas instalar en tu servidor de origen. Son certificados normales pero que solamente se dan como válidos por Cloudflare. Es decir, si intentas acceder usando un navegador normal (y saltándote a Cloudflare) el navegador te dirá que no son válidos, pero si estás usando Cloudflare como proxy (que será lo normal si los estás empleando), entonces cuando un servidor "Edge" de este servicio se conecte a tu servidor lo podrá utilizar sin problema, lo validará y tendrás todas las comunicaciones cifradas y validadas en todos los puntos existentes entre tus usuarios y el servidor que alberga tu aplicación (el esquema anterior completo).

Están en el apartado "Crypto" de Cloudflare, hacia la mitad:

Botón de añadir Certificados de origen en Cloudflare

Al pulsar el botón de generar un certificado, en el primer paso te pide que escojas la forma de generar una clave privada para el certificado y un CSR (petición de firma de certificado), la lista de dominios y subdominios para los que quieres crear el certificado, y la duración de la validez del mismo.

Lo habitual es que escojas ECDSA, que es un conjunto de algoritmos más moderno que RSA, y que la validez sea la más larga, o sea, 15 años. Así en 15 años no tendrás que preocuparte de cambiar el certificado en Azure :-)

En el siguiente paso se genera el certificado y te da la opción de descargar tanto éste como la clave privada. Se trata de unas cadenas de texto con muchas letras y números que representan esta información codificada de diferentes maneras (ahora más sobre esto). Deberás copiar ese texto desde la pantalla que te sale y pegarlas en sendos archivos de texto en tu disco duro. Ambas son muy importantes, así que no las pierdas:

Resultado de generar el certificado

Convertir el certificado para que pueda ser utilizado en Azure

Portar este certificado a Azure no es directo. El motivo es que los formatos en los que puedes obtener el crtificado en Clodflare y que se muestran en la captura anterior, no son directamente utilizables en Azure Web Apps.

Lo que tienes que hacer es copiar al portapapeles el formato PKCS#7 de la lista. Creas un archivo de texto en tu disco duro, lo abres con el bloc de notas y lo pegas dentro. Ahora le cambias la extensión y le pones .cer o .p7b (el que más rabia te de).

Para poder usarlo en Azure debemos transformarlo al formato PFX/PKCS#12. La forma de hacerlo es usando OpenSSL, el producto más universalmente conocido y utilizado para gestionar criptografía de clave pública. Deberíamos instalarlo en nuestro equipo y existen versiones para Windows también.

No obstante no vamos a hacerlo.

Por suerte existen productos online que nos permiten usar OpenSSL desde el navegador directamente, sin tener que instalarlo. Y para una sola vez...

Uno bastante bueno es SSL Converter, de SSL Shopper:

Conversor online de certificados

Al elegir la conversión de PKCS#7 a PFX/PKCS#12, como ves te solicita que le des las dos cosas que descargaste en el paso anterior (el certificado PKCS#7 y la clave privada) además de la clave con la que quieres proteger el certificado que se va a generar (¡anótala y guárdala a buen recaudo o el certificado no te servirá para nada!).

Nota: lo de enviar la clave privada a un servicio online es algo que no deberíamos hacer nunca con un certificado real salvo que nos fiemos mucho del proveedor del servicio. En este caso tampoco presenta mayor problema porque es un certificado especial, solo válido para Cloudflare y para el caso que estamos estudiando: habilitar el SSL estricto en este servicio, y no tiene mayor importancia. De todos modos si prefieres hacerlo a mano en tu equipo también te ofrece debajo (no se ve en la imagen) los comandos que deberías usar con OpenSSL si quieres hacerlo por tu cuenta.

Bien, una vez hecha la conversión a PFX/PKCS#12 ya podemos llevar el certificado a nuestra Azure web App.

Instalar el certificado de origen en nuestra Azure Web App

Para instalar el flamante certificado que acabamos de generar vamos al apartado SSL Certificates de nuestra Web App y elegimos la opción Upload Certificate:

Sección SSL Certificates

Al hacerlo nos aparece este diálogo:

Selector del certificado

en el que elegiremos el certificado e introduciremos su clave para importarlo.

Tras hacerlo, el certificado aparecerá en la lista de certificados disponibles en nuestro plan de servicio de Azure. Pero todavía nos queda asociar el certificado a nuestros dominios, para lo cual tenemos una sección "Bindings" justo debajo. Es solo darle al + y elegir un dominio desde una lista desplegable y el certificado desde otra, y ¡listo!:

El certificado instalado y asociado a los dominios

Forzar el uso de SSL

Una vez que tenemos un certificado instalado es interesante obligar a que todo el tráfico vaya a través de conexiones seguras, redirigiendo automáticamente todos los intentos de conexión por HTTP a HTTPS.

Por suerte esto es extremadamente fácil de conseguir tanto en Cloudflare como en Azure.

Si estamos usando Cloudflare no hace falta que hagamos nada en Azure. Basta con ir a la sección Crypto de Cloudflare nuevamente y activar esta opción allí:

Forzar SSL en Cloudflare

Si no usamos Cloudflare y en Azure hemos instalado un certificado con alguno de los métodos que hemos visto, entonces en Azure tenemos una opción idéntica bajo el apartado "Custom Domains" que ya conocemos:

Forazar SSL en Azure

Si la ponemos a On y hemos configurado bien nuestro certificado, todas las comunicaciones irán siempre cifradas.

En resumen

Con esto hemos visto las diferentes opciones que tenemos en Azure Web Apps para gestionar certificados digitales para comunicaciones seguras, y hemos visto detalladamente cómo instalar un certificado de origen de Cloudflare en Azure, convirtiéndolo antes, para poder habilitar el modo más estricto y seguro de comunicación entre los usuarios y nuestro servidor pasando por este servicio.

En breve seguiremos viendo más cosas interesantes sobre cómo configurar y utilizar una Web App.

José Manuel Alarcón José Manuel Alarcón
Fundador de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Descarga GRATIS mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Agregar comentario