

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# AWS Signature Version 4 per richieste API
<a name="reference_sigv"></a>

**Importante**  
Se utilizzi uno strumento AWS SDK (vedi [Codice di esempio e librerie](https://aws.amazon.com/developer/)) o AWS Command Line Interface (AWS CLI) a cui inviare richieste API AWS, puoi saltare il processo di firma, poiché i client SDK e CLI autenticano le tue richieste utilizzando le chiavi di accesso fornite. A meno che tu non abbia una buona ragione per non farlo, ti consigliamo di utilizzare sempre un SDK o una CLI.  
Nelle regioni che supportano più versioni di firma, la firma manuale delle richieste implica che è necessario specificare quale versione della firma utilizzare. Quando si forniscono richieste a punti di accesso multiregionali SDKs e la CLI passa automaticamente all'utilizzo della versione 4A di Signature senza configurazioni aggiuntive.

Le informazioni di autenticazione inviate in una richiesta devono includere una firma. AWS Signature Version 4 (SigV4) è il protocollo di AWS firma per aggiungere informazioni di autenticazione alle richieste AWS API.

Non utilizzare la chiave di accesso segreta per firmare le richieste API. Si utilizza invece il processo di firma SigV4. La firma delle richieste implica:

1. Creazione di una richiesta canonica basata sui dettagli della richiesta.

1. Calcolo di una firma utilizzando le tue credenziali. AWS 

1. L'aggiunta di questa firma alla richiesta come intestazione di autorizzazione.

AWS quindi replica questo processo e verifica la firma, concedendo o negando l'accesso di conseguenza.

Symmetric SigV4 richiede di derivare una chiave destinata a un singolo AWS servizio, in una singola regione, in un determinato giorno. AWS Ciò rende la chiave e la firma calcolata diverse per ogni regione, il che significa che è necessario conoscere la regione a cui è destinata la firma.

Il Signature Version 4 (SigV4A) asimmetrico è un'estensione che supporta la firma con un nuovo algoritmo e la generazione di firme individuali verificabili in più di una regione AWS . Con SigV4a, puoi firmare una richiesta per più regioni, con routing e failover senza interruzioni tra le regioni. Quando si utilizza l' AWS SDK o si richiama una funzionalità che richiede AWS CLI la firma in più regioni, il tipo di firma viene automaticamente modificato per utilizzare SigV4A. Per informazioni dettagliate, vedi [Come funziona AWS SigV4a](#how-sigv4a-works).

## Come funziona SigV4 AWS
<a name="how-aws-signing-works"></a>

La procedura riportata di seguito illustra il processo generale di calcolo di una firma con SigV4:

1. La **stringa da firmare** dipende dal tipo di richiesta. Ad esempio, quando utilizzi l'intestazione dell'autorizzazione HTTP o i parametri della query per l'autenticazione, utilizzi una combinazione di elementi della richiesta per creare la stringa da firmare. Per una richiesta HTTP POST, la policy `POST` nella richiesta è la stringa che firmi.

1. La **chiave di firma** è una serie di calcoli, con il risultato di ogni passaggio inserito nel successivo. Il passaggio finale è la chiave di firma.

1. Quando un AWS servizio riceve una richiesta autenticata, ricrea la **firma** utilizzando le informazioni di autenticazione contenute nella richiesta. Se le firme corrispondono, il servizio elabora la richiesta. In caso contrario, la richiesta viene respinta.

Per ulteriori informazioni, consulta [Elementi della firma di una richiesta AWS API](reference_sigv-signing-elements.md).

## Come funziona AWS SigV4a
<a name="how-sigv4a-works"></a>

SigV4a utilizza firme asimmetriche basate sulla crittografia a chiave pubblica-privata. SigV4a segue un processo di derivazione delle credenziali con ambito simile a quello di SigV4, tranne per il fatto che SigV4a utilizza la stessa chiave per firmare tutte le richieste senza dover derivare una chiave di firma distinta in base alla data, al servizio e alla Regione. Una coppia di chiavi [Elliptic Curve Digital Signature Algorithm](https://csrc.nist.gov/glossary/term/ecdsa) (ECDSA) può essere derivata dalla chiave di accesso segreta esistente. AWS 

Il sistema utilizza la crittografia asimmetrica per verificare le firme multiregionali, quindi AWS deve solo archiviare le chiavi pubbliche. Le chiavi pubbliche non sono segrete e non possono essere utilizzate per firmare le richieste. Le firme asimmetriche sono necessarie per le richieste di API multi-regione, ad esempio con punti di accesso multi-regione di Amazon S3.

La procedura riportata di seguito illustra il processo generale di calcolo di una firma con SigV4a:

1. La **stringa da firmare** dipende dal tipo di richiesta. Ad esempio, quando utilizzi l'intestazione dell'autorizzazione HTTP o i parametri della query per l'autenticazione, utilizzi una combinazione di elementi della richiesta per creare la stringa da firmare. Per una richiesta HTTP POST, la policy `POST` nella richiesta è la stringa che firmi.

1. La **chiave di firma** deriva da una chiave di accesso segreta AWS tramite una serie di calcoli, con il risultato di ogni passaggio inserito nel successivo. Il passaggio finale produce la coppia di chiavi.

1. Quando un AWS servizio riceve una richiesta firmata con SigV4a, AWS verifica la firma utilizzando solo la metà pubblica della coppia di chiavi. Se la firma è valida, la richiesta viene autenticata e il servizio elabora la richiesta. Le richieste con firme non valide vengono rifiutate.

[Per ulteriori informazioni su SigV4A per le richieste API multiregionali, consultate il progetto sigv4 su. a-signing-examples](https://github.com/aws-samples/sigv4a-signing-examples) GitHub

## Quando firmare le richieste
<a name="when-do-you-need-to-sign"></a>

Quando scrivi codice personalizzato che invia richieste API a AWS, devi includere il codice che firma le richieste. Potrebbe essere necessario scrivere codice personalizzato perché:
+ Utilizzi un linguaggio di programmazione per il quale non esiste un SDK AWS .
+ È necessario il controllo completo su come vengono inviate le richieste AWS.

Mentre le richieste API autenticano l'accesso con AWS SigV4 AWS SDKs e le AWS CLI autenticano utilizzando le chiavi di accesso fornite. Per ulteriori informazioni sull'autenticazione con and the, consulta. AWS SDKs AWS CLI[Altre risorse](#reference_aws-signing-resources)

## Perché le richieste vengono firmate
<a name="why-requests-are-signed"></a>

Il processo di firma aiuta a proteggere le richieste, poiché consente di:
+ **Verificare l'identità del richiedente**

  Le richieste autenticate richiedono una firma che hai creato utilizzando le tue chiavi di accesso (ID chiave di accesso, chiave di accesso segreta). Se stai utilizzando credenziali di sicurezza temporanee, i calcoli della firma richiedono anche un token di sicurezza. Per ulteriori informazioni, consulta [AWS  accesso programmatico con credenziali di sicurezza](security-creds-programmatic-access.md).
+ **Proteggere i dati in transito**

  Per evitare che una richiesta venga modificata mentre è in transito, alcuni elementi della richiesta stessa vengono utilizzati per calcolare un hash (digest) e il valore hash risultante è incluso come parte della richiesta. Quando un utente Servizio AWS riceve la richiesta, utilizza le stesse informazioni per calcolare un hash e le confronta con il valore hash della richiesta. Se i valori non corrispondono, AWS nega la richiesta.
+ **Garantire la protezione da possibili attacchi di tipo replay**

  Nella maggior parte dei casi, una richiesta deve pervenire AWS entro cinque minuti dalla data indicata nella richiesta. Altrimenti, AWS nega la richiesta.

AWS SigV4 può essere espresso nell'intestazione di autorizzazione HTTP o come stringa di query nell'URL. Per ulteriori informazioni, consulta [Metodi di autenticazione](reference_sigv-authentication-methods.md).

## Altre risorse
<a name="reference_aws-signing-resources"></a>
+ Per ulteriori informazioni sul processo di firma SigV4 per i diversi servizi, consulta [Richiesta di esempi di firma](reference_sigv-examples.md).
+ Per configurare le credenziali per l'accesso programmatico per la AWS CLI, consulta [Autenticazione e credenziali di accesso nella Guida per l'utente dell'interfaccia](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html) a riga di *AWS comando*.
+  AWS SDKs Includi il codice sorgente GitHub per la firma delle richieste API. AWS Per gli esempi di codice, consulta [Progetti di esempio nell'archivio di AWS esempi](reference_sigv-examples.md#signature-v4-examples-sdk).
  + AWS SDK per .NET — [AWS4Signer.cs](https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs)
  + AWS SDK per C\$1\$1 — [AWSAuthV4Signer.cpp](https://github.com/aws/aws-sdk-cpp/blob/main/src/aws-cpp-sdk-core/source/auth/signer/AWSAuthV4Signer.cpp)
  + AWS SDK per Go — [sigv4.go](https://github.com/aws/smithy-go/blob/a4c9efcda6aa54c75d1a130d1320a2709eebf51d/aws-http-auth/sigv4/sigv4.go)
  + AWS SDK per Java [BaseAws— 4Signer.java](https://github.com/aws/aws-sdk-java-v2/blob/master/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseAws4Signer.java)
  + AWS SDK per JavaScript — [firma-v4](https://github.com/smithy-lang/smithy-typescript/tree/main/packages/signature-v4)
  + AWS SDK per PHP [— SignatureV4.php](https://github.com/aws/aws-sdk-php/blob/master/src/Signature/SignatureV4.php)
  + AWS SDK per Python (Boto) — [signers.py](https://github.com/boto/botocore/blob/develop/botocore/signers.py)
  + AWS SDK per Ruby — [signer.rb](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sigv4/lib/aws-sigv4/signer.rb)

# Elementi della firma di una richiesta AWS API
<a name="reference_sigv-signing-elements"></a>

**Importante**  
A meno che non si utilizzi la AWS SDKs o CLI, è necessario scrivere codice per calcolare le firme che forniscono informazioni di autenticazione nelle richieste. Il calcolo delle AWS firme nella versione 4 di Signature può essere un'impresa complessa e ti consigliamo di utilizzare la AWS SDKs o la CLI ogni volta che è possibile.

Ogni HTTP/HTTPS richiesta che utilizza la firma Signature Version 4 deve contenere questi elementi.

**Topics**
+ [

## Specifica dell'endpoint
](#endpoint-specification)
+ [

## Azione
](#action)
+ [

## Parametri dell'operazione
](#parameters)
+ [

## Data
](#date)
+ [

## Informazioni sull'autenticazione
](#authentication)

## Specifica dell'endpoint
<a name="endpoint-specification"></a>

Specifica il nome DNS dell'endpoint a cui inviare la richiesta. Questo nome di solito contiene il codice del servizio e la regione. Ad esempio, l'endpoint Amazon DynamoDB per la regione `us-east-1` è `dynamodb.us-east-1.amazonaws.com`.

Per le richieste HTTP/1.1 devi includere l'intestazione `Host`. Per le richieste HTTP/2, puoi utilizzare l'intestazione `:authority` o l'intestazione `Host`. Utilizza solo l'intestazione `:authority` per conformità con la specifica HTTP/2. Non tutti i servizi supportano le richieste HTTP/2.

Per gli endpoint supportati da ciascun servizio, consulta [Endpoint e quote del servizio](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) nella *Riferimenti generali di AWS*.

## Azione
<a name="action"></a>

Specifica un'operazione API per il servizio. Ad esempio, l'operazione `CreateTable` di DynamoDB o l'operazione `DescribeInstances` di Amazon EC2.

Per le operazioni supportate da ciascun servizio, consulta la [Guida di riferimento per l'autorizzazione del servizio](https://docs.aws.amazon.com//service-authorization/latest/reference/reference.html).

## Parametri dell'operazione
<a name="parameters"></a>

Specifica i parametri per l'operazione specificata nella richiesta. Ogni azione AWS API ha una serie di parametri obbligatori e opzionali. La versione dell'API di solito è un parametro obbligatorio.

Per i parametri supportati da un'operazione API, consulta la Documentazione di riferimento delle API per il servizio.

## Data
<a name="date"></a>

Specifica la data e l'ora della richiesta. Con la data e l'ora nella richiesta puoi evitare che le terze parti intercettino la tua richiesta e la inviino in un secondo momento. La data specificata nell'ambito delle credenziali deve corrispondere alla data della richiesta.

Il timestamp deve essere in UTC e deve avere il seguente formato ISO 8601: *YYYYMMDD*T*HHMMSS*Z. Ad esempio, `20220830T123600Z`. Non includere i millisecondi nel time stamp.

Si può utilizzare un'intestazione `date`, un'intestazione `x-amz-date` o includere `x-amz-date` come parametro di query. Se non riusciamo a trovare un'intestazione `x-amz-date`, cerchiamo un'intestazione `date`.

## Informazioni sull'autenticazione
<a name="authentication"></a>

Ogni richiesta inviata deve includere le seguenti informazioni. AWS utilizza queste informazioni per garantire la validità e l'autenticità della richiesta.
+ Algoritmo: l’algoritmo utilizzato come parte del processo di firma. 
  + SigV4: utilizza `AWS4-HMAC-SHA256` per specificare Signature Version 4 con l’algoritmo hash `HMAC-SHA256`. 
  + SigV4a: utilizza `AWS4-ECDSA-P256-SHA256` per specificare l’algoritmo hash `ECDSA-P256-SHA-256`.
+ Credenziale: una stringa che è formata concatenando i componenti ID chiave di accesso e ambito delle credenziali.
  + SigV4: l’ambito delle credenziali include l’ID della chiave di accesso, la data in formato *AAAAMMGG*, il codice della Regione, il codice del servizio e la stringa di chiusura `aws4_request`, separati da barre (/). Devi utilizzare caratteri minuscoli per la regione, il codice del servizio e la stringa di chiusura.

    ```
    AKIAIOSFODNN7EXAMPLE/YYYYMMDD/region/service/aws4_request
    ```
  + SigV4a: l’ambito delle credenziali include la data in formato AAAAMMGG, il nome del servizio e la stringa di chiusura `aws4_request`, separati da barre (/). Ricorda che l’ambito delle credenziali non include la Regione, poiché è indicata in un’intestazione separata `X-Amz-Region-Set`.

    ```
    AKIAIOSFODNN7EXAMPLE/YYYYMMDD/service/aws4_request
    ```
+ Intestazioni firmate: le intestazioni HTTP da includere nella firma, separate da punto e virgola (;). Ad esempio, `host;x-amz-date`.

  Per SigV4a, è necessario includere un’intestazione dell’insieme di Regioni che specifichi l’insieme delle Regioni in cui la richiesta sarà valida. L’intestazione `X-Amz-Region-Set` è specificata come un elenco di valori separati da virgole. L’esempio seguente mostra un’intestazione di Regione che consente di effettuare una richiesta sia nella Regione us-east-1 sia in us-west-1.

  ```
  X-Amz-Region-Set=us-east-1,us-west-1
  ```

  È possibile utilizzare i caratteri jolly (\$1) nelle Regioni per specificare più Regioni. Nell’esempio seguente, l’intestazione consente di effettuare una richiesta sia in us-west-1 sia in us-west-2.

  ```
  X-Amz-Region-Set=us-west-*
  ```
+ Firma: una stringa con codifica esadecimale che rappresenta la firma calcolata. Devi calcolare la firma utilizzando l'algoritmo specificato nel parametro `Algorithm`. 

Per ulteriori informazioni, consulta [Metodi di autenticazione](reference_sigv-authentication-methods.md)

# Metodi di autenticazione
<a name="reference_sigv-authentication-methods"></a>

**Importante**  
A meno che non si utilizzi la AWS SDKs o CLI, è necessario scrivere codice per calcolare le firme che forniscono informazioni di autenticazione nelle richieste. Il calcolo delle AWS firme nella versione 4 di Signature può essere un'impresa complessa e ti consigliamo di utilizzare la AWS SDKs o la CLI ogni volta che è possibile.

Puoi esprimere le informazioni di autenticazione utilizzando uno dei seguenti metodi.

## Intestazione HTTP di autorizzazione
<a name="aws-signing-authentication-methods-http"></a>

L'intestazione `Authorization` HTTP è il metodo più comune per autenticare una richiesta. Tutte le operazioni del REST API (ad eccezione dei caricamenti basati su browser che utilizzano richieste `POST`) richiedono questa intestazione.

Gli esempi seguenti mostrano il valore dell’intestazione `Authorization` per SigV4 e SigV4a. Le interruzioni di riga vengono aggiunte a questo esempio solo per migliorare la leggibilità. Nel tuo codice, l'intestazione deve essere una stringa continua. Non c'è una virgola tra l'algoritmo e le credenziali, ma gli altri elementi devono essere separati da virgole.

**Example SigV4**  

```
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date, 
Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
```

**Example SigV4a**  

```
Authorization: AWS4-ECDSA-P256-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date;x-amz-region-set,
Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
```

La tabella seguente descrive i vari componenti del valore dell'intestazione di autorizzazione nell'esempio precedente:


| Componente | Description | 
| --- | --- | 
|  Autorizzazione  | L'algoritmo utilizzato per calcolare la firma. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/IAM/latest/UserGuide/reference_sigv-authentication-methods.html)  | 
|  Credential  |  L’ID della chiave di accesso e le informazioni sull’ambito. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) Il valore <date> è specificato utilizzando il formato AAAAMMGG. Il valore <aws-service> è S3 quando si invia una richiesta ad Amazon S3.  | 
|  SignedHeaders  |   Un elenco separato da punto e virgola delle intestazioni di richiesta che hai utilizzato per il calcolo della firma. L'elenco include solo i nomi delle intestazioni e i nomi delle intestazioni devono essere in minuscolo. Ad esempio: `host;range;x-amz-date` Per SigV4a, è necessario includere un’intestazione dell’insieme di Regioni che specifichi l’insieme delle Regioni in cui la richiesta sarà valida. L’intestazione X-Amz-Region-Set è specificata come un elenco di valori separati da virgole.  | 
|  Firma  |  La firma a 256 bit espressa come 64 caratteri esadecimali minuscoli. Ad esempio:`fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024` Tieni presente che i calcoli della firma variano a seconda dell'opzione scelta per trasferire il payload.  | 

## Parametri della stringa di query
<a name="aws-signing-authentication-methods-query"></a>

È possibile utilizzare una stringa di query per esprimere una richiesta interamente in un URL. In questo caso, utilizzi i parametri di interrogazione per fornire le informazioni sulla richiesta, incluse le informazioni di autenticazione. Poiché la firma richiesta è parte dell'URL, questo tipo di URL viene chiamato URL pre-firmato. Puoi usare presigned URLs per incorporare link cliccabili in HTML, che possono essere validi per un massimo di sette giorni. Per ulteriori informazioni, consulta [Autenticazione delle richieste: utilizzo dei parametri di interrogazione (AWS Signature versione 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) nel riferimento all'API *Amazon S3*.

Gli esempi seguenti mostrano presigned URLs per SigV4 e SigV4a. Le interruzioni di riga vengono aggiunte a questo esempio solo per migliorare la leggibilità.

**Example SigV4**  

```
https://s3.amazonaws.com/amzn-s3-demo-bucket/test.txt ?
X-Amz-Algorithm=AWS4-HMAC-SHA256 &
X-Amz-Credential=<your-access-key-id>/20130721/<region>/s3/aws4_request &
X-Amz-Date=20130721T201207Z &
X-Amz-Expires=86400 &
X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
```

**Example SigV4a**  

```
http://s3.amazonaws.com/amzn-s3-demo-bucket/test.txt ?
X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256 &
X-Amz-Credential=<your-access-key-id>/20240721/s3/aws4_request &
X-amz-Region-Set=<regionset> &
X-Amz-Date=20240721T201207Z &
X-Amz-Expires=86400 &
X-Amz-SignedHeaders=host;x-amz-region-set &
X-Amz-Signature=<signature-value>
```

**Nota**  
Il valore `X-Amz-Credential` nell'URL mostra il carattere “/” solo per leggibilità. In pratica, dovrebbe essere codificato come %2F. Esempio:  
`&X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request`

La tabella seguente descrive i parametri della query nell'URL che forniscono informazioni di autenticazione.


| Nome parametro stringa di query | Description | 
| --- | --- | 
|  Algoritmo X-Amz  |  La versione della AWS firma e l'algoritmo utilizzato per calcolare la firma. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/IAM/latest/UserGuide/reference_sigv-authentication-methods.html)  | 
|  Credenziali X-Amz  |  Oltre all’ID della chiave di accesso, questo parametro fornisce anche l’ambito per cui la firma è valida. Questo valore deve corrispondere all'ambito utilizzato nei calcoli della firma, illustrato nella sezione seguente. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) *Per un elenco di stringhe AWS regionali, vedete [Regional Endpoints](https://docs.aws.amazon.com//general/latest/gr/rande.html#regional-endpoints) nella Guida generale.AWS *  | 
|  X-Amz-Region-Set  |  L’insieme delle Regioni in cui la richiesta sarà valida. L’intestazione x-amz-region-set è specificata come un elenco di valori separati da virgole.  | 
|  X-Amz-Date  |  Il formato di data e ora deve seguire lo standard ISO 8601 e deve essere formattato con il formato `yyyyMMddTHHmmssZ`. Ad esempio, se la data e l'ora erano "08/01/2016 15:32:41.982-700", devono prima essere convertite in UTC (Coordinated Universal Time) e quindi inviate come "20160801T223241Z".  | 
|  X-Amz-Expires  |  Fornisce il periodo di tempo, in secondi, per il quale l'URL prefirmato generato è valido. Ad esempio, 86400 (24 ore). Questo valore è un numero intero. Il valore minimo che puoi impostare è 1 e il massimo è 604800 (sette giorni). Un URL prefirmato può essere valido per massimo sette giorni perché la chiave di firma utilizzata nel calcolo della firma è valida per un massimo di sette giorni.  | 
|  X-Amz- SignedHeaders  |  Elenca le intestazioni che hai utilizzato per calcolare la firma. Per i calcoli delle firme sono necessarie le seguenti intestazioni: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) Per maggiore sicurezza, devi firmare tutte le intestazioni della richiesta che intendi includere nella richiesta.  | 
|  X-Amz-Signature  |  Fornisce la firma per autenticare la richiesta. Questa firma deve corrispondere alla firma calcolata dal servizio; in caso contrario, il servizio rifiuta la richiesta. Ad esempio, `733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7` I calcoli delle firme sono descritti nella sezione seguente.  | 
|  X-Amz-Security-Token  |  Parametro opzionale delle credenziali se si utilizzano credenziali provenienti dal servizio STS.  | 

# Creare una richiesta AWS API firmata
<a name="reference_sigv-create-signed-request"></a>

**Importante**  
Se utilizzi uno strumento AWS SDK (vedi [Codice di esempio e librerie](https://aws.amazon.com/developer/)) o AWS Command Line Interface (AWS CLI) a cui inviare richieste API AWS, puoi saltare questa sezione perché i client SDK e CLI autenticano le tue richieste utilizzando le chiavi di accesso che fornisci. A meno che tu non abbia una buona ragione per non farlo, ti consigliamo di utilizzare sempre un SDK o una CLI.  
Nelle regioni che supportano più versioni di firma, per le richieste di firma manuale è necessario specificare quale versione della firma viene utilizzata. Quando si forniscono richieste a punti di accesso multiregionali SDKs e la CLI passa automaticamente all'utilizzo della versione 4A di Signature senza configurazioni aggiuntive.

È possibile utilizzare il protocollo di firma AWS SigV4 per creare una richiesta firmata per le richieste API. AWS 

1. Creazione di una richiesta canonica basata sui dettagli della richiesta.

1. Calcolo di una firma utilizzando le tue credenziali. AWS 

1. L'aggiunta di questa firma alla richiesta come intestazione di autorizzazione.

AWS quindi replica questo processo e verifica la firma, concedendo o negando l'accesso di conseguenza.

Per scoprire come utilizzare AWS SigV4 per firmare le richieste API, consulta. [Richiesta di esempi di firma](reference_sigv-examples.md)

La tabella seguente descrive le funzioni utilizzate nel processo di creazione di una richiesta firmata. Per queste funzioni devi implementare il codice. Per ulteriori informazioni, consulta gli [esempi di codice in](reference_sigv.md#reference_aws-signing-resources). AWS SDKs


| Funzione | Description | 
| --- | --- | 
|  `Lowercase()`  |  Converte la stringa in minuscolo.  | 
|  `Hex()`  |  Codifica in base 16 minuscola.  | 
|  `SHA256Hash()`  |  Funzione hash crittografica Secure Hash Algorithm (SHA).  | 
|  `HMAC-SHA256()`  |  Calcola HMAC utilizzando l' SHA256 algoritmo con la chiave di firma fornita. Questa è la firma definitiva quando firmi con SigV4.  | 
|  `ECDSA-Sign`  |  Firma ECDSA (Elliptic Curve Digital Signature Algorithm) calcolata utilizzando firme asimmetriche basate sulla crittografia a chiave pubblica/privata.   | 
|  `KDF(K, Label, Context, L)`  |  [Un KDF NIST SP800 -108 in modalità Counter utilizzando la funzione PRF HMAC- come definita in NIST SP 800-108r1. SHA256 ](https://doi.org/10.6028/NIST.SP.800-108r1-upd1)  | 
|  `Oct2Int(byte[ ])`  |  Una funzione da ottetto a numero intero come descritto in ANSI X9.62.  | 
|  `Trim()`  |  Rimuove eventuali spazi bianchi all'inizio o alla fine della stringa.  | 
|  `UriEncode()`  |  L'URI codifica ogni byte. UriEncode() deve applicare le seguenti regole: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/IAM/latest/UserGuide/reference_sigv-create-signed-request.html)  Le UriEncode funzioni standard fornite dalla piattaforma di sviluppo potrebbero non funzionare a causa delle differenze di implementazione e della relativa ambiguità nella base. RFCs Ti consigliamo di scrivere una UriEncode funzione personalizzata per assicurarti che la codifica funzioni.  Per vedere un esempio di UriEncode funzione in Java, consulta [Java Utilities sul GitHub sito](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/util/SdkHttpUtils.java#L66) Web.  | 

**Nota**  
Quando firmi le tue richieste, puoi usare AWS SigV4 o SigV4a. AWS La differenza fondamentale tra le due versioni è determinata dalla modalità di calcolo della firma. Con SigV4a, il set di Regioni è incluso nella stringa da firmare, ma non fa parte della fase di derivazione delle credenziali.

## Firma delle richieste con credenziali di sicurezza provvisorie
<a name="temporary-security-credentials"></a>

Invece di utilizzare credenziali a lungo termine per firmare una richiesta, è possibile utilizzare credenziali di sicurezza temporanee fornite da (). AWS Security Token Service AWS STS

Quando si utilizzano credenziali di sicurezza temporanee, è necessario aggiungere `X-Amz-Security-Token` all'intestazione di autorizzazione o includerlo nella stringa di query per contenere il token di sessione. Alcuni servizi richiedono l'aggiunta di `X-Amz-Security-Token` alla richiesta canonica. Per gli altri servizi, aggiungi il parametro `X-Amz-Security-Token` alla fine, dopo aver calcolato la firma. Consultate la documentazione relativa a ciascuno di essi Servizio AWS per conoscere i requisiti specifici.

## Riepilogo delle fasi di firma
<a name="create-signed-request-steps"></a>

**Creare una richiesta canonica**  
Disponi i contenuti della tua richiesta (host, operazione, intestazioni, ecc.) in un formato standard (canonico). La richiesta canonica è uno degli input utilizzati per creare la stringa da firmare. Per i dettagli sulla creazione della richiesta canonica, consulta [Elementi della firma di una richiesta AWS API](reference_sigv-signing-elements.md)

**Creare un hash della richiesta canonica**  
Crea un hash della richiesta canonica con lo stesso algoritmo utilizzato per creare l'hash del payload. L'hash della richiesta canonica è una stringa di caratteri esadecimali minuscoli.

**Creare una stringa da firmare**  
Crea una stringa da firmare con la richiesta canonica e informazioni aggiuntive, ad esempio l'algoritmo, la data della richiesta, l'ambito delle credenziali e l'hash della richiesta canonica.

**Derivare una chiave di firma**  
Usa la chiave di accesso segreta per derivare la chiave utilizzata per firmare la richiesta.

**Calcolare la firma**  
Esegui un’operazione di hash con chiave sulla stringa da firmare utilizzando la chiave di firma derivata come chiave hash.

**Aggiungere la firma alla richiesta**  
Aggiungi la firma calcolata a un'intestazione HTTP o alla stringa di query della richiesta.

## Creare una richiesta canonica
<a name="create-canonical-request"></a>

Per creare una richiesta canonica concatena le seguenti stringhe, separate da caratteri di nuova riga. Questo aiuta a garantire che la firma calcolata possa corrispondere alla firma AWS calcolata.

```
<HTTPMethod>\n
<CanonicalURI>\n
<CanonicalQueryString>\n
<CanonicalHeaders>\n
<SignedHeaders>\n
<HashedPayload>
```
+ *HTTPMethod*— Il metodo HTTP, ad esempio`GET`, `PUT``HEAD`, e`DELETE`.
+ *CanonicalUri*— La versione con codifica URI dell'URI del componente del percorso assoluto, a partire da `/` quella che segue il nome di dominio e fino alla fine della stringa o fino al punto interrogativo (`?`) se sono presenti parametri della stringa di query. Se il percorso assoluto è vuoto, usa una barra (`/`). L'URI nell'esempio seguente, `/amzn-s3-demo-bucket/myphoto.jpg`, è il percorso assoluto e non devi codificare la `/` nel percorso assoluto:

  ```
  http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg
  ```
+ *CanonicalQueryString*— I parametri della stringa di query con codifica URI. Ogni nome e ogni valore vengono codificati singolarmente tramite URI. È inoltre necessario ordinare i parametri nella stringa di query canonica in ordine alfabetico in base al nome della chiave. L'ordinamento avviene dopo la codifica. La stringa di query nell'esempio di URI seguente è:

  ```
  http://s3.amazonaws.com/amzn-s3-demo-bucket?prefix=somePrefix&marker=someMarker&max-keys=2
  ```

  La stringa di query canonica è la seguente (le interruzioni di riga vengono aggiunte a questo esempio a fini di leggibilità):

  ```
  UriEncode("marker")+"="+UriEncode("someMarker")+"&"+
  UriEncode("max-keys")+"="+UriEncode("20") + "&" +
  UriEncode("prefix")+"="+UriEncode("somePrefix")
  ```

  Quando una richiesta ha come target una sottorisorsa, il valore del parametro di query corrispondente sarà una stringa vuota (`""`). Ad esempio, il seguente URI identifica la sottorisorsa `ACL` sul bucket `amzn-s3-demo-bucket`:

   

  ```
  http://s3.amazonaws.com/amzn-s3-demo-bucket?acl
  ```

  In questo caso, sarebbe: CanonicalQueryString 

   

  ```
  UriEncode("acl") + "=" + ""
  ```

  Se l'URI non include un `?`, la richiesta non contiene una stringa di query e occorre impostare la stringa di query canonica su una stringa vuota (`""`). Dovrai comunque includere il carattere di nuova riga (`"\n"`).
+ *CanonicalHeaders*— Un elenco di intestazioni di richiesta con i relativi valori. Le singole coppie di nome e valore dell'intestazione sono separate dal carattere di nuova riga (`"\n"`). Di seguito è riportato un esempio di CanonicalHeader:

  ```
  Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n"
  Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n"
  ...
  Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"
  ```

  CanonicalHeaders l'elenco deve includere quanto segue:
  + Intestazione `host` HTTP.
  + Se l'`Content-Type`intestazione è presente nella richiesta, è necessario aggiungerla all'*CanonicalHeaders*elenco. 
  + Devi aggiungere anche qualsiasi intestazione `x-amz-*` che desideri includere nella richiesta. Ad esempio, se utilizzi credenziali di sicurezza temporanee, nella tua richiesta devi includere `x-amz-security-token`. È necessario aggiungere questa intestazione nell'elenco di. *CanonicalHeaders*
  + Per SigV4a, è necessario includere un’intestazione dell’insieme di Regioni che specifichi l’insieme delle Regioni in cui la richiesta sarà valida. L’intestazione `X-Amz-Region-Set` è specificata come un elenco di valori separati da virgole. L’esempio seguente mostra un’intestazione di Regione che consente di effettuare una richiesta sia nella Regione us-east-1 sia in us-west-1.

    `X-Amz-Region-Set=us-east-1,us-west-1 `

    È possibile utilizzare i caratteri jolly (\$1) nelle Regioni per specificare più Regioni. Nell’esempio seguente, l’intestazione consente di effettuare una richiesta sia in us-west-1 sia in us-west-2.

    `X-Amz-Region-Set=us-west-*`
**Nota**  
L'intestazione `x-amz-content-sha256` è necessaria per le richieste AWS Amazon S3. Fornisce un hash del payload di richiesta. Se non è presente alcun payload, devi indicare l'hash di una stringa vuota.

  Il nome di ogni intestazione deve:
  + usare caratteri minuscoli.
  + in ordine alfabetico.
  + seguiti da due punti (`:`).

  Per i valori, devi:
  + eliminare eventuali spazi all'inizio o alla fine.
  + convertire gli spazi sequenziali in uno spazio singolo.
  + separare i valori per un'intestazione multivalore con virgole.
  + Nella firma devi includere l'intestazione dell'host  (HTTP/1.1) o l'intestazione :authority  (HTTP/2) e tutte le intestazioni `x-amz-*`. Facoltativamente puoi includere altre intestazioni standard nella firma, ad esempio content-type.

  Le funzioni `Lowercase()` e `Trim()` utilizzate in questo esempio sono descritte nella sezione precedente.

  Di seguito è riportata una stringa `CanonicalHeaders` di esempio. I nomi di intestazione sono in caratteri minuscoli e in ordine alfabetico.

   

  ```
  host:s3.amazonaws.com
  x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  x-amz-date:20130708T220855Z
  ```

   
**Nota**  
Ai fini del calcolo di una firma di autorizzazione, sono richiesti solo l’host e qualsiasi altra intestazione `x-amz-*`; tuttavia, per evitare la manomissione dei dati, nel calcolo della firma è consigliabile includere intestazioni aggiuntive.  
Non includete hop-by-hop intestazioni che vengono modificate frequentemente durante il transito su un sistema complesso. Questo comprende tutte le intestazioni di trasporto volatili che vengono modificate da proxy, bilanciatori del carico e nodi in un sistema distribuito, tra cui `connection`, `x-amzn-trace-id`, `user-agent`, `keep-alive`, `transfer-encoding`, `TE`, `trailer`, `upgrade`, `proxy-authorization` e `proxy-authenticate`.
+ *SignedHeaders*— Un elenco in ordine alfabetico e separati da punto e virgola di nomi di intestazioni di richiesta in lettere minuscole. Le intestazioni della richiesta nell'elenco sono le stesse che hai incluso nella stringa `CanonicalHeaders`. Nell'esempio precedente, il valore di sarebbe il seguente: *SignedHeaders*

  ```
  host;x-amz-content-sha256;x-amz-date
  ```
+ *HashedPayload*— Una stringa creata utilizzando il payload nel corpo della richiesta HTTP come input per una funzione hash. Questa stringa utilizza caratteri esadecimali minuscoli.

  ```
  Hex(SHA256Hash(<payload>>))
  ```

  Se non è presente alcun payload nella richiesta, calcola un hash della stringa vuota, ad esempio quando recupera un oggetto utilizzando una richiesta `GET`, non è presente nulla nel payload.

  ```
  Hex(SHA256Hash(""))
  ```
**Nota**  
Per Amazon S3, includi la stringa letterale `UNSIGNED-PAYLOAD` durante la creazione di una richiesta canonica e imposta lo stesso valore dell'intestazione `x-amz-content-sha256` quando invii la richiesta.  
`Hex(SHA256Hash("UNSIGNED-PAYLOAD"))`

## Creare un hash della richiesta canonica
<a name="create-canonical-request-hash"></a>

Crea un hash (digest) della richiesta canonica con lo stesso algoritmo utilizzato per creare l'hash del payload. L'hash della richiesta canonica è una stringa di caratteri esadecimali minuscoli.

## Creare una stringa da firmare
<a name="create-string-to-sign"></a>

Per creare una stringa, concatenare le seguenti stringhe, separate da caratteri di nuova riga. Non terminare questa stringa con un carattere di nuova riga.

```
Algorithm \n
RequestDateTime \n
CredentialScope  \n
HashedCanonicalRequest
```
+ *Algorithm*— L'algoritmo utilizzato per creare l'hash della richiesta canonica.
  + SigV4: utilizza `AWS4-HMAC-SHA256` per specificare l’algoritmo hash `HMAC-SHA256`. 
  + SigV4a: utilizza `AWS4-ECDSA-P256-SHA256` per specificare l’algoritmo hash `ECDSA-P256-SHA-256`. 
+ *RequestDateTime*— La data e l'ora utilizzate nell'ambito delle credenziali. Questo valore è l'ora UTC corrente in formato ISO 8601 (ad esempio,`20130524T000000Z`).
+ *CredentialScope*— L'ambito delle credenziali, che limita la firma risultante alla regione e al servizio specificati.
  + SigV4: le credenziali includono una stringa composta dall’ID della chiave di accesso, dalla data in formato `YYYYMMDD`, dal codice della Regione, dal codice del servizio e dalla stringa di chiusura `aws4_request`, separati da barre (/). Devi utilizzare caratteri minuscoli per la regione, il codice del servizio e la stringa di chiusura. La stringa ha il seguente formato: `YYYYMMDD/region/service/aws4_request`.
  + SigV4a: le credenziali includono la data in formato `YYYYMMDD`, il nome del servizio e la stringa di chiusura `aws4_request`, separati da barre (/). Ricorda che l’ambito delle credenziali non include la Regione, poiché è indicata in un’intestazione separata `X-Amz-Region-Set`. La stringa ha il seguente formato: `YYYYMMDD/service/aws4_request`.
+ *HashedCanonicalRequest*— L'hash della richiesta canonica, calcolato nel passaggio precedente.

Di seguito è riportata una stringa di esempio da firmare.

```
"<Algorithm>" + "\n" +
timeStampISO8601Format + "\n" +
<Scope> + "\n" +
Hex(<Algorithm>(<CanonicalRequest>))
```

## Derivare una chiave di firma
<a name="derive-signing-key"></a>

Per derivare una chiave di firma, scegli uno dei seguenti processi per calcolare una chiave di firma per SigV4 o SigV4a.

### Derivazione di una chiave di firma per SigV4
<a name="derive-signing-key-sigv4"></a>

Per derivare una chiave di firma per SigV4, esegui una serie di operazioni hash con chiave (HMAC) sulla data, sulla regione e sul servizio della richiesta, utilizzando la chiave di accesso AWS segreta come chiave per l'operazione di hashing iniziale.

Per ogni passaggio, richiama la funzione hash con la chiave e i dati richiesti. Il risultato di ogni chiamata alla funzione hash diventa l'input per la chiamata successiva alla funzione.

L'esempio seguente mostra come derivare l'elemento `SigningKey` utilizzato nella sezione successiva di questa procedura, mostrando l'ordine in cui l'input viene concatenato e sottoposto ad hash. `HMAC-SHA256` è la funzione hash utilizzata per eseguire l'hash dei dati come mostrato.

```
DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>")
DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>")
DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>")
SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
```

**Input richiesto**
+ `Key`: una stringa che contiene la tua chiave di accesso segreta.
+ `Date`: una stringa che contiene la data utilizzata nell’ambito delle credenziali, nel formato *AAAAMMGG*.
+ `Region`: una stringa che contiene il codice della Regione (ad esempio, `us-east-1`).

  Per un elenco delle stringhe delle regioni, consulta la pagina [Endpoint regionali](https://docs.aws.amazon.com//general/latest/gr/rande.html#regional-endpoints) in *Riferimenti generali di AWS*.
+ `Service`: una stringa che contiene il codice del servizio (ad esempio, `ec2`).
+ La stringa da firmare creata nel passaggio precedente.

**Per derivare una chiave di firma per SigV4**

1. Concatena `"AWS4"` e la chiave di accesso segreta. Chiama la funzione hash con la stringa concatenata come stringa di chiave e data come dati.

   ```
   DateKey = hash("AWS4" + Key, Date)
   ```

1. Chiama la funzione hash con il risultato della chiamata precedente come stringa di chiave e regione come dati.

   ```
   DateRegionKey = hash(kDate, Region)
   ```

1. Chiama la funzione hash con il risultato della chiamata precedente come stringa di chiave e servizio come dati.

   Il codice del servizio è definito dal servizio. Puoi utilizzare [get-products](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/pricing/get-products.html) nella *CLI di AWS Pricing* per restituire il codice di servizio per un servizio.

   ```
   DateRegionServiceKey = hash(kRegion, Service)
   ```

1. Chiama la funzione hash con il risultato della chiamata precedente come chiave e "aws4\$1request" come dati.

   ```
   SigningKey = hash(kService, "aws4_request")
   ```

### Derivazione di una chiave di firma per SigV4a
<a name="derive-signing-key-sigv4a"></a>

Per creare una chiave di firma per SigV4Aa, utilizza il seguente processo per derivare una coppia di chiavi dalla chiave di accesso segreta. [Per un esempio di implementazione di questa derivazione, vedete l'implementazione dell'autenticazione lato client nella libreria C99 AWS](https://github.com/awslabs/aws-c-auth/blob/e8360a65e0f3337d4ac827945e00c3b55a641a5f/source/key_derivation.c#L291.) 

```
n = [NIST P-256 elliptic curve group order]
G = [NIST P-256 elliptic curve base point]
label = "AWS4-ECDSA-P256-SHA256"

akid = [AWS access key ID as a UTF8 string]
sk = [AWS secret access Key as a UTF8 Base64 string]

input_key = "AWS4A" || sk
count = 1
while (counter != 255) {
  context = akid || counter // note: counter is one byte
  key = KDF(input_key, label, context, 256)
  c = Oct2Int(key)
  if (c > n - 2) {
    counter++
  } else {
    k = c + 1   // private key
    Q = k * G   // public key
  }
}

if (c < 255) {
  return [k, Q]
} else {
  return FAILURE
}
```

## Calcolare la firma
<a name="calculate-signature"></a>

Una volta derivata la chiave di firma, puoi calcolare la firma da aggiungere alla richiesta. Questa procedura varia in base alla versione di firma utilizzata.

**Per calcolare una firma per SigV4**

1. Chiama la funzione hash con il risultato della chiamata precedente come chiave e **stringa da firmare** come dati. Usa la chiave di firma derivata come chiave hash per questa operazione. Il risultato è la firma come valore binario.

   ```
   signature = hash(SigningKey, string-to-sign)
   ```

1. Converti la firma da rappresentazione binaria a esadecimale, in caratteri minuscoli.

**Per calcolare una firma per SigV4a**

1. Utilizzando l’algoritmo di firma digitale (ECDSA P-256), firma la **stringa da firmare** che hai creato nel passaggio precedente. La chiave utilizzata per questa firma è la chiave asimmetrica privata derivata dalla chiave di accesso segreta come descritto sopra.

   ```
   signature = base16(ECDSA-Sign(k, string-to-sign))
   ```

1. Converti la firma da rappresentazione binaria a esadecimale, in caratteri minuscoli.

## Aggiungere la firma alla richiesta
<a name="add-signature-to-request"></a>

Aggiungi la firma calcolata alla tua richiesta.

**Example Esempio: intestazione di autorizzazione**  
**SigV4**  
L'esempio seguente mostra un'`Authorization`intestazione per l'azione che utilizza SigV4. `DescribeInstances` AWS Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga. Nel tuo codice, deve essere una stringa continua. Non vi è alcun virgola tra l'algoritmo e `Credential`. Tuttavia, gli altri elementi devono essere separati da virgole.

```
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-date,
Signature=calculated-signature
```

**SigV4a**  
L'esempio seguente mostra un'intestazione di autorizzazione per l'azione che utilizza SigV4a. `CreateBucket` AWS Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga. Nel tuo codice, deve essere una stringa continua. Non vi è alcun virgola tra l’algoritmo e le credenziali. Tuttavia, gli altri elementi devono essere separati da virgole.

```
Authorization: AWS4-ECDSA-P256-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/s3/aws4_request,
SignedHeaders=host;x-amz-date;x-amz-region-set,
Signature=calculated-signature
```

**Example Esempio: richiesta con parametri di autenticazione nella stringa di query**  
**SigV4**  
L'esempio seguente mostra una query per l'`DescribeInstances`azione che utilizza AWS SigV4 che include le informazioni di autenticazione. Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga e non è codificato con l'URL. Nel codice, la stringa di query deve essere una stringa continua con codifica URL.

```
https://ec2.amazonaws.com/?
Action=DescribeInstances&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date&
X-Amz-Signature=calculated-signature
```

**SigV4a**  
L’esempio seguente mostra una query per l’operazione `CreateBucket` utilizzando AWS SigV4a che include le informazioni di autenticazione. Per motivi di leggibilità, questo esempio è formattato con interruzioni di riga e non è codificato con l'URL. Nel codice, la stringa di query deve essere una stringa continua con codifica URL.

```
https://ec2.amazonaws.com/?
Action=CreateBucket&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/s3/aws4_request&
X-Amz-Region-Set=us-west-1&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date;x-amz-region-set&
X-Amz-Signature=calculated-signature
```

# Richiesta di esempi di firma
<a name="reference_sigv-examples"></a>

I seguenti esempi di richieste di AWS firma mostrano come utilizzare SigV4 per firmare le richieste inviate senza l' AWS SDK o lo strumento da riga di AWS comando.

## Caricamento di Amazon S3 basato su browser tramite HTTP POST
<a name="signature-v4-examples-s3-browser"></a>

 [Richieste di autenticazione: caricamenti basati su browser](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html) descrive la firma e le informazioni pertinenti che Amazon S3 utilizza per calcolare la firma al ricevimento della richiesta.

[Esempio: il caricamento basato su browser tramite HTTP POST (utilizzando la versione 4 di AWS Signature)](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html) fornisce ulteriori informazioni con un esempio di policy POST e un modulo che è possibile utilizzare per caricare un file. La policy di esempio e le credenziali fittizie mostrano il flusso di lavoro e la firma e l'hash della policy risultanti.

## Richieste autenticate VPC Lattice
<a name="signature-v4-examples-lattice"></a>

 [Esempi di richieste autenticate Signature Version 4 (SigV4)](https://docs.aws.amazon.com/vpc-lattice/latest/ug/sigv4-authenticated-requests.html) fornisce esempi in Python e Java che mostrano come eseguire la firma delle richieste con e senza intercettori personalizzati.

## Utilizzo di Signature Version 4 con Amazon Translate
<a name="signature-v4-examples-translate"></a>

 [Live Translations in the Metaverse](https://aws.amazon.com/blogs/spatial/live-translations-in-the-metaverse/) mostra come creare un'applicazione che produce una soluzione di traduzione quasi in tempo reale. Questa soluzione di speech-to-speech traduzione utilizza AWS SigV4 nella codifica del flusso di eventi per produrre trascrizioni in tempo reale.

## Utilizzo di Signature Version 4 con Neptune
<a name="signature-v4-examples-neptune"></a>

[Esempio: connessione a Neptune utilizzando Python con firma Signature Version 4](https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-connecting-python.html) mostra come effettuare richieste firmate a Neptune usando Python. Questo esempio include varianti per l'utilizzo di una chiave di accesso o di credenziali temporanee.

## Firma delle richieste HTTP ad Amazon Glacier
<a name="signature-v4-examples-streaming-glacier"></a>

L'[API Example Signature Calculation for Streaming](https://docs.aws.amazon.com/amazonglacier/latest/dev/amazon-glacier-signing-requests.html) illustra i dettagli della creazione di una firma per Upload Archive (archivio POST), uno dei due streaming APIs in Amazon Glacier.

## Invio di richieste HTTP ad Amazon SWF
<a name="signature-v4-examples-swf"></a>

[Invio di richieste HTTP ad Amazon SWF](https://docs.aws.amazon.com/amazonswf/latest/developerguide/UsingJSON-swf.html#HTTPHeader) mostra il contenuto dell'intestazione per una richiesta JSON ad Amazon SWF.

## Calcolo delle firme per lo streaming APIs in Amazon OpenSearch Service
<a name="signature-v4-examples-open-search"></a>

[La firma di una richiesta di ricerca Amazon OpenSearch Service con AWS SDK for PHP](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/service_es-data-plane.html) versione 3 include un esempio di come inviare richieste HTTP firmate ad OpenSearch Amazon Service.

## Progetti di esempio nell'archivio di AWS esempi
<a name="signature-v4-examples-sdk"></a>

I seguenti progetti di esempio mostrano come firmare le richieste per effettuare richieste API Rest a AWS servizi con linguaggi comuni come Python, Node.js, Java, C\$1, Go e Rust. 

### Progetti Signature Version 4a
<a name="signature-v4-examples-sigv4a"></a>

Il progetto [sigv4-signing-examples fornisce esempi](https://github.com/aws-samples/sigv4-signing-examples) di come firmare le richieste con SigV4 per effettuare richieste API Rest con linguaggi Servizi AWS comuni come Python, Node.js, Java, C\$1, Go e Rust.

Il a-signing-examples progetto [sigv4](https://github.com/aws-samples/sigv4a-signing-examples) fornisce esempi per firmare richieste API multiregionali, ad esempio punti di [accesso multiregionali in Amazon](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPoints.html) S3.

### Pubblica su AWS IoT Core
<a name="signature-v4-examples-iot-python"></a>

Il [codice Python da pubblicare su AWS IoT Core using HTTPs protocol](https://github.com/aws-samples/aws-iot-core-python-node-sigv4-https) fornisce indicazioni su come pubblicare messaggi AWS IoT Core utilizzando il protocollo HTTPS e l'autenticazione AWS SigV4. Ha due implementazioni di riferimento: una in Python e l'altra in. NodeJs

[L'applicazione.Net Framework su cui pubblicare AWS IoT Core utilizzando il HTTPs protocollo](https://github.com/aws-samples/aws-iot-core-http-sigv4-dotnet-app) fornisce indicazioni su come pubblicare messaggi AWS IoT Core utilizzando il protocollo HTTPS e l'autenticazione AWS SigV4. Questo progetto include anche un'implementazione equivalente a .NET core.

# Risoluzione dei problemi relativi alla firma della versione 4 di Signature per le richieste API AWS
<a name="reference_sigv-troubleshooting"></a>

**Importante**  
A meno che non si utilizzi l'interfaccia a riga di comando AWS SDKs o la CLI, è necessario scrivere codice per calcolare le firme che forniscono informazioni di autenticazione nelle richieste. Il calcolo della firma SigV4 può essere un'impresa complessa e ti consigliamo di utilizzare la o la AWS SDKs CLI ogni volta che è possibile.

Quando sviluppi codice che crea una richiesta firmata, potresti ricevere HTTP 403 da. `SignatureDoesNotMatch` Servizi AWS Questi errori indicano che il valore della firma nella richiesta HTTP AWS non corrisponde alla firma Servizio AWS calcolata. Gli errori HTTP 401 `Unauthorized` vengono restituiti quando le autorizzazioni non consentono al chiamante di effettuare la richiesta.

Le richieste API potrebbero restituire un errore se:
+ La richiesta API non è firmata e utilizza l'autenticazione IAM.
+ Le credenziali IAM utilizzate per firmare la richiesta non sono corrette o non dispongono delle autorizzazioni per richiamare l'API.
+ La firma della richiesta API firmata non corrisponde alla firma calcolata dal servizio AWS .
+ L'intestazione della richiesta API non è corretta.

**Nota**  
Aggiorna il protocollo di AWS firma da Signature versione 2 (SigV2) a AWS Signature versione 4 (SigV4) prima di esplorare altre soluzioni di errore. I servizi come Amazon S3 e le regioni non supportano più la firma SigV2.

**Topics**
+ [

## Errori delle credenziali
](#signature-v4-troubleshooting-credential)
+ [

## Errori nella richiesta canonica e nella stringa di firma
](#signature-v4-troubleshooting-canonical-errors)
+ [

## Errori nell'ambito delle credenziali
](#signature-v4-troubleshooting-credential-scope)
+ [

## Errori nella chiave di firma
](#signature-v4-troubleshooting-key-signing)

## Errori delle credenziali
<a name="signature-v4-troubleshooting-credential"></a>

Assicurati che la richiesta dell'API sia firmata con SigV4. Se la richiesta API non è firmata, potresti ricevere l'errore: `Missing Authentication Token`. [Aggiungi la firma mancante](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#add-signature-to-request) e invia nuovamente la richiesta.

Verifica che le credenziali di autenticazione della chiave di accesso e della chiave segreta siano corrette. Se la chiave di accesso non è corretta, potresti ricevere l'errore: `Unauthorized`. Assicurati che l'entità utilizzata per firmare la richiesta sia autorizzata a effettuare la richiesta. Per informazioni dettagliate, vedi [Risoluzione dei problemi relativi ai messaggi di errore di accesso rifiutato](troubleshoot_access-denied.md). 

## Errori nella richiesta canonica e nella stringa di firma
<a name="signature-v4-troubleshooting-canonical-errors"></a>

Se hai calcolato la richiesta canonica in [Creare un hash della richiesta canonica](reference_sigv-create-signed-request.md#create-canonical-request-hash) o [Creare una stringa da firmare](reference_sigv-create-signed-request.md#create-string-to-sign), la fase di verifica della firma eseguita dal servizio ha esito negativo con li seguente messaggio di errore:

```
The request signature we calculated does not match the signature you provided
```

Quando il AWS servizio riceve una richiesta firmata, ricalcola la firma. Se sussistono differenze nei valori, le firme non corrispondono. Confronta la stringa e la richiesta canonica con la tua richiesta firmata con il valore nel messaggio di errore. Modifica il processo di firma se riscontri differenze.

**Nota**  
Puoi anche verificare di non aver inviato la richiesta tramite una proxy che modifica le intestazioni o la richiesta.

**Example Esempio di richiesta canonica**  

```
GET                                                      -------- HTTP method
/                                                        -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path}
                                                         -------- Query string key-value pair. Leave it blank if the request doesn't have a query string.
content-type:application/json                            -------- Header key-value pair. One header per line.
host:0123456789.execute-api.us-east-1.amazonaws.com      -------- Host and x-amz-date are required headers for all signed requests.                       
x-amz-date:20220806T024003Z                              

content-type;host;x-amz-date                             -------- A list of signed headers
d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501        -------- Hash of the payload
```

Per verificare che la chiave segreta corrisponda all'ID della chiave di accesso, puoi testarla con un'implementazione funzionante nota. Ad esempio, utilizza un AWS SDK o la AWS CLI per effettuare una richiesta a. AWS

### Intestazione della richiesta API
<a name="signature-v4-troubleshooting-credential-header"></a>

Quando l'intestazione di autorizzazione è vuota, la chiave o la firma della credenziale è mancante o errata, l'intestazione non inizia con il nome di un algoritmo o le coppie chiave-valore non includono un segno uguale, viene visualizzato uno dei seguenti errori:
+ L'intestazione dell'autorizzazione non può essere vuota.
+ L'intestazione di autorizzazione richiede il parametro "Credential".
+ L'intestazione di autorizzazione richiede il parametro "Signature".
+ La firma contiene una coppia chiave=valore non valida (segno di uguale mancante) nell'intestazione di autorizzazione.

Assicurati che l'intestazione di autorizzazione SigV4 aggiunta in [Calcolare la firma](reference_sigv-create-signed-request.md#calculate-signature) includa la chiave di credenziali corretta e la data della richiesta utilizzando HTTP Date o l'intestazione `x-amz-date`.

Se hai ricevuto un IncompleteSignatureException errore e la costruzione della firma è corretta, puoi verificare che l'intestazione di autorizzazione non sia stata modificata durante il transito verso il Servizio AWS calcolando un hash SHA-256 e una codifica B64 dell'intestazione di autorizzazione nella richiesta lato client.

1. Ottieni l'[intestazione di autorizzazione](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) che hai inviato nella richiesta. L'aspetto dell'intestazione dell'autorizzazione è simile all'esempio seguente:

   ```
   Authorization: AWS4-HMAC-SHA256 
   Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, 
   SignedHeaders=host;range;x-amz-date,
   Signature=example-generated-signature
   ```

1. Calcola un hash SHA-256 dell'intestazione dell'autorizzazione

   ```
   hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
   ```

1. Codifica l'intestazione di autorizzazione con hash nel formato Base64. 

   ```
   base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
   ```

1. Confronta la stringa con hash e codificata che hai appena calcolato con la stringa che hai ricevuto nel messaggio di errore. Il messaggio di errore dovrebbe essere simile al seguente esempio:

   ```
   com.amazon.coral.service#IncompleteSignatureException: 
   The signature contains an in-valid key=value pair (missing equal-sign) 
   in Authorization header (hashed with SHA-256 and encoded with Base64): 
   '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
   ```
+ Se i due hash sono diversi, una parte dell'intestazione di autorizzazione è cambiata durante il transito. Questa modifica potrebbe essere dovuta al fatto che i gestori della rete o del client allegano intestazioni firmate o modificano in qualche modo l'intestazione di autorizzazione. 
+ Se i due hash corrispondono, l'intestazione di autorizzazione inviata nella richiesta corrisponde a quella ricevuta. AWS Controlla il messaggio di errore che hai ricevuto per determinare se il problema è il risultato di credenziali o firme errate. Questi errori sono descritti nelle altre sezioni di questa pagina. 

## Errori nell'ambito delle credenziali
<a name="signature-v4-troubleshooting-credential-scope"></a>

L'ambito delle credenziali che hai creato in [Creare una stringa da firmare](reference_sigv-create-signed-request.md#create-string-to-sign) limita una firma a una data, una regione e un servizio specifici. Questa stringa ha il seguente formato:

```
YYYYMMDD/region/service/aws4_request
```

**Nota**  
Se si utilizza SigV4a, la regione non è inclusa nell'ambito delle credenziali.

**Data**  
Se l'ambito delle credenziali non specifica la stessa data dell'intestazione di x-amz-date, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:

```
Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP
```

Se la richiesta specifica un orario futuro, la fase di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:

```
Signature not yet current: date is still later than date
```

Se la richiesta è scaduta, la fase di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:

```
Signature expired: date is now earlier than date
```

**Region**  
Se l'ambito delle credenziali non specifica la stessa regione della richiesta, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:

```
Credential should be scoped to a valid Region, not region-code
```

**Servizio**  
Se l'ambito delle credenziali non specifica lo stesso servizio dell'intestazione di host, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:

```
Credential should be scoped to correct service: 'service'
```

**Stringa di terminazione**  
Se l'ambito delle credenziali termina con aws4\$1request, il passaggio di verifica della firma fallisce e viene visualizzato il seguente messaggio di errore:

```
Credential should be scoped with a valid terminator: 'aws4_request'
```

## Errori nella chiave di firma
<a name="signature-v4-troubleshooting-key-signing"></a>

Gli errori causati da un'errata derivazione della chiave di firma o dall'uso improprio della crittografia sono più difficili da risolvere. Dopo aver verificato che la stringa canonica e la stringa da firmare siano corrette, puoi anche verificare la presenza di uno dei seguenti problemi:
+ La chiave di accesso segreta non corrisponde all'ID della chiave di accesso specificato.
+ Si è verificato un problema con il codice di derivazione della chiave.

Per verificare che la chiave segreta corrisponda all'ID della chiave di accesso, puoi testarla con un'implementazione funzionante nota. Ad esempio, usa un AWS SDK o il AWS CLI per effettuare una richiesta a. AWS Per alcuni esempi, consultare [Richiesta di esempi di firma](reference_sigv-examples.md).