BLOG | NGINX

Rotación de certificados SSL/TLS sin reinicios en NGINX de código abierto

NGINX - Parte de F5 - horizontal, negro, tipo RGB
Miniatura de Maxim Ivanitskiy
Maxim Ivanitskiy
Publicado el 26 de septiembre de 2023

En el mundo de los servidores web de alto rendimiento, NGINX es una opción popular porque su arquitectura liviana y eficiente le permite manejar grandes cargas de tráfico. Con la introducción de la función de diccionario compartido como parte del módulo JavaScript de NGINX (njs) , las capacidades de rendimiento de NGINX alcanzan el siguiente nivel.

En esta publicación de blog, exploramos la funcionalidad y los beneficios del diccionario compartido njs, y mostramos cómo configurar NGINX Open Source sin la necesidad de reiniciar al rotar certificados SSL/TLS.

Conceptos básicos y beneficios del diccionario compartido

La nueva directiva js_shared_dict_zone permite a los usuarios de NGINX Open Source habilitar zonas de memoria compartida para un intercambio de datos eficiente entre procesos de trabajo. Estas zonas de memoria compartida actúan como diccionarios clave-valor que almacenan configuraciones dinámicas a las que se puede acceder y modificar en tiempo real.

Los principales beneficios del diccionario compartido incluyen:

  • Mínima sobrecarga y fácil de usar: integrado directamente en njs, es fácil de aprovisionar y utilizar con una API intuitiva y una implementación sencilla. También le ayuda a simplificar el proceso de gestión y compartición de datos entre procesos de trabajo.
  • Ligero y eficiente: se integra perfectamente con NGINX, aprovechando su modelo de E/S sin bloqueo y basado en eventos. Este enfoque reduce el uso de memoria y mejora la concurrencia, lo que permite a NGINX gestionar muchas conexiones simultáneas de manera eficiente.
  • Escalabilidad: aprovecha la capacidad de NGINX de escalar horizontalmente en múltiples procesos de trabajo para que pueda compartir y sincronizar datos entre esos procesos sin necesidad de mecanismos complejos de comunicación entre procesos. La configuración de tiempo de vida (TTL) le permite administrar registros en entradas de diccionario compartidas eliminándolos de la zona debido a la inactividad. El parámetro desalojador elimina el par clave-valor más antiguo para dejar espacio para nuevas entradas.

Rotación de SSL con el diccionario compartido

Uno de los casos de uso más impactantes del diccionario compartido es la rotación SSL/TLS. Al usar js_shared_dict_zone , no es necesario reiniciar NGINX en caso de una actualización de clave o certificado SSL/TLS. Además, te ofrece una API tipo REST para administrar certificados en NGINX.

A continuación se muestra un ejemplo del archivo de configuración NGINX que configura el servidor HTTPS con las directivas js_set y ssl_certificate . Los controladores de JavaScript utilizan js_set para leer el certificado o la clave SSL/TLS de un archivo.

Este fragmento de configuración utiliza el diccionario compartido para almacenar certificados y claves en la memoria compartida como caché. Si la clave no está presente, lee el certificado o la clave del disco y lo coloca en la memoria caché.

También puedes exponer una ubicación que borre el caché. Una vez que se actualizan los archivos en el disco (por ejemplo, se renuevan los certificados y las claves), el diccionario compartido impone la lectura desde el disco. Este ajuste permite rotar certificados/claves sin la necesidad de reiniciar el proceso NGINX.

http { ... js_shared_dict_zone zona=kv:1m;
servidor { … # Establece una función njs para la variable. Devuelve un valor de certificado/clave js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# usa los datos de la variable ssl_certificate datos:$dynamic_ssl_cert; ssl_certificate_key datos:$dynamic_ssl_key;
# una ubicación para borrar el caché location = /clear { js_content main.clear_cache; # permitir 127.0.0.1; # denegar todo; }
... }

Y aquí está la implementación de JavaScript para la rotación de certificados y claves SSL/TLS usando js_shared_dict_zone :

función js_cert(r) { si (r.variables['ssl_server_name']) { devolver read_cert_or_key(r, '.cert.pem'); } de lo contrario { devolver ''; } } función js_key(r) { si (r.variables['ssl_server_name']) { devolver read_cert_or_key(r, '.key.pem'); } de lo contrario { devolver ''; } } /** * Recupera el valor de la clave/certificado de la memoria compartida o se vuelve al disco */ función read_cert_or_key(r, fileExtension) { dejar datos = ''; dejar ruta = ''; const zona = 'kv'; dejar nombreCert = r.variables.ssl_server_name; dejar prefijo = '/etc/nginx/certs/'; ruta = prefijo + nombreCert + fileExtension; r.log('Resolviendo${path} '); clave constante = ['certs', ruta].join(':'); caché constante = zona && ngx.shared && ngx.shared[zona];
si (caché) { datos = cache.get(clave) || ''; si (datos) { r.log(`Leer${key} de caché`); devolver datos; } } try { datos = fs.readFileSync(ruta, 'utf8'); r.log('Leer desde caché'); } catch (e) { datos = ''; r.log(`Error al leer desde el archivo:${path} . Error=${e} `); } if (cache && data) { try { cache.set(key, data); r.log('Persistente en caché'); } catch (e) { const errMsg = `Error al escribir en la zona de diccionario compartido:${zone} . Error=${e} `; r.log(errMsg); } } devolver datos }

Al enviar la solicitud /clear , se invalida el caché y NGINX carga el certificado o la clave SSL/TLS desde el disco en el próximo protocolo de enlace SSL/TLS. Además, puedes implementar un js_content que tome un certificado o clave SSL/TLS de la solicitud mientras persiste y actualiza el caché también.

El código completo de este ejemplo se puede encontrar en el repositorio de GitHub de njs .

Empieza hoy

La función de diccionario compartido es una herramienta poderosa para la programabilidad de su aplicación que aporta ventajas significativas en optimización y escalabilidad. Al aprovechar las capacidades de js_shared_dict_zone , puede desbloquear nuevas oportunidades de crecimiento y gestionar de manera eficiente las crecientes demandas de tráfico.

¿Está listo para potenciar su implementación de NGINX con js_shared_dict_zone ? Puede actualizar su implementación de NGINX con js_shared_dict_zone para desbloquear nuevos casos de uso y obtener más información sobre esta función en nuestra documentación . Además, puede ver un ejemplo completo de una función de diccionario compartido en el proyecto njs-acme recientemente presentado, que permite que el entorno de ejecución del módulo njs funcione con proveedores ACME.

Si está interesado en comenzar a utilizar NGINX Open Source y tiene preguntas, únase a NGINX Community Slack : ¡preséntese y conozca esta comunidad de usuarios de NGINX!


"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.