13. Nov. 2025·6 Min. Lesezeit

Webhook-Secret-Rotation ohne Ausfall: Duale Signaturen richtig gemacht

Lerne, wie du ein Webhook-Secret ohne Ausfall rotierst: doppelte Verifikation, klares Logging, sichere Cutover-Schritte, Rollback und Cleanup-Checks.

Webhook-Secret-Rotation ohne Ausfall: Duale Signaturen richtig gemacht

Was schiefgeht, wenn du ein Webhook-Secret drehst

Das Rotieren eines Webhook-Secrets klingt einfach: Secret beim Sender ändern, Secret beim Empfänger ändern, fertig. In der Praxis kann ein einziger Timing-Fehler die Verifikation zerstören und einen normalen Tag in eine Flut von fehlgeschlagenen Zustellungen verwandeln.

Das häufigste Problem sieht so aus: Der Provider beginnt, Requests mit dem neuen Secret zu signieren, bevor dein Server davon weiß (oder dein Server wechselt zuerst, während der Provider noch das alte Secret verwendet). Jede Anfrage wirkt dann „manipuliert“, und dein Empfänger lehnt sie ab.

Bei einer Rotation ohne Ausfall geht es nicht um einen perfekten Ein-Sekunden-Switch. Ziel ist ein kurzes Überlappungsfenster, in dem beide Secrets akzeptiert werden.

„Ausfall“ bei Webhooks zeigt sich meist als:

  • verpasste Events, die nie verarbeitet werden (oder zu spät ankommen)
  • sich aufstapelnde Retries, die Rate-Limits treffen
  • Duplikate, wenn der Provider erneut sendet und dein Handler nicht idempotent ist
  • Support-Tickets, weil Zahlungen, E-Mails oder Sync-Jobs aus dem Takt geraten

Die Lösung ist unspektakulär, aber zuverlässig: Akzeptiere während des Cutovers Signaturen, die entweder mit dem alten oder dem neuen Secret erstellt wurden, und überwache Signaturfehler genau. Sobald fast der gesamte Traffic mit dem neuen Secret validiert (und Retries abgearbeitet) wird, entferne das alte Secret.

Wenn dein Webhook-Handler bereits fragil ist (inkonsistentes Body-Parsing, wackelige Signatur-Prüfungen, gemischte Verantwortlichkeiten in einem riesigen Handler), wird die Rotation das schnell sichtbar machen.

Webhook-Signaturen einfach erklärt (und warum Rotation knifflig wird)

Ein Webhook ist ein System (der Sender), das bei einem Ereignis deine URL (der Empfänger) aufruft, z. B. bei einer Zahlung oder einer Registrierung. Weil jede:r deine Endpoint aufrufen kann, fügen viele Provider ein gemeinsames Secret und einen Signatur-Header hinzu, damit du prüfen kannst, ob die Anfrage echt ist.

Bei einer HMAC-Signatur nimmt der Sender genau den Request-Body, mischt ihn mit dem Secret und erzeugt einen kurzen Fingerabdruck (die Signatur). Dein Server berechnet mit seiner Kopie des Secrets dasselbe. Stimmen die Fingerprints überein, hat der Sender bewiesen, dass er das Secret kennt, ohne es zu übermitteln.

Der Haken: winzige Unterschiede ändern den Fingerprint. Viele Signaturfehler während der Rotation sind keine „falschen Secrets“, sondern Unterschiede in dem, was signiert wurde.

Häufige Stolperfallen sind:

  • signieren von geparstem JSON statt der rohen Request-Body-Bytes
  • Leerzeichen- oder Schlüsselreihenfolge-Änderungen durch Middleware
  • falsches Encoding (String vs. Bytes, UTF‑8 vs. etwas anderes)
  • Header-Unterschiede (einige Provider nutzen andere Header-Namen oder fügen einen Timestamp hinzu)
  • mehrere Signaturen in einem Header (während Rotation oder für unterschiedliche Algorithmen)

Warum also bricht „einfach das Secret aktualisieren“? Weil Änderungen nicht überall gleichzeitig passieren. Der Provider rollt möglicherweise schrittweise aus, dein Deploy verteilt sich über Instanzen und Minuten, und Retries können später mit dem vorherigen Secret ankommen. Wenn du zu früh nur das neue Secret akzeptierst, lehnst du echte Events ab.

Deshalb braucht Rotation ein Überlappungsfenster, in dem du mit beiden Secrets verifizierst, plus Monitoring, das dir zeigt, wann die alte Signatur effektiv verschwunden ist.

