Webhook-Sicherheit & Zustellung
Webhook-Signaturen verifizieren, Wiederholungsverhalten verstehen und Zustellungsprobleme beheben.
Warum das zählt
Die Signaturverifizierung beweist, dass Nutzlasten authentisch und unverändert sind. Das Verständnis des Wiederholungs- und automatischen Deaktivierungsverhaltens hilft Ihnen, robuste Integrationen zu erstellen.
Signaturen verifizieren
Jede Zustellung wird mit dem Signiergeheimnis Ihres Endpunkts mittels HMAC-SHA256 signiert. Die Signatur umfasst den Zeitstempel und den Anfragekörper, um Replay-Angriffe zu verhindern.
Der signierte Inhalt besteht aus dem ISO-8601-Zeitstempel und dem JSON-Body, verbunden durch einen Punkt:
<timestamp>.<body>
Ruby
timestamp = request.headers["X-Webhook-Timestamp"]
signature = request.headers["X-Webhook-Signature"]
body = request.body.read
expected = OpenSSL::HMAC.hexdigest("SHA256", signing_secret, "#{timestamp}.#{body}")
if ActiveSupport::SecurityUtils.secure_compare(expected, signature)
# Signature is valid
else
head :unauthorized
end
Node.js
const crypto = require("crypto");
function verifySignature(signingSecret, timestamp, body, signature) {
const expected = crypto
.createHmac("sha256", signingSecret)
.update(`${timestamp}.${body}`)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}
Python
import hmac
import hashlib
def verify_signature(signing_secret, timestamp, body, signature):
expected = hmac.new(
signing_secret.encode(),
f"{timestamp}.{body}".encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
Replay-Angriffe verhindern
Vergleichen Sie X-Webhook-Timestamp mit der aktuellen Uhrzeit und lehnen Sie Anfragen ab, die älter als 5 Minuten sind.
Signiergeheimnis rotieren
Klicken Sie auf Geheimnis rotieren auf der Webhook-Detailseite, um ein neues Signiergeheimnis zu generieren. Das alte Geheimnis wird sofort ungültig.
So rotieren Sie ohne Ausfallzeit:
- Stellen Sie Ihren Endpunkt so bereit, dass er Signaturen sowohl mit dem alten als auch dem neuen Geheimnis akzeptiert
- Rotieren Sie das Geheimnis in Kit
- Überprüfen Sie, ob Zustellungen mit dem neuen Geheimnis erfolgreich sind
- Entfernen Sie das alte Geheimnis aus Ihrem Endpunkt
Zustellung & Wiederholungsversuche
Kit sendet die JSON-Nutzlast per POST an Ihren Endpunkt mit diesen Timeouts:
| Einstellung | Wert |
|---|---|
| Verbindungs-Timeout | 10 Sekunden |
| Lese-Timeout | 15 Sekunden |
Eine 2xx-Antwort markiert die Zustellung als abgeschlossen. Alles andere ist ein Fehler, und wie Kit damit umgeht, hängt davon ab, ob der Fehler vorübergehend oder dauerhaft ist.
Vorübergehende Fehler (mit Wiederholung)
Vorübergehende Fehler sind Probleme, die sich wahrscheinlich von selbst beheben — Ihr Endpunkt war kurzzeitig überlastet, hat ein Timeout erreicht oder war nicht erreichbar. Kit wiederholt diese in bis zu 5 Versuchen mit polynomiellem Backoff (jede Wartezeit länger als die vorherige).
Ein Fehler gilt als vorübergehend, wenn die Antwort eine der folgenden ist:
- HTTP
500–599(Serverfehler) - HTTP
408(Request Timeout) - HTTP
429(Too Many Requests) - Ein Netzwerkfehler oder Timeout (Verbindung abgelehnt, DNS-Fehler, Lese-Timeout)
| Versuch | Verhalten |
|---|---|
| 1 | Sofort |
| 2–5 | Polynomiell ansteigende Wartezeiten |
Dauerhafte Fehler (ohne Wiederholung)
Dauerhafte Fehler zeigen an, dass die Anfrage selbst für Ihren Endpunkt nicht akzeptabel ist und eine Wiederholung nicht hilft. Kit markiert die Zustellung sofort als fehlerhaft und wiederholt sie nicht.
Ein Fehler gilt als dauerhaft, wenn die Antwort ein beliebiger anderer 4xx-Status ist — zum Beispiel 400, 401, 404 oder 410. Wenn Ihr Endpunkt einen dieser Codes versehentlich zurückgibt, korrigieren Sie die Route oder Authentifizierung auf Ihrer Seite; Kit wiederholt erst, wenn das nächste Ereignis ausgelöst wird.
Automatische Deaktivierung
Nach 15 aufeinanderfolgenden fehlgeschlagenen Zustellungen über alle Ereignisse hinweg deaktiviert Kit den Webhook automatisch.
Bei Deaktivierung:
- Es werden keine weiteren Zustellungen versucht
- Der Status wechselt zu Deaktiviert mit einem
disabled_at-Zeitstempel
Klicken Sie auf Fortsetzen, um den Webhook wieder zu aktivieren. Dies setzt den Fehlerzähler zurück und versetzt den Webhook wieder in den aktiven Zustand.
Zustellungsprotokolle
Jeder Webhook-Endpunkt hat einen Tab Zustellungen, der die 50 letzten Zustellungen anzeigt. Jeder Eintrag enthält:
| Feld | Beschreibung |
|---|---|
| Ereignis | Ereignistyp, der die Zustellung ausgelöst hat |
| Status |
pending, in_progress, completed oder errored
|
| Versuche | Anzahl der Zustellungsversuche |
| Anfrage-Header | Mit der Anfrage gesendete Header |
| Antwort | HTTP-Statuscode oder Fehlermeldung |
| Zeitstempel | Zeitpunkt der Erstellung der Zustellung |
Zustellungsstatus
| Status | Bedeutung |
|---|---|
pending |
Erstellt, wartet auf Versand |
in_progress |
Wird gerade zugestellt |
completed |
Endpunkt hat eine 2xx-Antwort zurückgegeben |
errored |
Alle Wiederholungsversuche erschöpft oder Endpunkt hat einen dauerhaften (4xx) Fehler zurückgegeben |
Datenaufbewahrung
Zustellungsprotokolle werden 30 Tage aufbewahrt und danach automatisch gelöscht. Speichern Sie Nutzlasten auf Ihrer Seite, wenn Sie eine längere Aufbewahrung benötigen.
URL-Anforderungen
- HTTPS erforderlich — HTTP-Endpunkte werden abgelehnt
- Nur öffentliche IPs — URLs, die auf private Adressen auflösen (localhost, 10.x.x.x, 192.168.x.x usw.), werden blockiert
- URLs werden bei der Erstellung und vor jeder Zustellung validiert
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Signatur stimmt nicht überein | Falsches Signiergeheimnis oder Body wurde vor der Verifizierung verändert | Verifizieren Sie gegen den rohen Anfragekörper mit dem aktuellen Geheimnis |
| Zustellungen laufen in Timeout | Endpunkt braucht länger als 15 Sekunden | Geben Sie sofort 200 zurück und verarbeiten Sie asynchron |
| Zustellung fehlerhaft ohne Wiederholung | Endpunkt hat einen dauerhaften 4xx zurückgegeben (z. B. 404, 410) |
Korrigieren Sie Route, Authentifizierung oder Methode; nur vorübergehende Fehler (5xx, 408, 429, Netzwerk/Timeout) werden wiederholt |
| Webhook automatisch deaktiviert | 15 aufeinanderfolgende Fehler | Beheben Sie Ihren Endpunkt und klicken Sie dann auf Fortsetzen |
| URL abgelehnt | Private IP oder HTTP-URL | Verwenden Sie eine HTTPS-URL, die auf eine öffentliche IP auflöst |
| Ereignisse werden nicht ausgelöst | Webhook pausiert oder Ereignistyp nicht abonniert | Überprüfen Sie den Webhook-Status und die abonnierten Ereignisse |
Auf einen Blick
- Kopieren Sie Ihr Signiergeheimnis von der Webhook-Detailseite
- Implementieren Sie die HMAC-SHA256-Signaturverifizierung in Ihrem Endpunkt
- Lehnen Sie Anfragen mit Zeitstempeln ab, die älter als 5 Minuten sind
-
Geben Sie innerhalb von 15 Sekunden einen
2xx-Statuscode zurück - Behandeln Sie Wiederholungsversuche idempotent (Sie können dasselbe Ereignis mehr als einmal erhalten)
- Überwachen Sie die Zustellungsprotokolle auf Fehler
- Richten Sie Benachrichtigungen ein, wenn ein Webhook automatisch deaktiviert wird