Passa al contenuto principale

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:

  1. 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.

  2. Il firmatario imposta l'istante di creazione della firma sull'ora corrente.

  3. 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.

  4. 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.

  5. Il firmatario crea la base della firma usando questi parametri e l'algoritmo di creazione della base della firma (Sezione 2.5).

  6. 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.

  7. 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.