Den Cutover planen: Überlappungsfenster und Erfolgssignale

Eine sichere Rotation beginnt mit einer Entscheidung: wie lange beide Secrets akzeptiert werden. Dein Überlappungsfenster sollte länger sein als die schlechteste mögliche Verzögerung, mit der ein Webhook noch ankommen kann. Das schließt Provider-Retries (manchmal Stunden oder Tage), deine eigenen Queue-Delays und manuelle Replays ein.

Bevor du am Code drehst, stelle sicher, dass du zwei Secrets gleichzeitig speichern kannst und sie nicht in Logs oder Fehlermeldungen landen. Behandle eines als „aktuell“ und das andere als „vorherig“. Mach es möglich zu wechseln, welches aktuell ist, ohne neu zu deployen (Konfig-Änderung oder Secret-Manager-Update).

Während des Überlappungsfensters verifizierst du typischerweise auf eine von zwei Arten:

  • zuerst das neue Secret versuchen, dann auf das alte zurückfallen
  • beide verifizieren und aufzeichnen, welches bestanden hätte

Definiere Erfolgssignale vorher, damit du später nicht raten musst. Tracke:

  • Signatur-Pass-Rate (gesamt und nach Endpoint, wenn du mehrere hast)
  • 4xx/5xx-Fehlerrate auf dem Empfänger
  • Lieferlatenz (Provider-Timestamp vs. verarbeiteter Timestamp)
  • Retry-Volumen (Spikes deuten oft auf Verifikationsfehler hin)

Wähle eine Exit-Regel und halte dich daran, z. B.: 99%+ Signaturen, die für 24 Stunden mit dem neuen Secret bestehen, keine Zunahme von Retries und stabile Latenz. Dann plane das Entfernen des alten Secrets.

Schritt-für-Schritt: Dual-Verifikation auf dem Empfänger implementieren

Für eine Rotation ohne Ausfall muss dein Empfänger für ein kurzes Fenster zwei gültige Signaturen akzeptieren: das neue und das alte Secret.

Lege beide Secrets in der Konfiguration ab (Env-Variablen oder Secret-Manager) und lade sie als geordnete Liste. Halte die Verifikationsfunktion klein, damit du sie unit-testen kannst, ohne die ganze App zu booten.

secrets = [NEW_SECRET, OLD_SECRET]  // old is optional

