Skip to content

[feature] HMAC-SHA256 webhook signature verification (X-KeeperHub-Signature) #58

@B2JK-Industry

Description

@B2JK-Industry

Friction

KeeperHub workflow webhooks today authenticate the caller via Authorization: Bearer wfb_<token>. There's no documented mechanism for a workflow's destination service (when KH itself POSTs to e.g. our executor_callback URL on a future inbound flow) to verify the request actually came from KH and wasn't spoofed. Adapter authors building reverse-direction integrations (KH → SBO3L for status callbacks, audit-trail mirrors, IP-3-style capsule-bound result delivery) have to either:

  1. Trust the source IP / TLS hostname (brittle; doesn't survive reverse proxies)
  2. Reverse-engineer KH's signature scheme from raw HTTP captures (none documented today)

Proposed fix

Document + implement HMAC-SHA256 signature header on every KH-initiated webhook delivery, mirroring the well-trodden Stripe / GitHub / Slack pattern:

X-KeeperHub-Signature: sha256=<hex(hmac_sha256(secret, body))>
X-KeeperHub-Timestamp: 1714478400

The destination registers a shared secret per webhook config in the KH workflow UI. Replay protection via the timestamp + a documented N-second tolerance window (Stripe uses 5 min).

Reference

Context

Filed as part of SBO3L's KeeperHub Builder Feedback round 3 for ETHGlobal Open Agents 2026. Companion to #51 (Idempotency-Key on inbound) — together they define the bidirectional security contract.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions