Signierschlüssel rotieren

POST /v1/signing-keys:rotate · Berechtigung signing-keys:write

Führt sofort eine Rotation der Signierschlüssel außerhalb des automatischen Zeitplans aus.

Föderationsschlüssel

Über use kann auch einer der Föderationsschlüssel der Umgebung angegeben werden: saml_sp_signing und saml_sp_encryption (die SAML-Signier- und Verschlüsselungsschlüssel des Service Providers, die in Ihren SP-Metadaten veröffentlicht werden) oder oidc_rp_signing (der private_key_jwt-Schlüssel von Enterprise-OIDC-Verbindungen, veröffentlicht unter /sso/jwks.json). Diese Schlüssel sind immer RSA-3072 und werden automatisch einmal pro Jahr rotiert: Ein neuer next-Schlüssel wird 30 Tage vor seiner Übernahme veröffentlicht, und der alte Schlüssel bleibt noch 30 Tage danach veröffentlicht.

Bei einem Föderationsschlüssel ist next_kid in der Antwort null, removed_kids ist leer und revoke_sessions ist nicht zulässig. Hat die Umgebung nie SAML oder private_key_jwt verwendet, gibt es keinen Schlüssel zum Rotieren, und der Aufruf schlägt mit 409 conflict fehl.

Verbindungsschlüssel

Eine SAML-Verbindung kann eigene, dedizierte SP-Schlüssel anstelle der Schlüssel der Umgebung haben. Um diese zu rotieren, fügen Sie connection_id (conn_…) mit use: saml_sp_signing oder saml_sp_encryption hinzu. Dieselben Modi, Berechtigungen und Regeln gelten, aber nur der Schlüsselsatz dieser Verbindung ändert sich: Die Schlüssel der Umgebung und die Schlüssel der übrigen Verbindungen bleiben unverändert, und das connection.sp_certificate_rotation_started-Ereignis wird nur für diese Verbindung gesendet. Der Audit-Eintrag nennt die Umgebung als Ziel und die Verbindung in metadata.connection_id. Eine unbekannte Verbindung oder eine Verbindung einer anderen Umgebung schlägt mit 404 not_found fehl; eine Verbindung, die die Schlüssel der Umgebung verwendet, schlägt mit 409 connection_keys_not_dedicated fehl (rotieren Sie die Schlüssel der Umgebung ohne connection_id). Ohne connection_id wird der Schlüsselsatz der Umgebung rotiert.

Der Notfallmodus benötigt neben signing-keys:write die ausdrücklich am Berechtigungsnachweis erteilte Berechtigung signing-keys:emergency: Nur ein eingeschränkter Schlüssel oder ein M2M-Client mit dieser Berechtigung kann ihn aufrufen. Ein geheimer Schlüssel mit vollem Zugriff (idp_sk_…) erhält im Notfallmodus 403 insufficient_permissions.

Neue Token-Signierschlüssel verwenden den Algorithmus der Umgebungsrichtlinie (Richtlinie abrufen). Eine erfolgreiche Rotation des Token-Signierschlüssels löst das Webhook-Ereignis signing_key.rotated oder signing_key.revoked aus; jede Rotation schreibt einen Verwaltungs-Audit-Eintrag. Dieser Endpunkt gehört zur Ratenbegrenzungsfamilie „Schlüssel- und Geheimnisausstellung“. Senden Sie einen Idempotency-Key: Ein erneuter Versuch nach einem Netzwerkfehler liefert dann das erste Ergebnis zurück, statt zweimal zu rotieren.

Anfrage

JSON-Body (unbekannte Felder werden mit 400 unknown_field abgelehnt):

Feld Typ Pflicht Beschreibung
Idempotency-Key header nein Empfohlen. 16-64 Zeichen aus A-Z a-z 0-9 _ -.
mode string ja immediate oder emergency.
use string nein Der zu rotierende Schlüssel. Standard token_signing (Signierschlüssel für Zugriffs- und ID-Token). Die Föderationsschlüssel sind saml_sp_signing, saml_sp_encryption und oidc_rp_signing (siehe Föderationsschlüssel).
revoke_sessions boolean nein Nur für Notfall und token_signing. Widerruft außerdem alle Sitzungen und Refresh-Token. Standard false.
revoke_next boolean nein Nur für Notfall. Widerruft außerdem den veröffentlichten next-Schlüssel. Standard false.
reason string Notfall: ja Nur für Notfall. 1-512 druckbare ASCII-Zeichen, zum Beispiel eine Vorfallnummer. Geben Sie hier keine Geheimnisse oder personenbezogenen Daten ein.
connection_id string nein Nur saml_sp_signing und saml_sp_encryption. Eine SAML-Verbindung (conn_…) mit dedizierten SP-Schlüsseln; ihr Schlüsselsatz wird anstelle des Satzes der Umgebung rotiert (siehe Verbindungsschlüssel).

