Definición
HTTP Message Signatures (o HTTP Signature) es un estándar IETF finalizado en la RFC 9421 (febrero de 2024) para firmar peticiones y respuestas HTTP.
Aporta integridad y autenticidad a nivel de aplicación como complemento de TLS: aunque TLS protege el transporte, la firma demuestra que un mensaje HTTP concreto fue emitido por un actor identificado, sin modificación. Es el estándar de referencia en la RTS-SCA de la PSD2, donde los TPP firman sus peticiones de API con un QSealC (eIDAS), al igual que del lado del Berlin Group y de STET.
Antes de la RFC 9421, el sector usaba el antiguo borrador Cavage (draft-cavage-http-signatures), parecido pero no definitivo; la RFC 9421 lo moderniza (labels, structured fields, Content-Digest).
Por qué HTTP Signature
TLS protege entre los dos endpoints, pero no más allá: una petición interceptada por un proxy, registrada en un log, reproducida o modificada fuera del túnel ya no ofrece ninguna garantía. La firma a nivel de aplicación:
- protege frente a modificaciones intermedias;
- garantiza el no repudio (es imposible negar haber enviado un mensaje firmado);
- sobrevive a proxies, cachés y volcados de logs;
- permite una verificación asíncrona (auditoría, replay, depuración).
Es el equivalente de PAdES para el PDF, pero aplicado a las API HTTP.
Estructura de una petición firmada (RFC 9421)
POST /payments HTTP/1.1
Host: api.bank.fr
Content-Type: application/json
Content-Length: 423
Date: Sat, 19 Apr 2026 10:30:00 GMT
Content-Digest: sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
Signature-Input: sig1=("@method" "@target-uri" "host" "date" "content-digest");\
alg="rsa-pss-sha512";\
keyid="qsealc-key-1";\
created=1714000000
Signature: sig1=:VXYZ12345...base64...:
{ "instructed_amount": { "currency": "EUR", "amount": "100.00" }, ... }Los componentes: Content-Digest (hash SHA-256 del cuerpo), Signature-Input (lo que se firma: método, URI, cabeceras, más alg, keyid, timestamp) y Signature (la firma en base64). Algoritmos recomendados: rsa-pss-sha512 (FAPI / PSD2), ecdsa-p256-sha256 (móvil), ed25519.
El flujo PSD2 + QSealC
El QSealC (Qualified Seal Certificate, eIDAS) sirve para firmar un mensaje en nombre de una persona jurídica (el TPP). El TPP firma con su clave privada, el ASPSP verifica la firma y la cadena de confianza (QSealC → TSP cualificado → EU LOTL) y luego coteja el registro de la EBA para asegurarse de que el TPP tiene efectivamente el rol requerido.
RFC 9421 vs borrador Cavage
| Aspecto | Cavage (antes de 2024) | RFC 9421 (2024+) |
|---|---|---|
| Estatus | Borrador IETF | RFC estable |
| Nomenclatura | (request-target), (created) | @method, @target-uri |
| Multifirmas | Difícil | Nativa (labels) |
| Structured fields | No | Sí (RFC 8941) |
| Digest | Cabecera Digest (RFC 3230) | Content-Digest (RFC 9530) |
| Adopción UE PSD2 | Cavage | Migración hacia la 9421 en curso |
Casos de uso
- PSD2 / Open Banking: firma de las peticiones TPP → ASPSP (PIS, AIS, CBPII) y, a veces, de las respuestas.
- eHealth: firma entre actores sanitarios (DMP, Mon espace santé).
- Webhooks: Stripe, GitHub y Slack firman sus webhooks (HMAC o un enfoque similar a la RFC 9421).
- Marketplaces de API B2B: Apigee y Kong admiten HTTP Signature para una autenticación reforzada.
Lo que HTTP Signature no es
- No es un sustituto de TLS: es un complemento a nivel de aplicación; TLS sigue siendo obligatorio.
- No es cifrado: es firma (integridad + autenticidad); para la confidencialidad, véase JWE.
- No es obligatoria para OAuth: los access tokens funcionan sin ella, pero FAPI 2.0 las combina.
- No es mTLS: mTLS autentica el canal, HTTP Signature el mensaje — complementarios.
- No es un formato universal: la variante Cavage sigue muy presente.
En el ecosistema PSD2 / Open Finance
HTTP Signature + QSealC es el enfoque europeo de la seguridad de API de la PSD2:
- Berlin Group: exige las cabeceras
Signature+Digest, a menudo en estilo Cavage. - STET: firma + digest +
X-Request-ID. - OBIE UK: usa una JWT detached signature (distinta, mismo espíritu).
- PSD3 / FIDA: deberían estandarizarse sobre la RFC 9421 con QSealC y converger hacia FAPI 2.0.
Ejemplos concretos
- Bridge: firma sus peticiones a los bancos FR con QSealC (estilo Cavage, en migración a la RFC 9421).
- Fintecture: firma sus peticiones de PIS a BNP, SG, BPCE.
- Tink: firma en la UE y el Reino Unido (perfil doble).
- Webhooks de Stripe:
Stripe-Signature: t=...,v1=hmac_sha256_hash. - Webhooks de GitHub:
X-Hub-Signature-256: sha256=...(HMAC). - Herramientas:
http-message-signatures(Python, Node), plugins de Apigee, Kong, Tyk. - Migración: los ASPSP europeos migran a la RFC 9421 a lo largo de 2025-2027, manteniendo Cavage en paralelo.
- Coste: para un TPP, la integración lleva unas semanas, pero la gestión de las claves QSealC (HSM) es el principal reto operativo.