def verify(raw_body, headers):
  sig = headers[\"X-Signature\"]
  for secret in secrets:
    if secret is empty: continue
    expected = hmac(secret, raw_body)
    if constant_time_equal(sig, expected):
      return true
  return false

Details, die später Schmerzen verhindern:

  • versuche zuerst das neue Secret, dann das alte
  • nutze einen konstantzeitlichen Vergleich (oder einen sicheren Helfer aus deiner Crypto-Library)
  • gib bei jedem Signaturfehler dieselbe Fehlerantwort zurück (zeige nicht, welche Prüfung fehlgeschlagen ist)
  • halte die Funktion rein: Input ist roher Body + Header, Output true/false
  • füge fokussierte Tests hinzu: gültig mit neuem, gültig mit altem, ungültig, Header fehlt

Eine praktische Regel, die viele mysteriöse Fehler vermeidet: berechne die HMAC über genau die rohen Payload-Bytes, die du erhalten hast. JSON zu parsen und neu zu serialisieren ändert oft Leerzeichen oder Schlüsselreihenfolge.

Wenn du von AI-generiertem Webhook-Code geerbt hast, der Parsing, Verifikation und Business-Logik in einem Handler mischt, trenne die Verifikation zuerst in eine kleine Funktion. Dieser eine Schritt macht Dual-Verifikation deutlich sicherer zum Ausrollen.

Observability während der Rotation: was zu loggen und zu alarmieren ist

Secret-Rotation schlägt leise fehl, wenn du nicht sehen kannst, welches Secret eine Anfrage validiert hat oder warum die Validierung gescheitert ist. Behandle Signaturvalidierung wie ein Auth-System: klare Logs, einfache Metriken und Alarme, die echte Probleme fangen ohne zu viel Lärm.

Logge Signaturfehler mit einer kleinen Menge an Reason-Buckets, damit du gruppieren und handeln kannst:

  • fehlender Signatur-Header
  • Timestamp fehlt oder außerhalb des erlaubten Bereichs
  • Body-Lese-/Parse-Fehler
  • canonical string mismatch
  • HMAC mismatch (new)
  • HMAC mismatch (old)

Tracke außerdem, welches Secret erfolgreiche Requests validiert hat. Ein Zähler wie webhook_validated_total{secret="new"} vs. ...{secret="old"} zeigt dir, ob Partner noch das alte Secret benutzen und ob die Dual-Verifikation funktioniert.

Eine kompakte Checkliste, die sicher bleibt:

  • Log: Request-ID, Provider-Event-ID, Reason-Bucket und welches Secret validiert hat (new/old)
  • Metrik: gesamt Anfragen, Gesamtfehler, validated-by-new vs validated-by-old
  • Alarm: anhaltender Anstieg von Fehlern (Rate und absolute Anzahl)
  • Alarm: alte-Secret-Validierungen bleiben nach dem geplanten Überlappungsfenster hoch
  • Sicherheit: logge niemals rohe Secrets; vermeide volle Payloads, falls sie PII, Tokens oder Zahlungsdaten enthalten

Request-IDs und Event-IDs sind wichtig, denn Retries und Duplikate sehen ohne sie wie zufällige Fehler aus. Wenn du dieselbe Event-ID wiederholt fehlschlagen siehst, deutet das oft auf einen Canonicalization-Bug statt auf einen Angreifer hin.

Cutover-Playbook: Deploy-Reihenfolge, Monitoring und Rollback

Doppelte Verarbeitung verhindern
Wir machen deinen Handler idempotent-freundlich, damit Retries keine Duplikate erzeugen.

Ein sauberer Cutover ist größtenteils eine Frage der Reihenfolge. Mach den Empfänger toleranter, wechsle den Sender, dann verschärfe wieder.

Deploy-Reihenfolge (von Haus aus sicher)

  • Stage 1: Deploy den Empfänger mit Dual-Verifikation (akzeptiere alt ODER neu). Ändere noch nichts beim Sender.
  • Stage 2: Update den Sender/Provider, damit er mit dem neuen Secret signiert.
  • Stage 3: Beobachte die Validierungsergebnisse, bis der Großteil des Traffics mit dem neuen Secret validiert.

Während Stage 1 sollte das Monitoring eine Basislinie zeigen: fast alle Requests validieren mit dem alten Secret, neue-Secret-Validierungen sind nahe null. Nach Stage 2 solltest du eine stetige Verschiebung von alt zu neu sehen.

Was zu überwachen ist und wie „gut“ aussieht

Tracke Zähler, nicht nur Logs: total empfangene Webhooks, valid-new, valid-old, invalid. Alarme bei Anstieg ungültiger Signaturen und ebenfalls, wenn valid-old länger als erwartet hoch bleibt (das kann heißen, dass der Sender nicht wirklich gewechselt hat).

Zum Beenden des Überlapps verwende eine klare Bedingung, damit Dual-Verifikation nicht dauerhaft bleibt:

  • eine Mindest-Überlappungszeit (oft 24–72 Stunden, abhängig von Retry-Verhalten)
  • plus: null old-secret-Validierungen für ein volles Fenster (z. B. 6–12 Stunden)

Rollback-Plan

Wenn ungültige Signaturen nach dem Wechsel des Senders spike, rolle zuerst das Sender-Secret zurück. Belasse die Dual-Verifikation auf dem Empfänger während des gesamten Incidents. So bleibt das Rollback auf eine Änderung beschränkt, während du Payload-Formatierung, Timestamp-Drift oder das falsche deployte Secret untersuchst.

Edge-Cases, die falsche Signaturfehler verursachen

Die meisten „bad signature“-Fehler während einer Rotation sind eigentlich keine schlechten Secrets. Es sind Unstimmigkeiten zwischen dem, was der Sender signiert hat, und dem, was dein Empfänger verifiziert hat.

Prüfe zuerst, ob du das richtige Secret für die richtige Umgebung nutzt. Teams haben oft mehrere Endpoints oder Umgebungen, und Secrets werden vertauscht. Es ist üblich, ein Produktions-Event mit einem Staging-Secret zu prüfen, weil ein Worker, eine Queue oder eine Konfigurationsdatei auf den falschen Ort zeigt.

Wenn der Provider Timestamp-signaturen nutzt, kann Clock-Skew wie ein Signaturfehler aussehen. Erlaube ein vernünftiges Fenster (z. B. 5 Minuten) und sorge dafür, dass deine Server richtige Zeit haben. Akzeptiere kein riesiges Fenster, außer du bist mit dem Replay-Risiko einverstanden.

Retries und aus der Reihenfolge kommende Zustellungen verwirren das Debugging: Ein älterer Retry kann nach deinem Secret-Wechsel ankommen. Während des Überlapps behandle das Event als gültig, wenn eine der beiden Signaturen verifiziert, und verlasse dich auf Idempotenz, um Doppelverarbeitung zu vermeiden.

Zwei Quick-Checks, die viele „mystery failures“ aufdecken:

  • gegen die rohen Request-Body-Bytes verifizieren, nicht gegen ein neu serialisiertes JSON-Objekt
  • sicherstellen, dass Body-Parsing vor der Verifikation keine Leerzeichen, Encoding- oder Zeilenende-Änderungen einführt

Sei dir außerdem bewusst, dass Proxies und Middleware den Body transformieren können (Dekompression, Charset-Änderung, Newline-Normalisierung). Selbst wenn die Payload in Logs gleich aussieht, können die Bytes, die der Provider signierte, anders sein.

Häufige Fehler (und einfache Fixes)

Gegen Roh-Bytes validieren
Wir isolieren den Rohkörper-Pfad, damit Middleware Signaturen nicht heimlich bricht.

Die meisten gescheiterten Rotationen drehen sich nicht um Krypto. Sie drehen sich um Details, die verändern, was signiert wird, oder um Fehler, die verborgen bleiben, bis Kunden sich beschweren.

JSON vor der Signatur zu parsen ist der klassische Fehler. Viele Frameworks enkodieren JSON neu (Abstände, Key-Reihenfolge, Unicode), sodass die Bytes, die du verifizierst, nicht die sind, die der Sender signiert hat. Fix: Puffere zuerst den rohen Request-Body, verifiziere an diesen exakten Bytes, und parse erst danach JSON.

Ein weiterer häufiger Bug ist, den Request-Stream zweimal zu lesen. Middleware liest den Body zum Loggen, dann liest dein Handler ihn erneut zur Verifikation, aber der zweite Read ist leer. Fix: buffer den Body einmal und reiche diesen Buffer an Logging und Verifikation weiter.

Signatur-Header-Handling stolpert auch oft: Manche Provider fügen Prefixes wie sha256= hinzu oder senden mehrere Signaturen. Fix: parse den Header bewusst, wähle den richtigen Wert aus und match den Algorithmus des Providers (sha1 vs sha256).

Eine Sicherheits-Falle: Verifikationsfehler als „wahrscheinlich in Ordnung“ behandeln. Timeouts, malformed Headers, Decode-Fehler und fehlende Felder sollten harte Fehler sein, nicht weiche Passes. Fix: fail closed, gib ein klares 4xx zurück und logge einen Reason-Bucket.

Sicher das alte Secret entfernen und Security verschärfen

Sobald dein Überlappungsfenster vorbei ist und das neue Secret konstant validiert, entferne das alte Secret aus der Konfiguration. Es „nur für den Fall“ zu belassen erhöht stillschweigend die Angriffsfläche und erschwert es zu wissen, was du wirklich validierst.

Bevor du etwas löschst, bestätige ein sauberes Erfolgssignal: ein vollständiger Business-Zyklus ohne unerwartete Signaturfehler und ohne unerklärte Fallbacks auf das alte Secret.

Eine sichere Reihenfolge:

  • hör auf, das alte Secret zu akzeptieren (entferne es aus der Dual-Verifikation oder deaktiviere es per Feature-Flag)
  • entferne das alte Secret aus deinem Secret-Store und der Laufzeitkonfiguration
  • überprüfe, wo das Secret geleakt sein könnte (alte CI-Logs, Debug-Dumps, geteilte Vault-Tokens)
  • schränke Berechtigungen ein, sodass nur wenige Owners Secrets lesen oder ändern können
  • dokumentiere das Runbook: Owner, genaue Schritte, Erfolgskriterien, Rollback-Schritte und wo in den Logs nachzusehen ist

Wenn du vermutest, dass das Secret exponiert wurde (Repo-History, Screenshots, Vendor-Support-Tickets), rotiere sofort, auch wenn das Projekt noch läuft.

Dokumentiere außerdem, wo die Signaturverifikation im Code lebt: die genaue Modul-/Funktions-Location, wie der Rohkörper erfasst wird (ein häufiger Fehlerpunkt) und welche Header genutzt werden.

Schnelle Checkliste für eine stressfreie Rotation

Behandle Rotation wie eine kleine Migration: overlap, messen, dann entfernen.

Bevor du irgendetwas wechselst

  • Deploy den Empfänger-Code, der beide Signaturen akzeptiert (alt und neu).
  • Füge Dashboards für Pass-Rate, Fail-Rate und Validierungen nach Secret-Version hinzu.
  • Bestätige, dass du das Sender-Secret schnell ändern kannst und einen Rollback-Schalter hast.

Während des Cutovers

  • Deploy zuerst die Dual-Verifikation beim Empfänger, dann wechsle den Sender.
  • Beobachte ungültige Signaturen in den ersten Minuten und erneut nach deinem normalen Retry-Fenster.
  • Halte Logs sicher: Event-Typ, Timestamp, Sender-ID und welches Secret validierte. Logge keine rohen Payloads, rohen Signaturen oder Secrets.

Nach dem Wechsel

  • Warte lange genug, damit Retries und verzögerte Zustellungen durchlaufen (oft mindestens ein volles Retry-Fenster, manchmal 24 Stunden).
  • Wenn die Charts für dein volles Fenster keine alten-Secret-Validierungen mehr zeigen, lösche das alte Secret.
  • Schreibe eine kurze Audit-Notiz: wann rotiert wurde, wer es genehmigt hat, was du überwacht hast und wann das alte Secret entfernt wurde.

Realistisches Beispiel: Rotation eines Payment-Webhook-Secrets

Einen AI-Prototypen retten
Wenn deine App von Lovable, Bolt, v0, Cursor oder Replit stammt, können wir sie stabilisieren.

Eine kleine SaaS-App nimmt Kartenzahlungen an und empfängt payment.succeeded-Events von ihrem Payment-Provider. Das Team plant ein kurzes Überlappungsfenster, in dem der Empfänger Signaturen von alt und neu akzeptiert.

Am Montagmorgen deployen sie Empfänger v2 mit Dual-Signatur-Verifikation. Beim Provider ändert sich noch nichts. In der ersten Stunde validieren fast alle Requests mit dem alten Secret, der Zähler für das neue Secret bleibt nahe null (erwartet).

Nach dem Mittagessen aktualisieren sie den Provider, damit er mit dem neuen Secret signiert. Innerhalb von Minuten drehen die Graphen: valid_new steigt, valid_old fällt langsam (wegen noch laufender Retries) und invalid_both bleibt stabil. Das ist das zentrale Erfolgssignal.

Sie behalten Logs und Zähler, die eine Frage schnell beantworten: was ist mit diesem Event passiert?

webhook_received event=payment.succeeded valid=old request_id=8f2...
webhook_received event=payment.succeeded valid=new request_id=912...
webhook_received event=payment.succeeded valid=none reason=signature_mismatch request_id=aa1...
metrics: valid_old=120 valid_new=118 invalid_both=0

Dann tritt ein Bug auf: invalid_both schießt direkt nach einem Framework-Update in die Höhe. Dass beide Secrets gleichzeitig fehlschlagen, deutet stark darauf hin, dass die App die falschen Bytes verifiziert (Body-Parsing oder Encoding-Änderungen). Sie beheben den Code so, dass gegen die rohe Payload validiert wird, deployen neu und der Spike verschwindet.

Am nächsten Tag, nach einer ruhigen Phase, entfernen sie das alte Secret und behalten Alarme für Signaturfehler bei.

Nächste Schritte, wenn dein Webhook-Code unzuverlässig ist

Wenn du versuchst, ohne Ausfall zu rotieren und der Empfänger echte Requests weiterhin ablehnt, behandle es nicht als Rotationsproblem, sondern als Verifikationsproblem.

Beginne damit, den Rohkörper-Pfad zu härten. Die meisten Signatur-Bugs entstehen, weil die Payload vor der HMAC-Berechnung verändert wird (JSON-Parsing und Re-Serialization, Leerzeichen-Änderungen, Encoding). Verifiziere gegen die exakten Bytes, dann parse erst danach.

Füge eine kleine Menge automatisierter Tests hinzu, die reale Produktionsfehler abdecken:

  • gültige Signatur mit dem exakten rohen Request-Body (sollte passen)
  • ein Byte geändert im Body (sollte fehlschlagen)
  • falsches Secret (sollte fehlschlagen)
  • fehlender Signatur-Header (sollte mit klarem Log fehlschlagen)
  • mehrere Signaturwerte (sollte den richtigen wählen oder vorhersehbar fehlschlagen)

Vor dem Produktionslauf mache einen Staging-Dry-Run mit denselben Schritten, die du in echt verwenden wirst: Dual-Verifikation aktivieren, Webhooks mit altem und neuem Secret senden und bestätigen, dass Logs und Alarme sich wie erwartet verhalten.

Wenn dein Webhook-Handler von Tools wie Lovable, Bolt, v0, Cursor oder Replit generiert wurde und unter Retries oder Rotationen seltsam reagiert, kann eine fokussierte Review dir viel Incident-Schmerz ersparen. FixMyMess (fixmymess.ai) macht Codebasis-Diagnosen und Reparaturen für AI-generierte Apps, inklusive Signaturvalidierung, sicheres Logging und Deployment-Vorbereitung.

Häufige Fragen

How do I rotate a webhook secret without breaking deliveries?

Verwende ein Überlappungsfenster, in dem dein Empfänger Signaturen akzeptiert, die mit entweder dem alten oder dem neuen Secret erstellt wurden. Rolle die Dual-Verifikation zuerst aus, wechsle danach den Provider und entferne das alte Secret erst, wenn Retries abgebaut sind und fast alle Validierungen das neue Secret nutzen.

Why does “just changing the secret” cause webhook failures?

Weil Sender und Empfänger selten exakt gleichzeitig wechseln. Provider können Änderungen schrittweise ausrollen, deine Server deployen über Minuten und verzögerte Retries können später mit dem alten Secret ankommen – ein einfacher Flip auf nur ein Secret führt daher zu echten Validierungsfehlern.

What does webhook “downtime” look like during secret rotation?

Die Verifikation schlägt fehl und dein Handler behandelt das wie Manipulation. Der Provider wird meist erneut senden, aber du kannst trotzdem verzögerte Verarbeitung, Retry-Stürme, Rate-Limits und Duplikate sehen, wenn dein Handler nicht idempotent ist – das wirkt wie Ausfall, obwohl der Server läuft.

Should I verify the signature on parsed JSON or the raw request body?

Verifiziere die HMAC gegen die exakten rohen Request-Body-Bytes, die du erhalten hast, bevor du JSON parst oder neu serialisierst. Erstes Parsen ändert oft Leerzeichen, Key-Reihenfolge oder Encoding und verändert so das Signatur-Ergebnis.

During the overlap, should I try the new secret first or the old one?

Standardmäßig neu zuerst, dann alt versuchen und protokollieren, welches Secret erfolgreich war. So bleibst du in Richtung der geplanten Migration, nimmst aber noch späte Retries an.

How long should I accept both secrets during rotation?

Länger als deine schlimmste Verzögerung: Provider-Retries, interne Queue-Delays und manuelle Replays. Ein gängiger Richtwert sind 24–72 Stunden, aber die praktische Regel ist: entferne das alte Secret erst, wenn Validierungen mit dem alten Secret für das volle von dir gewählte Fenster auf null gefallen sind.

What should I monitor while rotating webhook secrets?

Tracke alle empfangenen Webhooks, Signatur-Fehler insgesamt und die Aufteilung erfolgreicher Validierungen nach Secret (new vs old). Beobachte außerdem Receiver-4xx/5xx-Raten, Lieferlatenz und Retry-Volumen, damit Validierungsfehler sichtbar werden, bevor Kunden betroffen sind.

What’s safe and useful to log for signature verification issues?

Logge eine Request- oder Event-ID, eine kleine Reason-Bucket (missing header, timestamp out of range, body read error, HMAC mismatch) und ob die Validierung via new oder old erfolgte. Vermeide, rohe Secrets, rohe Signaturen oder komplette Payloads zu loggen, wenn sie sensitive Daten enthalten könnten.

What’s the safest rollback plan if signature failures spike?

Rolle die Dual-Verifikation zuerst auf dem Empfänger aus und behalte sie bei. Wenn Fehler nach dem Sender-Wechsel steigen, rolle das Sender-/Provider-Secret zurück, das ist meist die schnellste Ein-Schritt-Rollback-Option, während du Parsing-, Header- oder Timestamp-Probleme untersuchst.

What are the most common bugs that cause “invalid signature” during rotation?

Klassische Fehler sind: den Body zweimal lesen (zweiter Read ist leer), Verifikation nachdem Middleware den Body verändert hat, fehlerhafte Header-Verarbeitung mit Prefixes oder mehreren Werten, das falsche Environment-Secret nutzen und keine konstante Zeitvergleichsfunktion verwenden. Behebe es durch Buffering des Rohkörpers, bewusstes Header-Parsing, Verifizieren vor dem Parsen und hartes Fail-Closed-Verhalten mit konsistenten 4xx-Antworten.