Bei mode: immediate schlägt das Senden von revoke_sessions: true, revoke_next: true oder eines reason mit 422 fehl (not_allowed). Ein connection_id mit token_signing oder oidc_rp_signing schlägt auf die gleiche Weise fehl.

Antwort

200 OK mit dem Ergebnis der Rotation. activated_kid ist der Schlüssel, der ab jetzt signiert, und next_kid der neu veröffentlichte next-Schlüssel (null bei einem Föderationsschlüssel). retired_kids sind Schlüssel, die nicht mehr signieren und veröffentlicht bleiben (7 Tage für einen Token-Signierschlüssel, 30 Tage für einen Föderationsschlüssel); revoked_kids sind Schlüssel, die durch eine Notfallrotation aus dem JWKS entfernt wurden; removed_kids sind ausgemusterte Schlüssel, deren 7-Tage-Fenster abgelaufen ist und die im selben Schritt das JWKS verlassen haben.

{
  "mode": "immediate",
  "use": "token_signing",
  "activated_kid": "ypeBEsobvcr6wjGzmiPcTaeG7_gUfE5yuYB3ha_uSLs",
  "next_kid": "GKw-c0PwFokMUQ6T-TUmEWnZ4_VlQ2Qpgw-vCTT0-OQ",
  "retired_kids": ["PiPoFgA5WUoziU9lZOGxNIu9egCI1CxKy3PurtWcAJ0"],
  "revoked_kids": [],
  "removed_kids": ["Ln0sA6lQeuJl7PW1NWiFpTOTogKdJBOUmXJloaJa78Y"],
  "revoke_sessions": false
}

Fehler

HTTP Code Wann
400 unknown_field Der Body enthält ein unbekanntes Feld.
400 malformed_request Der Body ist kein gültiges JSON, oder der Header Idempotency-Key ist fehlerhaft oder doppelt vorhanden.
403 insufficient_permissions Dem Berechtigungsnachweis fehlt signing-keys:write, oder der Notfallmodus wurde ohne ausdrücklich erteilte signing-keys:emergency angefordert.
404 not_found connection_id nennt keine SAML-Verbindung dieser Umgebung.
409 connection_keys_not_dedicated connection_id nennt eine Verbindung, die die SP-Schlüssel der Umgebung verwendet.
409 next_key_too_young Ein Algorithmuswechsel steht aus und der next-Schlüssel wurde vor weniger als 7 Tagen veröffentlicht, oder (Föderationsschlüssel, immediate) der next-Schlüssel wurde vor weniger als 7 Tagen veröffentlicht.
409 conflict Die Umgebung hat keinen veröffentlichten next-Schlüssel, keinen aktiven Schlüssel des Föderations-use, oder der vorherige Föderationsschlüssel befindet sich noch in seiner 30-tägigen Überlappung.
415 unsupported_media_type Der Content-Type ist nicht application/json.
422 validation_failed Ein Feld fehlt oder ist ungültig; der Pointer nennt das Feld, zum Beispiel /reason.
422 idempotency_key_reuse Der Idempotency-Key wurde bereits mit einem anderen Body verwendet.
501 not_implemented Der Vorgang ist in dieser Bereitstellung noch nicht verfügbar.
401 unauthenticated Der Berechtigungsnachweis fehlt, ist ungültig oder widerrufen.
429 rate_limited Das Ratenlimit wurde überschritten; wiederholen Sie den Aufruf nach dem Zeitraum Retry-After.
503 service_unavailable Eine Abhängigkeit ist vorübergehend nicht verfügbar; wiederholen Sie den Aufruf nach dem Zeitraum Retry-After.

Beispiel

Reguläre Rotation:

curl -X POST "https://api.eu.keenauth.com/v1/signing-keys:rotate" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"mode":"immediate"}'

Notfallrotation mit einem eingeschränkten Schlüssel, der signing-keys:write und signing-keys:emergency gewährt:

curl -X POST "https://api.eu.keenauth.com/v1/signing-keys:rotate" \
  -H "Authorization: Bearer $KEENAUTH_EMERGENCY_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"mode":"emergency","revoke_sessions":true,"reason":"INC-2041 key exposure"}'

Notfallrotation des SAML-SP-Signierschlüssels, die außerdem den veröffentlichten next-Schlüssel widerruft:

curl -X POST "https://api.eu.keenauth.com/v1/signing-keys:rotate" \
  -H "Authorization: Bearer $KEENAUTH_EMERGENCY_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"mode":"emergency","use":"saml_sp_signing","revoke_next":true,"reason":"INC-2042 SP key exposure"}'

Notfallrotation des dedizierten SAML-SP-Signierschlüssels einer Verbindung:

curl -X POST "https://api.eu.keenauth.com/v1/signing-keys:rotate" \
  -H "Authorization: Bearer $KEENAUTH_EMERGENCY_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"mode":"emergency","use":"saml_sp_signing","connection_id":"conn_01h2xcejqtf2nbrexx3vqjhp41","reason":"INC-2043 connection key exposure"}'