Tema representativo de entrevista

Entrevista de Backend: ¿Cómo rotarías certificados mTLS sin causar una interrupción del servicio?

BackendDifícil
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Varios servicios utilizan mTLS. Los certificados están por expirar o se debe rotar la CA raíz. Diseña una rotación de certificados y del paquete de confianza que no pierda solicitudes, incluyendo validación, reversión y observabilidad.

Enunciado y alcance

Esta pregunta de backend evalúa el ciclo de vida de los certificados y los límites de comunicación entre servicios. El punto no es copiar un nuevo certificado a cada máquina; la emisión, las actualizaciones de confianza, el reemplazo de conexiones y la reversión necesitan una superposición temporal.

Qué evalúa el entrevistador

  • Si distingues entre la migración de un certificado hoja (leaf), un paquete de confianza (trust bundle) y una CA raíz.
  • Si manejas conexiones de larga duración, cachés, desincronización de reloj (clock skew), actualizaciones concurrentes y fallas parciales de nodos.
  • Si utilizas identidades de carga de trabajo de corta duración en lugar de colocar claves privadas en imágenes o variables de entorno.
  • Si puedes definir un canary, verificaciones de aceptación, reversión y alertas de expiración.

Preguntas de clarificación para hacer

Confirma el descubrimiento de servicios, conexiones cortas versus largas, el emisor, la confianza entre clústeres o dominios cruzados, cómo cargan las claves los clientes, las duraciones máximas de solicitudes y conexiones, y si dos raíces o certificados pueden coexistir. Aclara si el objetivo es un certificado hoja, una CA intermedia o todo el dominio de confianza.

Un marco de respuesta de 30 segundos

Dividiría la rotación en tres partes: primero la confianza, segundo los certificados y por último el reemplazo gradual de conexiones. Primero haría que cada verificador acepte las raíces antigua y nueva, y luego emitiría certificados hoja de corta duración sobre la nueva cadena. Los clientes y proxies cargan atómicamente el nuevo par de claves y retienen el material antiguo hasta que las conexiones se drenen. Durante el canary observaría fallas de handshake, vida útil del certificado, versión del paquete de confianza y reintentos; ante una anomalía detendría la emisión y restauraría la ruta anterior, nunca deshabilitaría la verificación de certificados como método de reversión.

Solución paso a paso

1. Establecer dominios de identidad y confianza

Asigna a cada carga de trabajo un SPIFFE ID estable o una identidad equivalente, separando producción, staging y distintos dominios de confianza. Los verificadores mantienen un paquete de confianza, mientras que el emisor firma solo después de una atestación autorizada de la carga de trabajo. La carga de trabajo genera su clave privada y limita el acceso; el plano de control no debe distribuir claves privadas de larga duración a través de la configuración de la aplicación.

2. Publicar primero un paquete de confianza compatible

Para una migración de CA raíz o intermedia, publica un paquete de confianza con raíz dual y confirma que los verificadores hayan cargado su nueva versión. No elimines la raíz antigua de inmediato porque los certificados antiguos y las conexiones de larga duración todavía existen. Rastrea la versión del paquete, el éxito de carga y las instancias obsoletas antes de iniciar la emisión de nuevos certificados.

3. Emitir y cargar el nuevo certificado

Una carga de trabajo obtiene una identidad X.509 de corta duración a través de la Workload API, un sidecar o una interfaz dinámica equivalente. Renueva dentro de una ventana temprana y reemplaza la clave y el certificado de forma atómica: los lectores ven el par antiguo o el par nuevo, nunca una mezcla. En caso de falla, retén el último material válido y reintenta; no extiendas indefinidamente un certificado expirado.

4. Manejar los límites de conexión y solicitud

Los nuevos certificados normalmente afectan a las nuevas sesiones TLS, mientras que las conexiones de larga duración pueden conservar el certificado antiguo. Establece una antigüedad máxima de conexión para HTTP/2, gRPC o grupos de conexiones a bases de datos y drena gradualmente las conexiones antiguas después de que los nuevos handshakes tengan éxito. Los reintentos deben respetar la idempotencia, los tiempos de espera y el backoff para que la rotación no se amplifique en una tormenta de reintentos.

