SSL gratis para un custom domain
Una vez finaliza el desarrollo de un sitio web, para publicarlo y utilizar un custom domain, el sitio necesita un certificado digital que permita acceder a él por el protocolo seguro HTTPS y evite que el usuario reciba el típico mensaje de que su conexión podría ser insegura, y que pueda provocar que desista de entrar al sitio.
Además de evitar este mensaje, proveedores de identidades OAuth2 utilizados por los servicios de autenticación como los de Microsoft Identity Platform, requieren que el sitio web utilice el protocolo HTTPS.
Para lograr tener una conexión segura, y poder introducir un proveedor de identidades OAuth2, es necesario agregar un certificado digital al sitio web, que, aunque los hay de distintos tipos, no suelen ser económicos sobre todo si se precisa un certificado wildcard (*.example.com).
Otro de los problemas que nos encontramos, es cuando ese certificado expira, y por un descuido o por una falta de planificación no se ha generado uno nuevo, este escenario, a pesar de haber tenido un certificado válido, la conexión al sitio pasa a ser insegura mostrando el navegador un mensaje que plantea a los usuarios la recomendación de no continuar.
Para estos escenarios, nace una Autoridad Certificadora (CA) sin ánimo de lucro, llamada Let's Encrypt, que una vez confirmada la propiedad de un sitio, mediante un proceso definido en su documentación, permite crear certificados digitales para securizar un website. Pero no todo va a ser fácil y bonito, estos certificados expiran en plazos de 90 días por lo que hay que preocuparse de estar renovándolos de forma continua.
Aunque existen diversas web's que te ayudan en este proceso, sigue siendo una operación muy manual en la que, mediante las claves privadas, debes generar el propio certificado y a pesar de que te advierten cuando queda poco tiempo para que expire el certificado, es un lío estar pendiente de renovarlos continuamente. Let's Encrypt tiene soluciones como CertBot para facilitar estas tareas de creación y renovado automático, pero que hoy por hoy, no son compatibles con una Azure Web App o una Function App.
En este artículo vamos a realizar la creación / renovación de certificados de forma automática mediante la asociación del certificado en un Key Vault.
Let's go
El primer requisito necesario para poder automatizar la generación y asignación de certificados digitales a los sitios web, es definir una zona DNS.
En una Web App o una Function App encontramos que su url es la combinación del nombre que hemos introducido a la app y *.azurewebsites.net.
Este subdominio está certificado por Azure pero tiene un pequeño inconveniente, y es que la url es muy larga de escribir, y sobre todo que no llevan nuestra marca. En el blade de Custom domains, podemos ver las DNS asociadas a nuestro sitio web, agregar nuevas e incluso comprar algún dominio.
Nota: Para poder utilizar Custom Domains y SSL en una web app, ésta debe estar utilizando un Service Plan superior o igual a B1.
Dado que vamos a trabajar en disponer de un certificado SSL y que este se autorenueve de forma periódica, es recomendable limitar el acceso a nuestro sitio a únicamente tráfico HTTPS.
También, agregamos un Custom Domain, para ello debemos ser propietarios de ese dominio y previamente hemos tenido que generar un apunte CNAME o A para que supere la validación y pueda agregarlo.
Una vez añadido el nuevo dominio, si navegamos hacia la web nos encontramos con que el sitio web tiene un error de certificado.
A continuación, podemos desplegar esta plantilla ARM construida por Tatsuro Shibamura, que nos permite seleccionar la entidad certificadora y desplegará una Azure Function y un Key Vault.
Tras completarse el despliegue, en el grupo de recursos tendremos los siguientes recursos nuevos con el prefijo que hemos establecido a la hora de desplegar la ARM:
- Application Insights
- Key Vault
- Service Plan
- Function App
- Storage Account
Crear registro de aplicación
Accedemos a la Function App en el Portal de Azure, y en el blade de Authentication / Authorization activamos la autenticación para el App Service y desactivamos el login anónimo, indicando que debe autenticar con el Azure AD.
Después configuramos el proveedor Azure Active Directory, con una configuración Express, indicamos el nombre de la app, aceptamos, y antes de salir del blade, guardamos la configuración.
Asignación de permisos sobre las políticas de acceso
Ahora necesitamos configurar los permisos que debe tener este registro de aplicación que se ha generado, para que pueda crear el certificado y asignárselo a la Web App.
En primer lugar, debemos dar permisos sobre las políticas de acceso del Key Vault, para ello, en el propio Key Vault, en el blade de Access policies, agregamos una nueva política, seleccionando la plantilla Certificate Management y asignando el registro de aplicación que hemos creado en el paso anterior.
Antes de salir del Key Vault, copiamos la url del mismo y la guardamos para utilizarla más adelante.
Configuración de acceso
En el grupo de recursos, en el blade de configuración del RBAC, Access control (IAM), agregamos un nuevo rol de "DNS Zone Contributor" al registro de aplicación.
Repetimos nuevamente el paso anterior, pero esta vez asignamos el rol de "DNS Zone Contributor" al App Service.
Creación de un nuevo certificado
Tras completar los pasos anteriores, volvemos nuevamente a la Azure Function y confirmamos que tiene configurada la url del Key Vault como setting en el blade de Configuration.
Accedemos a la url de la Azure Function, en mi caso https://acmebotdemossl-grw7.azurewebsites.net/add-certificate, y tras autenticar, nos aparece un formulario web en el que podemos seleccionar la Zona DNS y agregar un nuevo subdominio.
Al enviar el formulario, en un lapso de menos de un minuto se habrá generado un certificado digital.
El siguiente paso, es ir a la Web App, y asociar el certificado del Key Vault, para ello, accedemos al blade de TLS/SSL Settings de la Web App, y en la pestaña de Private Key Certificates (.pfx), realizamos la importación desde un Key Vault.
Al terminar la importación, el certificado estará enlazado a la Web App.
Para finalizar, necesitamos ir al blade Custom domains, y asociar enlazar el certificado.
Conclusiones
Esta implementación, a priori sencilla, tiene la posibilidad de utilizar una configuración para conectar la Azure Function a un webhook de Teams o de Slack, en el que se notifique las acciones que se van sucediendo, para que así se pueda hacer un seguimiento por si algo no hubiera ido bien.
Este proceso, aunque parece un poco enrevesado, una vez está instalado en nuestra suscripción, puede gestionar varios certificados digitales al mismo tiempo, y se simplificará muchísimo el seguimiento y sobre todo, los costes económicos que supone la compra y renovación de certificados.