Aller au contenu principal

3.2. Vérification d'une signature (Verifying a Signature)

3.2. Vérification d'une signature

La vérification d'une signature de message HTTP est un processus dont l'entrée est le contexte de signature (y compris le message cible, en particulier ses champs Signature et Signature-Input) et les exigences de l'application. La sortie de la vérification est soit une vérification positive, soit une erreur.

Pour vérifier une signature, un vérificateur DOIT appliquer l'algorithme suivant:

  1. Analyser les champs Signature et Signature-Input comme aux Sections 4.1 et 4.2, et extraire les signatures à vérifier et leurs étiquettes.

    1.1. S'il y a plus d'une valeur de signature, déterminer quelle signature traiter pour ce message selon la politique et la configuration du vérificateur. Si aucune signature applicable n'est trouvée, produire une erreur.

    1.2. Si la valeur du champ Signature choisie n'a pas de valeur de champ Signature-Input correspondante (c'est-à-dire avec la même étiquette), produire une erreur.

  2. Analyser les valeurs du champ Signature-Input choisi comme Inner List paramétrée pour obtenir la liste ordonnée des composants couverts et les paramètres de signature de la signature à vérifier.

  3. Analyser la valeur du champ Signature correspondant pour obtenir le tableau d'octets de la signature à vérifier.

  4. Examiner les paramètres de signature pour confirmer que la signature satisfait aux exigences décrites dans ce document, ainsi qu'à toute exigence supplémentaire définie par l'application, telles que les composants de message devant obligatoirement être couverts par la signature (Section 3.2.1).

  5. Déterminer le matériel de clé de vérification pour cette signature. Si le matériel de clé est connu par des moyens externes tels qu'une configuration statique ou une négociation de protocole externe, le vérificateur emploie la technique applicable pour obtenir le matériel de clé à partir de cette connaissance. Si la clé est identifiée dans les paramètres de signature, le vérificateur déréférence l'identifiant de clé vers le matériel de clé approprié pour la signature. Le vérificateur doit apprécier la fiabilité du matériel de clé pour le contexte dans lequel la signature est présentée. Si une clé est identifiée que le vérificateur ne connaît pas ou n'approuve pas pour cette requête, ou qui ne correspond pas à une configuration préalable, la vérification DOIT échouer.

  6. Déterminer l'algorithme à appliquer pour la vérification:

    6.1. Partir de l'ensemble des algorithmes autorisés connu de l'application. Si l'une des étapes suivantes sélectionne un algorithme hors de cet ensemble, la validation de la signature échoue.

    6.2. Si l'algorithme est connu par des moyens externes tels qu'une configuration statique ou une négociation de protocole externe, le vérificateur emploie cet algorithme.

    6.3. Si l'algorithme peut être déterminé à partir du matériel de clé, par exemple via un champ d'algorithme sur la valeur de clé elle-même, le vérificateur emploie cet algorithme.

    6.4. Si l'algorithme est indiqué explicitement dans les paramètres de signature par une valeur du registre « HTTP Signature Algorithms », le vérificateur emploie l'algorithme référencé.

    6.5. Si l'algorithme est spécifié à plusieurs endroits (par ex. combinaison de configuration statique, paramètre de signature alg, et matériel de clé lui-même), les algorithmes résolus DOIVENT être identiques. S'ils diffèrent, le vérificateur DOIT faire échouer la vérification.

  7. À partir du message HTTP reçu et des paramètres de signature analysés, recréer la base de signature selon l'algorithme de la Section 2.5. La valeur d'entrée @signature-params est la valeur du champ Signature-Input pour cette signature sérialisée selon les règles de la Section 2.3. Notez que cela n'inclut pas l'étiquette de la signature du champ Signature-Input.

  8. Si le matériel de clé convient à l'algorithme, appliquer l'algorithme de vérification cryptographique HTTP_VERIFY approprié à la signature, à la base de signature recalculée, au matériel de clé et à la valeur de signature. La primitive HTTP_VERIFY et plusieurs algorithmes concrets sont définis à la Section 3.3.

  9. Les résultats de la fonction d'algorithme de vérification sont les résultats finaux de la fonction de vérification cryptographique.

Si l'une des étapes ci-dessus échoue ou produit une erreur, la validation de la signature échoue.

Par exemple, la vérification de la signature d'étiquette sig1 du message suivant avec la clé test-key-rsa-pss (voir Annexe B.1.2) et l'algorithme RSASSA-PSS de la Section 3.3.1:

NOTE: retour à la ligne '' selon la RFC 8792

POST /foo?param=Value&Pet=dog HTTP/1.1 Host: example.com Date: Tue, 20 Apr 2021 02:07:55 GMT Content-Type: application/json Content-Digest: sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+T
aPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==: Content-Length: 18 Signature-Input: sig1=("@method" "@authority" "@path"
"content-digest" "content-length" "content-type")
;created=1618884473;keyid="test-key-rsa-pss" Signature: sig1=:HIbjHC5rS0BYaa9v4QfD4193TORw7u9edguPh0AW3dMq9WImrl
FrCGUDih47vAxi4L2YRZ3XMJc1uOKk/J0ZmZ+wcta4nKIgBkKq0rM9hs3CQyxXGxH
LMCy8uqK488o+9jrptQ+xFPHK7a9sRL1IXNaagCNN3ZxJsYapFj+JXbmaI5rtAdSf
SvzPuBCh+ARHBmWuNo1UzVVdHXrl8ePL4cccqlazIJdC4QEjrF+Sn4IxBQzTZsL9y
9TP5FsZYzHvDqbInkTNigBcE9cKOYNFCn4D/WM7F6TNuZO9EgtzepLWcjTymlHzK7
aXq6Am6sfOrpIC49yXjj3ae6HRalVc/g==:

{"hello": "world"}

Avec les exigences supplémentaires qu'au minimum les entrées method, authority, path, content-digest, content-length et content-type soient signées, et que l'horodatage de création de la signature soit suffisamment récent au moment de la vérification, la vérification réussit.