3.1. Creazione di una firma (Creating a Signature)
3.1. Creazione di una firma (Creating a Signature)
La creazione di una firma del messaggio HTTP è un processo che ha come input il contesto della firma (incluso il messaggio di destinazione) e i requisiti dell'applicazione. L'output è un valore di firma e un insieme di parametri di firma che possono essere comunicati al verificatore aggiungendoli al messaggio.
Per creare una firma, un firmatario DEVE applicare il seguente algoritmo:
-
Il firmatario sceglie un algoritmo di firma HTTP e il materiale di chiave per la firma dall'insieme di algoritmi di firma potenziali. L'insieme di algoritmi potenziali è determinato dall'applicazione ed è fuori dall'ambito di questo documento. Il firmatario DEVE scegliere materiale di chiave appropriato per l'algoritmo della firma e conforme a eventuali requisiti definiti dall'algoritmo, come dimensione o formato della chiave. Il meccanismo con cui il firmatario sceglie l'algoritmo e il materiale di chiave è fuori dall'ambito di questo documento.
-
Il firmatario imposta l'istante di creazione della firma sull'ora corrente.
-
Se applicabile, il firmatario imposta la proprietà di scadenza della firma sull'istante in cui la firma deve scadere. La scadenza è un suggerimento al verificatore, che esprime l'istante in cui il firmatario non è più disposto a garantire la firma. Una lunghezza di scadenza appropriata e i requisiti di elaborazione di questo parametro sono specifici dell'applicazione.
-
Il firmatario crea un insieme ordinato di identificatori di componente che rappresentano i componenti del messaggio da coprire con la firma e associa parametri di metadati della firma a questo insieme. Il valore serializzato di questo insieme è usato in seguito come valore del campo Signature-Input come descritto nella Sezione 4.1.
-
Una volta scelto un ordine dei componenti coperti, l'ordine NON DEVE cambiare per tutta la vita della firma.
-
Ogni identificatore di componente coperto DEVE essere (1) un campo HTTP (Sezione 2.1) nel contesto della firma oppure (2) un componente derivato elencato nella Sezione 2.2 o nel registro "HTTP Signature Derived Component Names".
-
I firmatari di una richiesta DOVREBBERO includere alcuni o tutti i dati di controllo del messaggio nei componenti coperti, come @method, @authority, @target-uri o una combinazione di essi.
-
I firmatari DOVREBBERO includere il parametro di metadati della firma created per indicare quando la firma è stata creata.
-
L'identificatore di componente derivato @signature-params NON DEVE essere presente nell'elenco degli identificatori di componenti coperti. Il componente derivato è richiesto per essere sempre l'ultima riga nella base della firma, garantendo che una firma copra sempre i propri metadati e che i metadati non possano essere sostituiti.
-
Ulteriori indicazioni su cosa includere in questo insieme e in quale ordine sono fuori dall'ambito di questo documento.
-
-
Il firmatario crea la base della firma usando questi parametri e l'algoritmo di creazione della base della firma (Sezione 2.5).
-
Il firmatario usa la primitiva HTTP_SIGN per firmare la base della firma con l'algoritmo di firma scelto usando il materiale di chiave scelto dal firmatario. La primitiva HTTP_SIGN e diverse applicazioni concrete degli algoritmi di firma sono definite nella Sezione 3.3.
-
L'array di byte in output dalla funzione di firma è il valore di output della firma del messaggio HTTP da includere nel campo Signature come definito nella Sezione 4.2.
Ad esempio, dati il messaggio HTTP e i parametri di firma nell'esempio nella Sezione 2.5, la base della firma di esempio è firmata 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, producendo il seguente valore di output della firma del messaggio, codificato in Base64:
NOTA: a capo con '' secondo RFC 8792
HIbjHC5rS0BYaa9v4QfD4193TORw7u9edguPh0AW3dMq9WImrlFrCGUDih47vAxi4L2
YRZ3XMJc1uOKk/J0ZmZ+wcta4nKIgBkKq0rM9hs3CQyxXGxHLMCy8uqK488o+9jrptQ
+xFPHK7a9sRL1IXNaagCNN3ZxJsYapFj+JXbmaI5rtAdSfSvzPuBCh+ARHBmWuNo1Uz
VVdHXrl8ePL4cccqlazIJdC4QEjrF+Sn4IxBQzTZsL9y9TP5FsZYzHvDqbInkTNigBc
E9cKOYNFCn4D/WM7F6TNuZO9EgtzepLWcjTymlHzK7aXq6Am6sfOrpIC49yXjj3ae6H
RalVc/g==
Figura 2: Valore di firma di esempio non normativo
Si noti che l'algoritmo RSA-PSS usato qui è non deterministico: a ogni esecuzione si ottiene un valore di firma diverso. Il valore qui fornito può essere convalidato rispetto alle chiave indicate, ma non ci si attende che i valori generati di nuovo coincidano con l'esempio. Si veda la Sezione 7.3.5.