Webhook-Sicherheit & Zustellung
Webhook-Signaturen verifizieren, Wiederholungsverhalten verstehen und Zustellungsprobleme beheben.
Warum es wichtig ist
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:
- Deployen Sie Ihren Endpunkt so, 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 unternimmt bis zu 5 Versuche, wenn Ihr Endpunkt nicht erreichbar ist oder einen Fehler zurückgibt.
| Versuch | Verhalten |
|---|---|
| 1 | Sofort |
| 2–5 | Polynomiell ansteigende Wartezeiten |
| Einstellung | Wert |
|---|---|
| Verbindungs-Timeout | 10 Sekunden |
| Lese-Timeout | 15 Sekunden |
Eine 2xx-Antwort markiert die Zustellung als abgeschlossen. Jeder andere Statuscode oder ein Timeout markiert sie als fehlerhaft und löst einen Wiederholungsversuch aus.
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 stellt den Webhook auf aktiv.
Zustellungsprotokolle
Jeder Webhook-Endpunkt hat einen Tab Lieferungen, 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 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 |
| 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 |
Kurz-Checkliste
- 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