5. Diseñar canary, reversión y eliminación de raíz

Valida primero un grupo de cargas de trabajo y una ruta de tráfico, luego expande por región o servicio. La reversión detiene la nueva emisión y restaura el paquete antiguo y la política de conexiones; elimina la raíz antigua solo después de que todos los certificados y conexiones antiguos se hayan drenado. Si la clave privada de la nueva raíz se ve comprometida, la revocación y el aislamiento de emergencia deben ser independientes del flujo de trabajo de rotación normal.

6. Observar y ensayar fallas

Monitorea los percentiles de vida útil de los certificados, fallas de emisión, retraso en la actualización de SVID o del paquete de confianza, errores de handshake TLS, 4xx/5xx agrupados por identidad y versión, y duración del drenaje. Ensaya alertas de expiración, desincronización de reloj, indisponibilidad del plano de control y una región que no pueda actualizarse utilizando identidades de prueba. Los registros graban identidad, versión y resultado, nunca claves privadas.

Ejemplo de respuesta de alta calidad

Primero identificaría si se trata de una rotación de certificado hoja, de CA o de dominio de confianza; luego le daría a cada carga de trabajo una identidad estable y un SVID X.509 de corta duración. Para una migración de CA, publicaría un paquete de confianza con raíz dual y confirmaría que los verificadores lo carguen antes de emitir dinámicamente nuevos certificados hoja a través de una Workload API o proxy. Reemplazaría las claves y certificados de forma atómica y retendría el material antiguo válido; las nuevas conexiones usan el nuevo certificado, mientras que las conexiones HTTP/2 y gRPC se drenan con una antigüedad máxima acotada. Desplegaría por grupo de cargas de trabajo y región, observando errores de handshake, versión del paquete, vida útil restante y tasa de reintentos. Ante una falla, detendría la emisión y restauraría el paquete antiguo y la política de conexiones; nunca deshabilitaría la verificación. Eliminaría la raíz antigua solo después de drenar los certificados y conexiones antiguos. Ensayaría la expiración, la desincronización de reloj y la falla del plano de control con identidades de prueba, y mantendría las claves privadas fuera de imágenes, variables de entorno y registros.

Errores comunes

  • Eliminar la raíz antigua antes de publicar la nueva, rompiendo los nodos que todavía usan certificados antiguos.
  • Reemplazar archivos sin manejar conexiones de larga duración, pools y solicitudes en vuelo.
  • Incrustar claves privadas en imágenes, variables de entorno o en un almacén de configuración ordinario.
  • Cambiar la clave y el certificado por separado y crear un par no coincidente.
  • Deshabilitar la verificación TLS o extender un certificado expirado indefinidamente durante una falla.
  • Tener solo una alerta de expiración de último minuto sin telemetría de versión de paquete, handshakes o retraso de actualización.

Preguntas de seguimiento y respuestas

¿Por qué aceptar primero ambas cadenas (antigua y nueva) en el paquete de confianza?

Los verificadores conocen la nueva raíz mientras los certificados antiguos continúan funcionando, por lo que nunca hay una brecha entre la emisión y la validación. Elimina la raíz antigua solo después de que se hayan drenado los certificados y las conexiones que la utilizan.

¿Qué sucede con las conexiones de larga duración después de la renovación?

Se limita su antigüedad máxima, se drenan gradualmente y se cierran después de que una nueva conexión complete su handshake. Las solicitudes reintentables siguen respetando las reglas de idempotencia y backoff; no reconectes a todos los clientes al mismo tiempo.

¿La indisponibilidad temporal del plano de control detiene el servicio de inmediato?

No. Almacena en caché identidades y paquetes mientras sigan siendo válidos, renueva de forma anticipada y genera alertas sobre la vida útil restante. La caché debe tener un límite explícito de seguridad y cumplimiento normativo en lugar de convertirse en una omisión indefinida.

¿Cómo demuestras que ningún servicio sigue dependiendo de la raíz antigua?

Registra handshakes y cargas por identidad, cadena de certificados y versión del paquete, luego confirma cero uso de la cadena antigua durante una ventana de observación. Aísla o revierte los nodos que no puedan reportar en lugar de asumir que se actualizaron.

Fuentes públicas

Preguntas relacionadas