Aller au contenu

authn-revokd

Un agent qui récupère des KRL et des CRL signées, ne garde que les listes qui se vérifient, les écrit là où sshd et les serveurs TLS les lisent, et refuse en cas de doute quand l'une d'elles expire.

OpenSSH n’a aucun moyen de distribuer une KRL, et rien dans une KRL ne dit qu’elle est périmée. sshd lit un fichier qui a cessé d’être mis à jour il y a des mois comme la liste en vigueur. authn-revokd comble ces deux lacunes pour les listes que publie authn-bridge : il récupère chaque liste, ne la garde que si elle se vérifie, l’écrit là où sshd ou un serveur TLS la lit, et, quand une liste expire, en écrit une qui révoque l’AC (autorité de certification) elle-même. Pur Go, CGO_ENABLED=0, un seul binaire. Ces pages décrivent 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 sort avec 0 ; avant la v0.6.2, il sortait avec 2.

Avant la v0.6.0, la commande s’appelait revokd, et lisait /etc/revokd.hcl par défaut. Plus rien ne lit ce fichier ; quand il est présent et que le nouveau fichier par défaut ne l’est pas, l’erreur nomme les deux chemins.

Ce qu’il fait, en une exécution

Face à un authn-bridge de test sur l’interface de bouclage, avec une source KRL et une source 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

Une seconde exécution sans rien de nouveau n’affiche rien et sort avec 0 : une sortie n’est réécrite que lorsque son contenu change.

Pourquoi le transport n’a pas d’importance

Chaque liste s’authentifie elle-même : une KRL par une signature SSHSIG détachée faite avec la propre clé de l’AC, une CRL par la signature de son AC. Chaque liste dit quand elle cesse d’être en vigueur. Une liste peut donc arriver par HTTPS, par HTTP en clair à l’intérieur d’une grappe, par un miroir, ou par un fichier. Le transport décide de la vitesse à laquelle un changement arrive, jamais de l’acceptation d’une liste falsifiée ou périmée.

KRLCRL
authentiqueSSHSIG par la clé de l’AC SSH, espace de noms krl@go-authn.github.iosignée par son AC
en vigueurexpires@go-authn.github.io, que sshd ignorenextUpdate
jamais en arrièrekrl_version, puis date de générationCRL Number, puis thisUpdate
refus en cas de douteauthn-revokd écrit une KRL qui révoque la clé de l’ACOpenSSL refuse de lui-même une CRL expirée

Pour aller plus loin

L’installerle démon, ou -once sur un minuteur ; brancher sshd et nginx
La configurationsources, sorties, le miroir, et ce qui est refusé
Comment une liste est vérifiéesignature, dates, et jamais plus ancienne que la liste détenue, même après un redémarrage
Quand une liste expirela KRL qui révoque l’AC elle-même

Ce qu’il ne fait pas

Une révocation n’atteint pas un serveur plus vite que la fréquence d’interrogation d’authn-revokd (refresh), plus le délai de l’émetteur pour émettre à nouveau. Tant que l’émetteur est arrêté, ses certificats sont refusés à partir de l’expiration de la liste. Quiconque détient la clé d’une AC peut signer n’importe quelle liste, comme n’importe quel certificat.

Licence

BSD-3-Clause.

Créée le par tannevaled

Modifiée le par tannevaled