Los dos binarios
| Binario | Rol |
|---|---|
certplane-broker | API HTTPS central. Autentica agentes con mTLS, aplica política, habla con el emisor ACME configurado, cachea certificados en un almacén SQLite o de archivo y registra eventos de auditoría. |
certplane-agent | Binario one-shot en cada host gestionado. Se registra con step-ca una vez y, en cada invocación, renueva la identidad (si toca), genera o reutiliza claves de servicio localmente, envía CSR al broker, instala los bundles devueltos y ejecuta hooks de recarga. |
-c / --config.
Fase 1: registro
Ocurre una vez por host. Vincula el host a su identidad de máquina.Coloca un token de arranque
Un operador (o un play de Ansible) escribe un token de
step-ca corto en la ruta indicada por identity.bootstrap_token.Ejecuta `certplane-agent ... enroll`
El agente toma un lock en
state_dir/agent.lock y:- Genera una clave ECDSA P-256 en
identity.key(si no existe). - Construye un CSR con
CN = identity.name. - Llama al endpoint provisioner de
step-caenidentity.step_ca.url, presentando el CSR y el token. Verifica el TLS del servidor conidentity.step_ca.fingerprintoidentity.step_ca.root_ca_bundle. - Escribe el certificado devuelto en
identity.certy borra el archivo del token para que no pueda reutilizarse.
Fase 2: bucle de renovación
Cada invocación decertplane-agent ... run hace lo siguiente:
Renovación de identidad
Si el certificado de identidad expira dentro de
identity.renew_before (por defecto 8h), el agente renueva con step-ca y escribe un identity.crt nuevo. Si queda menos de identity.warn_before pero aún no hay que renovar, registra una advertencia.Para cada certificado de servicio
Para cada entrada en
certificates[]:- Asegura una clave de servicio en
key. La genera (ECDSA P-256) si falta y la reutiliza si existe. Las claves nunca salen del host. - Comprueba el certificado existente en
cert. Si parsea, coincide con la clave y aún no entra en la ventana derenew_before(por defecto720h), registracertificate skipped, not in renewal windowy continúa. - Construye un CSR con exactamente los
dns_namesconfigurados. - Llama al broker. Abre una conexión mTLS a
broker.url, presentandoidentity.certcomo cliente y confiando enbroker.server_ca_bundlepara el TLS del broker. HacePOST /v1/certificatescon{profile, csr_pem}. - Valida el bundle. Cuando el broker devuelve
cert_pem,chain_pemyfullchain_pem, el agente verifica que la hoja coincide con la clave local y que tiene exactamente los DNS pedidos — nunca confía a ciegas en el broker. - Instala atómicamente. Escribe
cert,chainyfullchainen disco. - Recarga. Si
reload_commandestá definido, lo ejecuta con timeoutreload_timeout(por defecto30s) y registra la salida.
Qué hace el broker en /v1/certificates
Cuando recibe una solicitud de emisión:
- Autentica. El TLS termina con
tls.RequireAndVerifyClientCertcontraserver.mtls.agent_ca_bundle. La identidad es el CN del certificado cliente. - Autoriza. Busca la identidad en la política activa (
policy.path), confirma que elprofilesolicitado aparece enhosts.<key>.profilesy valida los DNS del CSR contra losdns_namesdel perfil. - Limita la tasa. Aplica límites por identidad y por (identidad, perfil) según
rate_limits. - Sirve desde caché o emite. Si hay un certificado cacheado para
(profile, huella del CSR)fuera de la ventana derenew_beforedel perfil, lo devuelve. Si no, llama a ACME (Let’s Encrypt por defecto) con el tipo de desafío del perfil, obtiene el certificado, lo guarda y lo devuelve. - Audita. Cada decisión — allow o deny, además de eventos de ciclo de vida del broker — se registra. Inspecciónalo con
certplane-broker ... audit tail.
Lo que nunca cruza la red
- Claves privadas de servicio. Siempre generadas y rotadas en el host que las usa.
- Credenciales del proveedor DNS. Se quedan en el broker. Los agentes no saben cómo se satisface el desafío ACME.
- Claves de cuenta ACME. Viven solo en el broker.