Statusliste veröffentlichen und pflegen: Widerruf für Mandate
Ein Mandat ohne Widerruf ist gefährlich: Wird ein Agent kompromittiert, bleibt sein Mandat bis zum Ablauf gültig. Eine Statusliste löst das. Diese Anleitung zeigt Aufbau, Signatur, Veröffentlichung und Pflege.
Das Wichtigste in Kürze
- Eine Statusliste ist eine komprimierte, signierte Bitfolge mit einem Eintrag pro Mandat.
- Bei einem Widerruf wird das Bit gesetzt, die Liste neu signiert und sofort veröffentlicht.
- Fehlt die Liste bei der Prüfung, bleibt das Urteil nach dem Prinzip fail-closed unbestimmt.
Aufbau verstehen
Eine Statusliste ist eine Bitfolge: Jedes Mandat erhält bei der Ausstellung einen Index, und an dieser Stelle steht sein Status, mit einem Bit 0 für gültig und 1 für widerrufen, mit zwei Bits zusätzlich 2 für ausgesetzt. Die Bitfolge wird mit DEFLATE im ZLIB-Format komprimiert, Base64url-kodiert und als Angabe status_list in einem signierten JWT veröffentlicht.
Liste erzeugen und signieren
Das folgende Skript erzeugt eine Liste mit 1024 Einträgen, widerruft den Eintrag mit Index 3 und signiert die Liste mit dem Schlüssel aus der JWKS-Anleitung:
import { deflateSync } from "node:zlib";
import { createPrivateKey, sign } from "node:crypto";
import { readFileSync, writeFileSync } from "node:fs";
const bits = 1, size = 1024;
const list = new Uint8Array((size * bits) / 8);
const revoke = (i) => { list[i >> 3] |= 1 << (i & 7); };
revoke(3);
const b64u = (b) => Buffer.from(b).toString("base64url");
const header = { alg: "ES256", typ: "statuslist+jwt", kid: "issuer-2026-10" };
const payload = {
sub: "https://example.com/status/1",
iat: Math.floor(Date.now() / 1000),
ttl: 3600,
status_list: { bits, lst: b64u(deflateSync(list)) },
};
const input = b64u(JSON.stringify(header)) + "." + b64u(JSON.stringify(payload));
const key = createPrivateKey(readFileSync("private.pem"));
const signature = sign("sha256", Buffer.from(input), { key, dsaEncoding: "ieee-p1363" });
writeFileSync("status-list.jwt", input + "." + b64u(signature));Die Bits werden innerhalb jedes Bytes vom niederwertigsten Bit an gezählt, wie es die Spezifikation verlangt.
Ergebnis kontrollieren
Fügen Sie die erzeugte Datei in den Statuslisten-Decoder ein und geben Sie Index 3 an. Der Decoder zeigt 1024 Einträge und an Index 3 den Wert 1. Die Signatur prüft eine Prüfstelle mit Ihrem JWKS.
Mandate auf die Liste verweisen lassen
Tragen Sie in jedes Mandat unter status die Angabe status_list mit idx, dem Index des Mandats, und uri, der Adresse der Liste, ein. Vergeben Sie Indizes zufällig statt fortlaufend, damit sich aus dem Index nichts über die Reihenfolge der Ausstellung ablesen lässt.
Veröffentlichen und aktualisieren
Stellen Sie die Liste unter der Adresse aus uri bereit und erneuern Sie sie regelmässig mit neuem iat; die Angabe ttl sagt Prüfstellen, wie lange sie eine geladene Fassung verwenden dürfen. Bei einem Widerruf setzen Sie das Bit, signieren neu und veröffentlichen sofort. Prüfstellen hinterlegen die aktuelle Fassung; fehlt sie, bleibt das Urteil nach dem Prinzip fail-closed unbestimmt.
Fehler beheben
Meldet die Prüfung status_list_invalid, ist die Liste abgelaufen, falsch signiert oder nicht lesbar; der Statuslisten-Decoder zeigt, ob sie sich entpacken lässt. Zeigt ein widerrufenes Mandat weiterhin gültig, prüfen Sie, ob der Index im Mandat zur gesetzten Stelle passt und ob die Prüfstelle die aktuelle Fassung hinterlegt hat.
Häufige Fragen
Wie gross sollte eine Statusliste sein?
Gross genug, dass aus der Zahl der Einträge nicht auf die Zahl der ausgestellten Mandate geschlossen werden kann, etwa einige Tausend Einträge pro Liste.
Kann ich ein widerrufenes Mandat wieder aktivieren?
Mit zwei Bits pro Eintrag lässt sich ein Mandat aussetzen und später wieder freigeben. Ein Widerruf sollte dagegen endgültig sein.
Wie oft sollte ich die Statusliste neu veröffentlichen?
Regelmässig, auch ohne Änderung, damit iat aktuell bleibt, und sofort bei jedem Widerruf. Das Intervall richtet sich nach ttl und nach dem Risiko.
Kann eine Statusliste Mandate verschiedener Aussteller enthalten?
Nein. Jede Liste gehört zu einem Aussteller und ist mit dessen Schlüssel signiert; jedes Mandat verweist auf die Liste seines Ausstellers.
Quellen
- IETF: Token Status List: https://datatracker.ietf.org/doc/draft-ietf-oauth-status-list/
- RFC 1950: ZLIB Compressed Data Format: https://www.rfc-editor.org/rfc/rfc1950