B.4. Transformations de messages HTTP
B.4. Transformations de messages HTTP
HTTP permet aux intermédiaires et aux applications de transformer un message HTTP sans altérer la sémantique du message lui-même. Les signatures de messages HTTP sont conçues pour résister à nombre de ces transformations selon les circonstances.
Par exemple, la requête HTTP suivante a été signée avec l'algorithme Ed25519 et la clé test-key-ed25519 :
NOTE: '' line wrapping per RFC 8792
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.org
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: application/json
Accept: /
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
La chaîne de base de signature pour ce message est :
"@method": GET
"@path": /demo
"@authority": example.org
"accept": application/json, /
"@signature-params": ("@method" "@path" "@authority" "accept")
;created=1618884473;keyid="test-key-ed25519"
Le message suivant a été modifié par l'ajout du champ d'en-tête Accept-Language ainsi que d'un paramètre de requête. Toutefois, comme le champ Accept-Language et la composante query ne font pas partie des composants couverts par la signature, la même signature reste valide :
NOTE: '' line wrapping per RFC 8792
GET /demo?name1=Value1&Name2=value2¶m=added HTTP/1.1
Host: example.org
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: application/json
Accept: /
Accept-Language: en-US,en;q=0.5
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
Le message suivant a été modifié en supprimant le champ d'en-tête Date, en ajoutant un champ Referer et en fusionnant le champ Accept sur une seule ligne. Les champs Date et Referer ne sont pas couverts par la signature, et la fusion du champ Accept est une transformation autorisée déjà prise en compte par l'algorithme de canonisation des valeurs de champs HTTP. La même signature reste valide :
NOTE: '' line wrapping per RFC 8792
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.org
Referer: https://developer.example.org/demo
Accept: application/json, /
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
Le message suivant a été modifié en réordonnant les valeurs de champs du message d'origine sans réordonner les occurrences individuelles du champ Accept. La même signature reste valide :
NOTE: '' line wrapping per RFC 8792
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Accept: application/json
Accept: /
Date: Fri, 15 Jul 2022 14:24:55 GMT
Host: example.org
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
Le message suivant a été modifié en passant la méthode à POST et l'autorité à « example.com » (dans le champ d'en-tête Host). Comme la méthode et l'autorité sont toutes deux couvertes par la signature, la même signature n'est PLUS valide :
NOTE: '' line wrapping per RFC 8792
POST /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.com
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: application/json
Accept: /
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
Le message suivant a été modifié en inversant l'ordre des deux occurrences du champ d'en-tête Accept. Comme l'ordre des champs portant le même nom est sémantiquement significatif en HTTP, cela modifie la valeur utilisée dans la base de signature, et la même signature n'est PLUS valide :
NOTE: '' line wrapping per RFC 8792
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.org
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: /
Accept: application/json
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==: