Saltar al contenido

authn-revokd

Un agente que descarga KRL y CRL firmadas, conserva solo las listas que se verifican, las escribe donde las leen sshd y los servidores TLS, y falla en modo cerrado cuando una caduca.

OpenSSH no tiene forma de distribuir una KRL, y nada en una KRL dice que esté desfasada. sshd lee como lista vigente un archivo que dejó de actualizarse hace meses. authn-revokd cierra ambas brechas para las listas que publica authn-bridge: descarga cada lista, la conserva solo si se verifica, la escribe donde la lee sshd o un servidor TLS y, cuando una lista caduca, escribe una que revoca la propia CA. Go puro, CGO_ENABLED=0, un solo binario. Estas páginas describen la v0.6.4.

$ go install github.com/go-authn/revocation/cmd/authn-revokd@v0.6.4
$ authn-revokd -version
authn-revokd v0.6.4
$ authn-revokd -help
Usage of authn-revokd:
  -config string
    	the configuration file (default "/etc/authn-revokd/revokd.hcl")
  -once
    	sync once and exit: 1 when a list is not current, or could not be fetched
  -version
    	print the version and exit

-help termina con 0; antes de la v0.6.2 terminaba con 2.

Antes de la v0.6.0 el comando se llamaba revokd, y leía /etc/revokd.hcl por defecto. Ya nada lee ese archivo; cuando existe y el nuevo valor por defecto no, el error nombra las dos rutas.

Lo que hace, en una ejecución

Contra un authn-bridge de prueba en loopback, con un origen KRL y un origen CRL:

$ authn-revokd -config revokd.hcl -once
bridge-ssh: version 0, issued 2026-10-11T09:50:24Z, expires 2026-10-11T10:50:24Z
bridge-x509: version 1791712224691, issued 2026-10-11T09:50:24Z, expires 2026-10-11T10:50:24Z
output sshd: wrote /tmp/authn/revokd/out/sshd.krl
output tls: wrote /tmp/authn/revokd/out/bridge.crl
$ ssh-keygen -Q -l -f out/sshd.krl
# KRL version 0
# Generated at 20261011T115024
# Comment: authn-revokd sshd

Una segunda ejecución sin nada nuevo no imprime nada y termina con 0: una salida solo se reescribe cuando cambia su contenido.

Por qué el transporte no importa

Cada lista se autentica a sí misma: una KRL mediante una firma SSHSIG separada hecha con la propia clave de la CA, una CRL mediante la firma de su CA. Cada lista dice cuándo deja de estar vigente. Así que una lista puede llegar por HTTPS, por HTTP sin cifrar dentro de un clúster, desde un espejo o desde un archivo. El transporte decide lo rápido que llega un cambio, nunca si se acepta una lista falsificada o desfasada.

KRLCRL
auténticaSSHSIG con la clave de la CA SSH, espacio de nombres krl@go-authn.github.iofirmada por su CA
vigenteexpires@go-authn.github.io, que sshd ignoranextUpdate
nunca hacia atráskrl_version, y después la fecha de generaciónCRL Number, y después thisUpdate
en modo cerradoauthn-revokd escribe una KRL que revoca la clave de la CAOpenSSL rechaza por sí solo una CRL caducada

Por dónde seguir

Instalarloel demonio, o -once con un temporizador; conectar sshd y nginx
La configuraciónorígenes, salidas, el espejo, y lo que se rechaza
Cómo se verifica una listafirma, fechas, y nunca más antigua que la lista guardada, también entre reinicios
Cuando una lista caducala KRL que revoca la propia CA

Lo que no hace

Una revocación no llega a un servidor más rápido de lo que authn-revokd consulta (refresh), más el retraso del emisor en volver a emitir. Mientras el emisor está caído, sus certificados se rechazan a partir de la caducidad de la lista. Quien tenga la clave de una CA puede firmar cualquier lista, igual que puede firmar cualquier certificado.

Licencia

BSD-3-Clause.

Creada el por tannevaled

Modificada el por tannevaled