-
Notifications
You must be signed in to change notification settings - Fork 258
Description
Description
I’m working on the HTTP bindings for UCP and hit an ambiguity around Request-Signature in the Checkout REST spec.
In https://ucp.dev/specification/checkout-rest/ the Request-Signature header is required, but the documentation doesn’t say how the signature is computed or verified (what bytes are signed, what format/alg, how kid/key lookup works, expected failure behavior, etc.). The Shopping REST OpenAPI has the same short description for Request-Signature (no normative details): https://ucp.dev/services/shopping/rest.openapi.json
By contrast, the Order capability has a concrete definition using a detached JWT/JWS (RFC 7797) for webhook signing/verification and also uses Request-Signature: https://ucp.dev/2026-01-23/specification/order/
It feels like Checkout REST probably intended to reuse that same signing scheme, but it’s not stated.
Why this matters
Implementers can’t reliably interop without the “how” here. Right now different clients could sign:
- body only vs body + method/path/headers
- different canonicalization / serialization
- different key selection /
kidconventions
…while still “matching” the current description.
Proposed doc update (minimum)
If the intent is to match the Order capability approach, I think Checkout REST should explicitly say:
Request-Signatureis a detached JWS/JWT per RFC 7797 (same as Order webhook guidance)- what exactly is signed (at minimum: request body)
- required JOSE header params (
kid,alg, etc.) - key discovery/verification: verifier matches
kidto a key in the sender’s publishedsigning_keys - expected error behavior when missing/invalid
Discussion: should HTTP bindings use RFC 9421 instead?
Separately, I’d like to open discussion on using RFC 9421 HTTP Message Signatures for HTTP bindings.
Reason: detached JWS over only the body doesn’t naturally bind the request to method + target URI + important headers. RFC 9421 is designed to sign those HTTP components directly, which avoids replay/endpoint swap issues unless every implementation reinvents “what else to include” on top of a body signature.
If UCP wanted to go this direction, it likely means adopting:
Signature-Input+Signatureheaders (RFC 9421)- a UCP profile: required covered components (e.g.
@method,@target-urior@path+query,content-digest, and any UCP-specific headers) - mapping
keyid/kidto publishedsigning_keys - a migration plan (support both for a window, clarify precedence if both are present)
Questions
- Is Checkout REST intended to use the same RFC 7797 detached JWS/JWT mechanism described in the Order capability?
- If yes: should it be body-only, or should it bind method/path/headers as well (and if so, how)?
- If not: what is the intended on-wire format and verification process for
Request-Signature? - Is the project open to standardizing on RFC 9421 for HTTP bindings, either as a replacement or an option?
References
- Checkout REST spec: https://ucp.dev/specification/checkout-rest/
- Shopping REST OpenAPI: https://ucp.dev/services/shopping/rest.openapi.json
- Order capability signing/verification (RFC 7797): https://ucp.dev/2026-01-23/specification/order/
- RFC 9421 (HTTP Message Signatures): https://www.rfc-editor.org/rfc/rfc9421