Guía de Let's Encrypt para Ignition
Este documento describe un ejemplo de integración de Ignition con Let's Encrypt.


Guía de Let's Encrypt para Ignition


Cómo las capacidades introducidas en Ignition 8.0.3 podrían usarse para integrarse con el servicio Let's Encrypt para automatizar la administración de certificados SSL

 

 11 minutos de lectura 

Tabla de contenidos

1. Introducción
2. Antecedentes
3. Enfoque
4. Cliente ACME
5. Creación del Almacén de Claves

6. Copia del Almacén de Claves
7. Recarga en Caliente del Almacén de Claves
8. Renovación Automatizada
9. Conclusión

 

Una guía práctica de Joel Specht, Ingeniero de Software, Inductive Automation

Introducción

Ignition 8.0.3 introduce soporte para recargar en caliente el almacén de claves SSL de Gateway. Esta capacidad permite que Ignition funcione bien con servicios como Let’s Encrypt, que permiten la gestión automática de certificados SSL. Este documento describe un ejemplo de integración de Ignition con Let's Encrypt.

Antecedentes

Antes de continuar, es importante tener un conocimiento básico de los certificados SSL, el marco ACME y el servicio Let's Encrypt.

Para realizar transacciones confidenciales en la web de forma segura, confiamos en Transport Layer Security (TLS), que reemplaza a Secure Sockets Layer (SSL). TLS permite comunicaciones seguras a través de una red insegura como Internet. Los certificados SSL se utilizan como parte de TLS para que un servidor web (como Ignition's Gateway) se identifique ante un cliente web (como su navegador web) y proporcione una clave para comunicaciones cifradas. De forma predeterminada, su navegador web no confiará en ningún certificado SSL presentado por un servidor web. Su navegador web mantiene una lista de certificados raíz emitidos por terceros llamados Autoridades de certificación (CA). Su navegador confía en estas CA y es responsabilidad de estas CA verificar que una organización controle un dominio.

Cuando una organización desea que los clientes web confíen en su servidor web en su dominio, emiten una Solicitud de firma de certificado (CSR) y la envían a una CA. Es como una persona que solicita una licencia de conducir. La CA puede realizar verificaciones de antecedentes para verificar que la organización sea legítima y realmente controle el dominio asociado con su CSR. Si todo sale bien, la CA emite el certificado SSL que vincula a la organización con su dominio, al igual que una agencia gubernamental que emite a una persona una licencia de conducir válida que certifica la identidad de la persona y su derecho a utilizar las carreteras.

Una vez que este certificado SSL firmado por una CA se instala en el servidor web de la organización, se presenta a cualquier cliente web que se conecte a él. Dado que los clientes web confían en la CA y la CA firmó el certificado SSL presentado por el servidor web, el cliente web puede confiar en el servidor web y procederá a realizar transacciones de forma segura con él.

ACME es un acrónimo: Entorno de gestión automática de certificados. ACME se detalla en RFC 8555. A alto nivel: ACME es un marco automatizado para obtener y renovar certificados SSL para su dominio para que pueda habilitar SSL / TLS en su servidor web. Este marco simplifica enormemente el ciclo de vida del certificado SSL tradicional, que es engorroso y varía de una CA a otra.

Let's Encrypt es "una autoridad de certificación (CA) gratuita, automatizada y abierta que se ejecuta en beneficio del público". Let's Encrypt logra esto ejecutando un servidor ACME. Cualquier administrador de dominio que desee obtener certificados SSL gratuitos en los que confíen casi todas las plataformas puede colocar un cliente ACME que apunte al servidor ACME de Let's Encrypt.

Enfoque

A partir de Ignition 8.0.3, la puerta de enlace obtiene la clave privada SSL y los certificados del archivo de almacén de claves PKCS12 ubicado en $ IGNITION / webserver / ssl.pfx. Mientras se ejecuta la puerta de enlace, es posible reemplazar este archivo de almacén de claves por uno que contenga nuevos certificados. De forma predeterminada, la puerta de enlace verificará el archivo cada 15 minutos y aplicará los cambios que puedan ocurrir, o puede usar el siguiente comando GCU para volver a cargar el almacén de claves desde el disco al instante (asumiendo un entorno Linux):

Teniendo esto en cuenta, para automatizar el proceso de renovación del certificado, tenemos el siguiente enfoque para automatizar el proceso de renovación del certificado SSL para Ignition:


1. Utilice un cliente ACME para obtener un certificado SSL de Let's Encrypt
2. Utilice un conjunto de herramientas para convertir los certificados y claves en un almacén de claves PKCS12
3. Copie el nuevo archivo de almacén de claves en $ IGNITION / webserver / ssl.pfx
4. Invoque el comando de recarga del almacén de claves de la GCU para aplicar el nuevo almacén de claves desde el disco


El enfoque general anterior se puede programar y programar utilizando cualquier conjunto de herramientas que prefiera.

Cliente ACME

Elegí usar Certbot como mi cliente ACME. Si elige hacer lo mismo, consulte la documentación de Certbot para obtener información sobre cómo instalar el software en su host. Los ejemplos siguientes aprovechan la versión 0.31.0 de certbot en Ubuntu 18.04.2 LTS.

Para que el servidor ACME de Let's Encrypt emita un nuevo certificado, debemos poder demostrar control sobre nuestro nombre de dominio. El servidor ACME puede realizar un desafío DNS o un desafío HTTP. En cada tipo de desafío, el servidor ACME genera un token aleatorio. El cliente ACME toma este token y lo firma para demostrar la posesión de la clave privada asociada con la clave pública del certificado SSL. En el caso del desafío de DNS, el token firmado se coloca como un registro TXT de DNS. En el caso del desafío HTTP, el token firmado se expone como un recurso en un servidor HTTP (puerto 80) accesible desde una IP pública apuntada por su nombre de dominio.

En mi caso:

1. Deseo realizar un desafío HTTP
2. Ignition está vinculado al puerto 80
3. No deseo detener Ignition al renovar el certificado SSL

Ignition tiene soporte directo para exponer el desafío HTTP de ACME. Simplemente cree un archivo con el valor del token como nombre del archivo y el token firmado como contenido del archivo en $ IGNITION / .well-known / acme-challenge / <token>. La puerta de enlace devolverá el contenido del archivo cuando se acceda desde el recurso HTTP /.well-known/acme-challenge/ <token>, que es exactamente lo que el servidor ACME necesita para verificar su control sobre el dominio.

Para lograr lo anterior, ejecuté el siguiente comando certbot:

Siga las instrucciones en pantalla para ingresar su dirección de correo electrónico, acepte los términos e ingrese su dominio. Cuando Certbot le pregunte por la ruta a su webroot, ingrese la ruta a su $ IGNITION (directorio raíz donde está instalado el Gateway). Certbot creará automáticamente el archivo de token en $ IGNITION / .well-known / acme-challenge / <token> y eliminará el archivo una vez que el servidor ACME lo verifique o se produzca una falla.

Si desea utilizar un desafío de DNS en su lugar, hay muchos complementos disponibles para certbot. Por ejemplo, hay un complemento que le permite escribir el desafío usando los servicios de AWS Route 53 si usa AWS Route 53 como su servidor DNS.

Si Ignition no se está ejecutando en el puerto 80 y no tiene ningún otro servicio ejecutándose en el puerto 80, puede usar la opción --standalone de Certbot en lugar de --webroot. Esto hará que certbot levante su propio servidor HTTP vinculado al puerto 80 durante la duración del desafío HTTP.

De forma predeterminada, Certbot apunta a los servicios Let's Encrypt de producción en vivo. Es posible que desee jugar con la marca --test-cert mientras aprende / experimenta. Esta bandera señalará a certbot a los servicios de preparación de Let’s Encrypt, que son más indulgentes con respecto a los límites de recursos. Sin embargo, deberá confiar temporalmente en el certificado de CA raíz de prueba falso mientras realiza las pruebas con certificados de prueba. Consulte el sitio web de Let's Encrypt para obtener más detalles.

Hay muchas otras formas de realizar el desafío ACME que no se mencionan aquí. La mejor opción depende de la arquitectura de su red, los requisitos y las preferencias personales.

Creación del Almacén de Claves

En este punto, se asume que ha obtenido un certificado SSL firmado por una CA. Si usó Certbot en Ubuntu Linux como lo hice yo, la ubicación predeterminada para la cadena de certificados y la clave privada es la siguiente:

Cadena de certificados: / etc / letsencrypt / live / <su nombre de dominio> /fullchain.pem
Clave privada: / etc / letsencrypt / live / <su nombre de dominio> /privkey.pem

Nota: si bien las anteriores son las ubicaciones predeterminadas para estos artefactos, pueden anularse mediante argumentos de línea de comandos o un archivo de configuración. Consulte la documentación de Certbot para obtener más detalles.

Hagamos referencia a la cadena de certificados en este documento como $ CERT_CHAIN y la clave privada como $ PRIV_KEY.

También necesitará el certificado de CA raíz para crear un almacén de claves SSL válido para Ignition, ya que la cadena de certificados Let's Encrypt solo contiene el certificado de servidor y el certificado de CA intermediario. En el momento de redactar este documento, Let's Encrypt utiliza DST Root CA X3 como certificado de CA raíz. Copie su contenido en un archivo .pem en una ubicación conocida en su servidor y hagamos referencia a él como $ ROOT_CA_CERT en este documento.

A continuación, crearemos el paquete de certificados completo desde el certificado de servidor hasta el certificado de CA intermediario y el certificado de CA raíz. Para hacer esto, ejecuté lo siguiente:

$ CERT_BUNDLE es la ubicación del archivo .pem del paquete de certificados que deseamos crear mediante la concatenación del certificado de CA raíz al final de la cadena de certificados Let's Encrypt.

Finalmente, podemos construir el almacén de claves PKCS12 usando OpenSSL:

$ TEMP_KEYSTORE es la ruta a un archivo de almacén de claves temporal donde OpenSSL escribirá el nuevo almacén de claves.

$ PRIV_KEY y $ CERT_BUNDLE se mencionan arriba.

$ KEYSTORE_PWD es la contraseña que protegerá el almacén de claves y la clave privada. De forma predeterminada, Ignition utiliza el valor "ignition". Nota: generalmente no se recomienda pasar contraseñas de texto sin formato a un argumento de línea de comandos. Consulte la documentación de OpenSSL para conocer otras opciones, como utilizar una variable de entorno o un archivo que contenga la contraseña.

$ KEYSTORE_ALIAS es el nombre descriptivo de la entrada del almacén de claves. De forma predeterminada, Ignition utiliza el valor "ignition".

Copia del Almacén de Claves

En este punto, ahora debería tener el archivo del almacén de claves PKCS12 con la cadena de certificados y la clave privada intactas ubicado en $ TEMP_KEYSTORE.

A continuación, si tiene un almacén de claves SSL existente utilizado por la puerta de enlace, realice una copia de seguridad del mismo:

Ahora copie el nuevo almacén de claves en Ignition:

Finalmente, limpie los archivos temporales:

Recarga en Caliente del Almacén de Claves

En este punto, su nuevo certificado SSL se instala en un nuevo almacén de claves ubicado en $ IGNITION / webserver / ssl.pfx. Ahora es el momento de que Ignition comience a usar el nuevo almacén de claves:

Si ahora visita su Gateway usando https, debería ver el nuevo certificado y un candado o una barra verde que indica que el navegador confía en el Gateway.

Renovación Automatizada

Los certificados SSL tienen un período de validez al igual que una licencia de conducir. Una vez que caduca un certificado SSL, un navegador web ya no confiará en el certificado ni en el servidor web que lo presenta. Por lo tanto, los administradores deben renovar el certificado SSL de su servidor web antes de que caduque. Los certificados Let's Encrypt, en particular, caducan en unos 90 días desde el momento en que se emiten.

Certbot se puede ejecutar de forma no interactiva utilizando el argumento de línea de comandos -n. Muchos de los valores ingresados en el indicador interactivo pueden pasarse mediante el argumento de la línea de comandos para la automatización. Aquí hay un ejemplo:

En el comando anterior, $ IGNITION es el directorio de instalación raíz de la puerta de enlace. $ DOMAIN es su nombre de dominio (como example.com). $ DEPLOY_SCRIPT es la ruta a un script que se puede ejecutar una vez que se genera el nuevo certificado SSL.

Luego puede crear un script bash en $ DEPLOY_SCRIPT que hace lo siguiente:

$ DEPLOY_SCRIPT

1

#! /bin/bash
2 
3#cree un paquete de cadena de certificados desde el certificado del servidor hasta el certificado raíz ca:
4cat $CERT_CHAIN $ROOT_CA_CERT > $CERT_BUNDLE
5# cree el almacén de claves PKCS12:
6openssl pkcs12 -export -out $TEMP_KEYSTORE -inkey $PRIV_KEY -in $CERT_BUNDLE -passout pass:$KEYSTORE_PWD -name $KEYSTORE_ALIAS
7# hacer una copia de seguridad del almacén de claves SSL existente si existe:
8[[ -f $IGNITION/webserver/ssl.pfx ]] && cp $IGNITION/webserver/ssl.pfx $IGNITION/webserver/ssl.pfx.bk
9# copie el nuevo almacén de claves SSL:
10cp $TEMP_KEYSTORE $IGNITION/webserver/ssl.pfx
11# limpiar archivos temporales:
12rm $CERT_BUNDLE $TEMP_KEYSTORE
13# recargue en caliente el nuevo almacén de claves en la puerta de enlace en ejecución:
14$IGNITION/gwcmd.sh --reloadks

 

Finalmente, aquí hay un trabajo cron de muestra que ejecuta el comando Certbot con el gancho de implementación todos los días a las 5:13 p.m .:

 

13 5 * * * certbot certonly --webroot --webroot-path $IGNITION --domains $DOMAIN --agree-tos --deploy-hook $DEPLOY_SCRIPT >> $RENEW_LOG

 

$ RENEW_LOG es la ubicación de un archivo de registro donde se escribirá la salida del trabajo cron.

Consulte la documentación de Certbot o consulte certbot --help all para obtener todos los detalles de los argumentos de la línea de comandos de certbot.

Conclusión

Mi esperanza es que este documento les dé a los usuarios una idea de cómo pueden automatizar la administración de sus certificados SSL usando Let's Encrypt y las nuevas funciones de Ignition 8.0.3. El enfoque anterior no es la única forma de integrar Ignition con Let's Encrypt y, ciertamente, puede que no sea la "mejor" forma de lograrlo, pero debería ilustrar el proceso que debe seguir cualquier solución para lograr nuestro objetivo.

 

Publicado en español el 20 de Octubre del 2021.

Originalmente publicado el 22 de Octubre del 2019.

Fuente original: https://inductiveautomation.com/resources/article/lets-encrypt-guide-for-ignition 

Compartir

Últimas publicaciones del blog

Your Dynamic Snippet will be displayed here... This message is displayed because you did not provided both a filter and a template to use.

Resuelva los problemas de cortes estáticos en conductos altos con la serie 1831
Elimine los problemas comunes de las aplicaciones de corte de alta estática en conductos con la serie 1831.