Passa al contenuto principale

3.2. Verifica di una firma (Verifying a Signature)

3.2. Verifica di una firma (Verifying a Signature)

La verifica di una firma del messaggio HTTP è un processo che ha come input il contesto della firma (incluso il messaggio di destinazione, in particolare i suoi campi Signature e Signature-Input) e i requisiti dell'applicazione. L'output della verifica è una verifica positiva oppure un errore.

Per verificare una firma, un verificatore DEVE applicare il seguente algoritmo:

  1. Analizzare i campi Signature e Signature-Input come descritto nelle Sezioni 4.1 e 4.2 ed estrarre le firme da verificare e le loro etichette.

    1.1. Se è presente più di un valore di firma, determinare quale firma deve essere elaborata per questo messaggio in base alla politica e alla configurazione del verificatore. Se non si trova una firma applicabile, produrre un errore.

    1.2. Se il valore del campo Signature scelto non ha un valore corrispondente del campo Signature-Input (cioè con la stessa etichetta), produrre un errore.

  2. Analizzare i valori del campo Signature-Input scelto come Inner List parametrizzata per ottenere l'elenco ordinato dei componenti coperti e i parametri di firma per la firma da verificare.

  3. Analizzare il valore del campo Signature corrispondente per ottenere l'array di byte del valore della firma da verificare.

  4. Esaminare i parametri di firma per confermare che la firma soddisfa i requisiti descritti in questo documento, nonché eventuali requisiti aggiuntivi definiti dall'applicazione, come quali componenti del messaggio devono essere coperti dalla firma (Sezione 3.2.1).

  5. Determinare il materiale di chiave di verifica per questa firma. Se il materiale di chiave è noto per vie esterne come configurazione statica o negoziazione di protocollo esterna, il verificatore userà la tecnica applicabile per ottenere il materiale di chiave da questa conoscenza esterna. Se la chiave è identificata nei parametri di firma, il verificatore dereferenzierà l'identificatore di chiave al materiale di chiave appropriato da usare con la firma. Il verificatore deve determinare l'affidabilità del materiale di chiave per il contesto in cui la firma è presentata. Se è identificata una chiave che il verificatore non conosce o di cui non si fida per questa richiesta o che non corrisponde a qualcosa di preconfigurato, la verifica DEVE fallire.

  6. Determinare l'algoritmo da applicare per la verifica:

    6.1. Partire dall'insieme di algoritmi consentiti noto all'applicazione. Se uno dei passaggi seguenti seleziona un algoritmo che non è in questo insieme, la convalida della firma fallisce.

    6.2. Se l'algoritmo è noto per vie esterne come configurazione statica o negoziazione di protocollo esterna, il verificatore userà quell'algoritmo.

    6.3. Se l'algoritmo può essere determinato dal materiale di chiave, ad esempio tramite un campo algorithm sul valore della chiave stesso, il verificatore userà quell'algoritmo.

    6.4. Se l'algoritmo è dichiarato esplicitamente nei parametri di firma usando un valore dal registro "HTTP Signature Algorithms", il verificatore userà l'algoritmo referenziato.

    6.5. Se l'algoritmo è specificato in più di una posizione (ad esempio una combinazione di configurazione statica, il parametro di firma algorithm e il materiale di chiave stesso), gli algoritmi risolti DEVONO essere gli stessi. Se gli algoritmi non sono gli stessi, il verificatore DEVE far fallire la verifica.

  7. Usare il messaggio HTTP ricevuto e i parametri di firma analizzati per ricreare la base della firma, usando l'algoritmo definito nella Sezione 2.5. Il valore dell'input @signature-params è il valore del campo Signature-Input per questa firma serializzato secondo le regole descritte nella Sezione 2.3. Si noti che ciò non include l'etichetta della firma dal campo Signature-Input.

  8. Se il materiale di chiave è appropriato per l'algoritmo, applicare l'algoritmo crittografico di verifica HTTP_VERIFY appropriato alla firma, alla base della firma ricalcolata, al materiale di chiave e al valore della firma. La primitiva HTTP_VERIFY e diversi algoritmi concreti sono definiti nella Sezione 3.3.

  9. I risultati della funzione dell'algoritmo di verifica sono i risultati finali della funzione di verifica crittografica.

Se uno dei passaggi sopra fallisce o produce un errore, la convalida della firma fallisce.

Ad esempio, verificando la firma con etichetta sig1 del messaggio seguente con la chiave test-key-rsa-pss (si veda l'Appendice B.1.2) e l'algoritmo RSASSA-PSS descritto nella Sezione 3.3.1:

NOTA: a capo con '' secondo 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"}

Con i requisiti aggiuntivi che almeno metodo, autorità, percorso, content-digest, content-length e content-type siano firmati e che il timestamp di creazione della firma sia sufficientemente recente al momento della verifica, la verifica ha esito positivo.