

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

# Offri contenuti privati con cookie firmati URLs e firmati
<a name="PrivateContent"></a>

Molte aziende che distribuiscono contenuto tramite Internet vogliono limitare l'accesso a documenti, dati aziendali, flussi multimediali o contenuto destinato a utenti selezionati, ad esempio, utenti paganti. Per servire in modo sicuro questi contenuti privati utilizzando CloudFront, puoi fare quanto segue:
+ Richiedi che gli utenti accedano ai tuoi contenuti privati utilizzando speciali cookie CloudFront firmati URLs o firmati. 
+ Richiedi che i tuoi utenti accedano ai tuoi contenuti utilizzando CloudFront URLs, non URLs che accedano ai contenuti direttamente sul server di origine (ad esempio, Amazon S3 o un server HTTP privato). La richiesta CloudFront URLs non è necessaria, ma la consigliamo per impedire agli utenti di aggirare le restrizioni specificate nei cookie firmati URLs o firmati.

Per ulteriori informazioni, consulta [Limitazione dell’accesso ai file](private-content-overview.md).

## Come gestire contenuti privati
<a name="private-content-task-list"></a>

 CloudFront Per configurare la visualizzazione di contenuti privati, esegui le seguenti operazioni:

1. (Facoltativo ma consigliato) Richiedi agli utenti di accedere ai tuoi contenuti solo tramite CloudFront. Il metodo utilizzato varia a seconda se utilizzi origini Amazon S3 o origini personalizzate:
   + **Amazon S3** - Vedere [Limitazione dell’accesso a un’origine Amazon S3](private-content-restricting-access-to-s3.md).
   + **Origine personalizzata** - Consulta [Limitazione dell’accesso ai file su origini personalizzate](private-content-overview.md#forward-custom-headers-restrict-access).

   Le origini personalizzate includono Amazon EC2, bucket Amazon S3 configurati come endpoint del sito Web, Elastic Load Balancing e server Web HTTP personalizzati.

1. Specificate i *gruppi di chiavi* *attendibili o i firmatari fidati* che desiderate utilizzare per creare cookie firmati URLs o firmati. Ti consigliamo di utilizzare gruppi di chiavi attendibili. Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).

1. Scrivi la tua applicazione per rispondere alle richieste degli utenti autorizzati con cookie firmati URLs o con `Set-Cookie` intestazioni che impostano cookie firmati. Segui le fasi in uno dei seguenti argomenti: 
   + [Usa firmato URLs](private-content-signed-urls.md)
   + [Utilizzo di cookie firmati](private-content-signed-cookies.md)

   Se non si è certi del metodo da utilizzare, consultare [Decidi di utilizzare cookie firmati URLs o firmati](private-content-choosing-signed-urls-cookies.md).

**Topics**
+ [Come gestire contenuti privati](#private-content-task-list)
+ [Limitazione dell’accesso ai file](private-content-overview.md)
+ [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md)
+ [Decidi di utilizzare cookie firmati URLs o firmati](private-content-choosing-signed-urls-cookies.md)
+ [Usa firmato URLs](private-content-signed-urls.md)
+ [Utilizzo di cookie firmati](private-content-signed-cookies.md)
+ [Comandi Linux e OpenSSL per la crittografia e la codifica base64](private-content-linux-openssl.md)
+ [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md)

# Limitazione dell’accesso ai file
<a name="private-content-overview"></a>

Puoi controllare l'accesso degli utenti ai tuoi contenuti privati in due modi:
+ [Limita l'accesso ai file nelle CloudFront cache](#private-content-overview-edge-caches).
+ Limita l'accesso ai file nel server di origine in uno dei seguenti modi:
  + [Imposta un controllo di accesso origine (OAC) per il bucket Amazon S3](private-content-restricting-access-to-s3.md).
  + [Configura intestazioni personalizzate per un server HTTP privato (un'origine personalizzata)](#forward-custom-headers-restrict-access).

## Limita l'accesso ai file nelle cache CloudFront
<a name="private-content-overview-edge-caches"></a>

Puoi configurare in modo CloudFront da richiedere che gli utenti accedano ai tuoi file utilizzando *cookie *firmati URLs* o firmati*. Successivamente, sviluppate l'applicazione per creare e distribuire i cookie firmati URLs agli utenti autenticati o per inviare `Set-Cookie` intestazioni che impostano cookie firmati per gli utenti autenticati. (Per consentire ad alcuni utenti l'accesso a lungo termine a un numero limitato di file, puoi anche creare file firmati URLs manualmente.) 

Quando crei cookie firmati URLs o firmati per controllare l'accesso ai tuoi file, puoi specificare le seguenti restrizioni:
+ Una data e un'ora di fine, dopo le quali l'URL non è più valido. 
+ (Facoltativo) La data e l'ora in cui l'URL diventa valido.
+ (Facoltativo) L'indirizzo IP o l'intervallo di indirizzi dei computer che possono essere utilizzati per accedere al tuo contenuto. 

Una parte di un URL o di un cookie firmato viene sottoposta a hashing e firmata utilizzando la chiave privata di una coppia di chiavi pubblica/privata. Quando qualcuno utilizza un URL firmato o un cookie firmato per accedere a un file, CloudFront confronta le parti firmate e non firmate dell'URL o del cookie. Se non corrispondono, CloudFront non serve il file.

È necessario utilizzare le chiavi private RSA 2048 o ECDSA 256 per la firma o i cookie. URLs 

## Limitazione dell’accesso ai file nei bucket Amazon S3
<a name="private-content-overview-s3"></a>

Facoltativamente, puoi proteggere i contenuti nel tuo bucket Amazon S3 in modo che gli utenti possano accedervi tramite la distribuzione CloudFront specificata ma non possono accedervi direttamente utilizzando Amazon S3. URLs Ciò impedisce a qualcuno di aggirare CloudFront e utilizzare l'URL di Amazon S3 per ottenere contenuti a cui desideri limitare l'accesso. Questo passaggio non è necessario per utilizzare signedURLs, ma lo consigliamo.

Per richiedere agli utenti di accedere ai tuoi contenuti tramite CloudFront URLs, esegui le seguenti attività:
+ Concedi a un'autorizzazione *di controllo dell'accesso all' CloudFront origine* per leggere i file nel bucket S3.
+ Crea il controllo di accesso di origine e associalo alla tua CloudFront distribuzione.
+ Rimuovi l'autorizzazione a chiunque altro a utilizzare Amazon S3 URLs per leggere i file.

Per ulteriori informazioni, consulta [Limitazione dell’accesso a un’origine Amazon S3](private-content-restricting-access-to-s3.md) o [Limita l'accesso all'origine di un punto di accesso multiregionale Amazon S3](private-content-restricting-access-to-s3-mrap.md).

## Limitazione dell’accesso ai file su origini personalizzate
<a name="forward-custom-headers-restrict-access"></a>

Se utilizzi un'origine personalizzata, puoi facoltativamente configurare le intestazioni personalizzate per limitare l'accesso. CloudFront Per ottenere i file da un'origine personalizzata, è necessario che i file siano accessibili CloudFront tramite una richiesta HTTP (o HTTPS) standard. Tuttavia, utilizzando intestazioni personalizzate, puoi limitare ulteriormente l'accesso ai tuoi contenuti in modo che gli utenti possano accedervi solo tramite CloudFront e non direttamente. Questo passaggio non è necessario per utilizzare signed URLs, ma lo consigliamo.

Per richiedere agli utenti di accedere ai contenuti tramite CloudFront, modifica le seguenti impostazioni nelle tue CloudFront distribuzioni:

**Origin Custom Headers (Intestazioni personalizzate origine)**  
Configura CloudFront per inoltrare le intestazioni personalizzate alla tua origine. Per informazioni, consulta [Configura CloudFront per aggiungere intestazioni personalizzate alle richieste di origine](add-origin-custom-headers.md#add-origin-custom-headers-configure).

**Viewer Protocol Policy (Policy protocollo visualizzatore)**  
Configura la distribuzione in modo che i visualizzatori utilizzino HTTPS per accedere a CloudFront. Per informazioni, consulta [Viewer Protocol Policy (Policy protocollo visualizzatore)](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy). 

**Origin Protocol Policy (Policy protocollo origine)**  
Configura la tua distribuzione in modo CloudFront che richieda l'utilizzo dello stesso protocollo dei visualizzatori per inoltrare le richieste all'origine. Per informazioni, consulta [Protocollo (solo origini personalizzate)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy). 

Dopo aver apportato queste modifiche, aggiorna l'applicazione sull'origine personalizzata per accettare solo le richieste che includono le intestazioni personalizzate che hai configurato CloudFront per l'invio.

La combinazione della **Policy del protocollo del visualizzatore** e della **Policy del protocollo di origine** garantisce che le intestazioni personalizzate siano crittografate durante il transito. Tuttavia, ti consigliamo di eseguire periodicamente le seguenti operazioni per ruotare le intestazioni personalizzate che vengono CloudFront inoltrate all'origine:

1. Aggiorna la CloudFront distribuzione per iniziare a inoltrare una nuova intestazione all'origine personalizzata.

1. Aggiorna l'applicazione per accettare la nuova intestazione come conferma dell'origine della richiesta. CloudFront

1. Quando le richieste non includono più l'intestazione che stai sostituendo, aggiorna l'applicazione in modo che non accetti più la vecchia intestazione come conferma dell'origine della richiesta. CloudFront

# Specificate i firmatari che possono creare cookie firmati e firmati URLs
<a name="private-content-trusted-signers"></a>

**Topics**
+ [Scegli tra gruppi di chiavi affidabili (consigliato) e Account AWS](#choosing-key-groups-or-AWS-accounts)
+ [Creazione di coppie di chiavi per i firmatari](#private-content-creating-cloudfront-key-pairs)
+ [Riformattazione della chiave privata (solo .NET e Java)](#private-content-reformatting-private-key)
+ [Aggiunta di un firmatario a una distribuzione](#private-content-adding-trusted-signers)
+ [Rotazione di coppie di chiavi](#private-content-rotating-key-pairs)

Per creare cookie firmati URLs o firmati, è necessario un *firmatario*. Un firmatario è un gruppo di chiavi attendibile in cui CloudFront crei o un AWS account che contiene una coppia di CloudFront chiavi. Ti consigliamo di utilizzare gruppi di chiavi affidabili con cookie firmati URLs e firmati. Per ulteriori informazioni, consulta [Scegli tra gruppi di chiavi affidabili (consigliato) e Account AWS](#choosing-key-groups-or-AWS-accounts).

Il firmatario ha due scopi:
+ Non appena aggiungi il firmatario alla tua distribuzione, CloudFront inizia a richiedere che gli spettatori utilizzino cookie firmati URLs o firmati per accedere ai tuoi file.
+ Quando crei cookie firmati URLs o firmati, utilizzi la chiave privata della coppia di chiavi del firmatario per firmare una parte dell'URL o del cookie. Quando qualcuno richiede un file con restrizioni, CloudFront confronta la firma nell'URL o nel cookie con l'URL o il cookie non firmato, per verificare che non sia stata manomessa. CloudFront verifica inoltre che l'URL o il cookie siano validi, vale a dire, ad esempio, che la data e l'ora di scadenza non siano trascorse.

Quando specifichi un firmatario, specifichi anche indirettamente i file che richiedono cookie firmati URLs o firmati aggiungendo il firmatario a un comportamento di cache. Se la tua distribuzione ha un solo comportamento nella cache, gli utenti devono utilizzare cookie firmati URLs o firmati per accedere a qualsiasi file della distribuzione. Se crei più comportamenti di cache e aggiungi firmatari ad alcuni comportamenti di cache e non ad altri, puoi richiedere che gli utenti utilizzino i cookie firmati URLs o firmati per accedere ad alcuni file e non ad altri.

Per specificare i firmatari (le chiavi private) autorizzati a creare cookie firmati URLs o firmati e per aggiungere i firmatari alla tua CloudFront distribuzione, esegui le seguenti operazioni:

1. Decidi se utilizzare un gruppo di chiavi attendibile o un altro Account AWS come firmatario. Ti consigliamo di utilizzare un gruppo di chiavi attendibile. Per ulteriori informazioni, consulta [Scegli tra gruppi di chiavi affidabili (consigliato) e Account AWS](#choosing-key-groups-or-AWS-accounts).

1. Per il firmatario scelto nel passaggio 1, crea una coppia di chiavi pubbliche-private. Per ulteriori informazioni, consulta [Creazione di coppie di chiavi per i firmatari](#private-content-creating-cloudfront-key-pairs).

1. Se utilizzi .NET o Java per creare cookie firmati URLs o firmati, riformatta la chiave privata. Per ulteriori informazioni, consulta [Riformattazione della chiave privata (solo .NET e Java)](#private-content-reformatting-private-key).

1. Nella distribuzione per la quale stai creando cookie firmati URLs o firmati, specifica il firmatario. Per ulteriori informazioni, consulta [Aggiunta di un firmatario a una distribuzione](#private-content-adding-trusted-signers).

## Scegli tra gruppi di chiavi affidabili (consigliato) e Account AWS
<a name="choosing-key-groups-or-AWS-accounts"></a>

Per utilizzare i cookie firmati URLs o firmati, è necessario un *firmatario.* Un firmatario è un gruppo di chiavi attendibile in CloudFront cui crei o un gruppo Account AWS che contiene una coppia di CloudFront chiavi. Ti consigliamo di utilizzare i gruppi di chiavi attendibili per i seguenti motivi:
+ Con i gruppi di CloudFront chiavi, non è necessario utilizzare l' AWS account utente root per gestire le chiavi pubbliche per i cookie CloudFront firmati URLs e firmati. [AWS le migliori pratiche](https://docs.aws.amazon.com/general/latest/gr/root-vs-iam.html#aws_tasks-that-require-root) consigliano di non utilizzare l'utente root quando non è necessario.
+ Con i gruppi di CloudFront chiavi, puoi gestire chiavi pubbliche, gruppi di chiavi e firmatari attendibili utilizzando l' CloudFront API. Puoi utilizzare l'API per automatizzare la creazione e la rotazione delle chiavi. Quando si utilizza l'utente AWS root, è necessario utilizzare il per Console di gestione AWS gestire le coppie di CloudFront chiavi, quindi non è possibile automatizzare il processo.
+ Poiché puoi gestire i gruppi di chiavi con l' CloudFront API, puoi anche utilizzare le politiche di autorizzazione AWS Identity and Access Management (IAM) per limitare ciò che i diversi utenti sono autorizzati a fare. Ad esempio, puoi consentire agli utenti di caricare chiavi pubbliche, ma non eliminarle. In alternativa, puoi consentire agli utenti di eliminare le chiavi pubbliche, ma solo quando vengono soddisfatte determinate condizioni, ad esempio l'utilizzo dell'autenticazione a più fattori, l'invio della richiesta da una determinata rete o l'invio della richiesta entro un determinato intervallo di data e ora.
+ Con i gruppi di CloudFront chiavi, puoi associare un numero maggiore di chiavi pubbliche alla tua CloudFront distribuzione, offrendoti una maggiore flessibilità nel modo in cui utilizzi e gestisci le chiavi pubbliche. Per impostazione predefinita, puoi associare fino a quattro gruppi di chiavi a una singola distribuzione e disporre di un massimo di cinque chiavi pubbliche in un gruppo di chiavi.

  Quando si utilizza l'utente root dell' AWS account per gestire le coppie di CloudFront chiavi, è possibile avere solo fino a due coppie di CloudFront chiavi attive per AWS account.

## Creazione di coppie di chiavi per i firmatari
<a name="private-content-creating-cloudfront-key-pairs"></a>

Ogni firmatario utilizzato per creare cookie CloudFront firmati URLs o firmati deve disporre di una coppia di key pair pubblica-privata. Il firmatario utilizza la propria chiave privata per firmare l'URL o i cookie e CloudFront utilizza la chiave pubblica per verificare la firma.

Il modo in cui si crea una coppia di chiavi dipende dal fatto che si utilizzi un gruppo di chiavi attendibile come firmatario (consigliato) o una coppia di CloudFront chiavi. Per ulteriori informazioni, consultare le sezioni indicate di seguito. La coppia di chiavi creata deve soddisfare i seguenti requisiti:
+ Deve essere una coppia di chiavi SSH-2 RSA 2048 o ECDSA 256.
+ Deve essere in formato PEM codificato in base64.

Per proteggere le applicazioni, ti consigliamo di ruotare periodicamente le coppie di chiavi. Per ulteriori informazioni, consulta [Rotazione di coppie di chiavi](#private-content-rotating-key-pairs).

### Crea una coppia di chiavi per un gruppo di chiavi attendibile (scelta consigliata)
<a name="create-key-pair-and-key-group"></a>

Per creare una coppia di chiavi per un gruppo di chiavi attendibile, attieniti alla seguente procedura:

1. Creare la coppia di chiavi pubbliche-private.

1. Carica la chiave pubblica su CloudFront.

1. Aggiungi la chiave pubblica a un gruppo di CloudFront chiavi.

Per ulteriori informazioni, consulta le procedure seguenti.<a name="private-content-uploading-cloudfront-public-key-procedure"></a>

**Per creare una coppia di chiavi**
**Nota**  
Le fasi seguenti utilizzano OpenSSL come esempio di un metodo per creare una coppia di chiavi. Esistono molti altri modi per creare una coppia di chiavi RSA o ECDSA.

1. Eseguire uno dei seguenti comandi di esempio:
   + Il comando di esempio seguente utilizza OpenSSL per generare una coppia di chiavi RSA con una lunghezza di 2048 bit e salvarla nel file denominato `private_key.pem`.

     ```
     openssl genrsa -out private_key.pem 2048
     ```
   + Il comando di esempio seguente utilizza OpenSSL per generare una coppia di chiavi ECDSA con una curva `prime256v1` e salvarla nel file denominato `private_key.pem`.

     ```
     openssl ecparam -name prime256v1 -genkey -noout -out privatekey.pem
     ```

1. Il file risultante contiene la chiave pubblica e quella privata. Il comando di esempio seguente estrae la chiave pubblica dal file denominato `private_key.pem`.

   ```
   openssl rsa -pubout -in private_key.pem -out public_key.pem
   ```

   Puoi caricare la chiave pubblica (nel file `public_key.pem`) in un secondo momento, nella procedura seguente.

**Per caricare la chiave pubblica su CloudFront**

1. Accedi a Console di gestione AWS e apri la CloudFront console all'indirizzo[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Nel menu di navigazione, scegli **Public keys (Chiavi pubbliche)**.

1. Scegli **Crea chiave pubblica**.

1. Nella finestra **Crea chiave pubblica**, effettua le operazioni seguenti:

   1. In **Key name (Nome chiave)**, digita un nome per identificare la chiave pubblica.

   1. In **Key value (Valore chiave)**, incolla la chiave pubblica. Se hai seguito i passaggi descritti nella procedura precedente, la chiave pubblica si trova nel file denominato `public_key.pem`. Per copiare e incollare il contenuto della chiave pubblica, puoi procedere come segue:
      + Usa il comando **cat** sulla riga di comando macOS o Linux, in questo modo:

        ```
        cat public_key.pem
        ```

        Copia l'output di quel comando, quindi incollalo nel campo **Key value (Valore chiave)**.
      + Apri il `public_key.pem` file con un editor di testo semplice come Notepad (su Windows) o (su macOS). TextEdit Copia il contenuto del file, quindi incollalo nel campo **Key value (Valore chiave)**.

   1. (Facoltativo) Per **Comment (Commento)**, aggiungi un commento per descrivere la chiave pubblica.

   Al termine, scegli **Add (Aggiungi)**.

1. Registra l'ID della chiave pubblica. Lo utilizzerai in seguito quando crei cookie firmati URLs o firmati, come valore del campo. `Key-Pair-Id`

**Per aggiungere la chiave pubblica a un gruppo di chiavi**

1. Apri la CloudFront console all'indirizzo[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Nel menu di navigazione, scegli **Key groups (Gruppi di chiavi)**.

1. Scegli **Add key group (Aggiungi gruppo di chiavi)**.

1. Nella pagina **Create key group (Crea gruppo di chiavi)** effettua le operazioni seguenti:

   1. In **Key group name (Nome gruppo di chiavi)**, digita un nome per identificare il gruppo di chiavi.

   1. (Facoltativo) Per **Comment (Commento)**, digita un commento per descrivere il gruppo di chiavi.

   1. Per **Public keys (Chiavi pubbliche)**, seleziona la chiave pubblica da aggiungere al gruppo di chiavi, quindi scegli **Add (Aggiungi)**. Ripeti questo passaggio per ogni chiave pubblica che desideri aggiungere al gruppo di chiavi.

1. Scegli **Create key group (Crea gruppo di chiavi)**.

1. Registra il nome del gruppo di chiavi. La si usa in seguito per associare il gruppo di chiavi a un comportamento della cache in una CloudFront distribuzione. (Nell' CloudFront API, si utilizza l'ID del gruppo di chiavi per associare il gruppo di chiavi a un comportamento della cache.)

### Creare una CloudFront key pair (scelta non consigliata, richiede l'utente Account AWS root)
<a name="create-key-pair-aws-account"></a>

**Importante**  
Ti consigliamo di creare una chiave pubblica per un gruppo di chiavi attendibili invece della seguente procedura. Per il metodo consigliato per creare chiavi pubbliche per i cookie firmati URLs e firmati, consulta[Crea una coppia di chiavi per un gruppo di chiavi attendibile (scelta consigliata)](#create-key-pair-and-key-group).

È possibile creare una CloudFront key pair nei seguenti modi:
+ Crea una coppia di chiavi in Console di gestione AWS e scarica la chiave privata. Segui la procedura descritta di seguito.
+ Crea un coppia di chiavi RSA utilizzando un'applicazione, ad esempio OpenSSL, e poi carica la chiave pubblica nella Console di gestione AWS. Per ulteriori informazioni sulla creazione di una coppia di chiavi RSA, consulta [Crea una coppia di chiavi per un gruppo di chiavi attendibile (scelta consigliata)](#create-key-pair-and-key-group).<a name="private-content-creating-cloudfront-key-pairs-procedure"></a>

**Per creare coppie di CloudFront chiavi in Console di gestione AWS**

1. Accedi Console di gestione AWS utilizzando le credenziali dell' AWS account utente root.
**Importante**  
Gli utenti IAM non possono creare coppie di CloudFront chiavi. Devi accedere utilizzando le credenziali utente root per creare coppie di chiavi.

1. Scegli il nome dell'account, quindi scegli **My Security Credentials (Le mie credenziali di sicurezza)**.

1. Scegli **coppie di CloudFront chiavi**.

1. Conferma di non avere più di una coppia di chiavi attiva. Non puoi creare una coppia di chiavi se hai già due coppie di chiavi attive.

1. Scegli **Create New Key Pair (Crea nuova coppia di chiavi)**.
**Nota**  
Puoi anche scegliere di creare la tua coppia di chiavi e caricare la chiave pubblica. CloudFront le coppie di chiavi supportano chiavi a 1024, 2048 o 4096 bit.

1. Nella finestra di dialogo **Create Key Pair (Crea coppia di chiavi)** scegli **Download Private Key File (Scarica il file della chiave privata)**, quindi salva il file nel computer.
**Importante**  
Salva la chiave privata per la tua coppia di CloudFront chiavi in una posizione sicura e imposta le autorizzazioni sul file in modo che solo gli amministratori desiderati possano leggerlo. Se qualcuno ottiene la tua chiave privata, può generare cookie firmati URLs e firmati validi e scaricare i tuoi contenuti. Non è possibile recuperare nuovamente la chiave privata, quindi se la si perde o la si elimina, è necessario creare una nuova coppia di CloudFront chiavi.

1. Registra l'ID per la tua coppia di chiavi. (Nel Console di gestione AWS, questo è chiamato **Access Key ID**.) Lo utilizzerai quando crei cookie firmati URLs o firmati.

## Riformattazione della chiave privata (solo .NET e Java)
<a name="private-content-reformatting-private-key"></a>

Se utilizzi .NET o Java per creare cookie firmati URLs o firmati, non puoi utilizzare la chiave privata della tua coppia di chiavi nel formato PEM predefinito per creare la firma. Effettua invece le seguenti operazioni:
+ **.NET Framework**: converti la chiave privata nel formato XML utilizzato da .NET Framework. Sono disponibili vari strumenti per eseguire la conversione.
+ **Java**: converti la chiave privata nel formato DER. Un modo per farlo è con il seguente comando OpenSSL. Nel comando seguente, `private_key.pem` è il nome del file che contiene la chiave privata con formattazione PEM e `private_key.der` è il nome del file che contiene la chiave privata con formattazione DER dopo l'esecuzione del comando.

  ```
  openssl pkcs8 -topk8 -nocrypt -in private_key.pem -inform PEM -out private_key.der -outform DER
  ```

  Per assicurarti che l'encoder funzioni correttamente, aggiungi il JAR per la crittografia Java Bouncy Castle APIs al tuo progetto, quindi aggiungi il provider Bouncy Castle.

## Aggiunta di un firmatario a una distribuzione
<a name="private-content-adding-trusted-signers"></a>

Un firmatario è il gruppo di chiavi attendibile (consigliato) o CloudFront la coppia di chiavi che può creare cookie firmati URLs e firmati per una distribuzione. Per utilizzare i cookie firmati URLs o firmati con una CloudFront distribuzione, devi specificare un firmatario.

I firmatari sono associati ai comportamenti cache. Ciò consente di richiedere cookie firmati URLs o firmati per alcuni file e non per altri della stessa distribuzione. Una distribuzione richiede cookie firmati URLs o cookie solo per i file associati ai comportamenti di cache corrispondenti.

Analogamente, un firmatario può firmare URLs o utilizzare cookie solo per i file associati ai comportamenti di cache corrispondenti. Ad esempio, se hai un firmatario per un comportamento di cache e un firmatario diverso per un diverso comportamento di cache, nessuno dei due firmatari può creare cookie firmati URLs o cookie per i file associati all'altro comportamento di cache.

**Importante**  
Prima di aggiungere un firmatario alla distribuzione, effettua le seguenti operazioni:  
Definisci con attenzione i pattern di percorso nei comportamenti cache e la sequenza dei comportamenti cache in modo da non concedere agli utenti l'accesso non intenzionale al contenuto o impedisca loro di accedere ai contenuti che desideri essere disponibili per tutti.  
Ad esempio, supponiamo che una richiesta corrisponda al modello di percorso per due comportamenti cache. Il primo comportamento di cache non richiede cookie firmati URLs o firmati, mentre il secondo lo richiede. Gli utenti saranno in grado di accedere ai file senza utilizzare cookie firmati URLs o firmati perché CloudFront elabora il comportamento della cache associato alla prima corrispondenza.  
Per ulteriori informazioni sui modelli di percorso, consulta [Modello di percorso](DownloadDistValuesCacheBehavior.md#DownloadDistValuesPathPattern).
Per una distribuzione che stai già utilizzando per distribuire contenuti, assicurati di essere pronto a iniziare a generare cookie firmati URLs e firmati prima di aggiungere un firmatario. Quando aggiungi un firmatario, CloudFront rifiuta le richieste che non includono un URL firmato o un cookie firmato valido.

Puoi aggiungere firmatari alla tua distribuzione utilizzando la CloudFront console o l'API. CloudFront

------
#### [ Console ]

La procedura seguente illustra come aggiungere un gruppo di chiavi attendibili come firmatario. Puoi anche aggiungerne uno Account AWS come firmatario attendibile, ma non è consigliato.<a name="private-content-adding-trusted-signers-console-procedure"></a>

**Per aggiungere un firmatario a una distribuzione utilizzando la console**

1. Registra l'ID gruppo di chiavi del gruppo di chiavi che desideri utilizzare come firmatario attendibile. Per ulteriori informazioni, consulta [Crea una coppia di chiavi per un gruppo di chiavi attendibile (scelta consigliata)](#create-key-pair-and-key-group).

1. Apri la CloudFront console all'indirizzo[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Scegli la distribuzione di cui desideri proteggere i file con cookie firmati URLs o firmati.
**Nota**  
Per aggiungere un firmatario a una nuova distribuzione, specifica le stesse impostazioni descritte nel passaggio 6 per la creazione della distribuzione.

1. Scegli la scheda **Behaviors** (Comportamenti).

1. Seleziona il comportamento della cache il cui modello di percorso corrisponde ai file che desideri proteggere con cookie firmati URLs o firmati, quindi scegli **Modifica**.

1. Nella pagina **Edit Behavior (Modifica comportamento)** effettua le operazioni seguenti:

   1. Per **Limita l'accesso degli spettatori (utilizza cookie firmati URLs o firmati)**, scegli **Sì**.

   1. Per **Trusted Key Groups or Trusted Signer (Gruppi di chiavi attendibili o Firmatari attendibili)**, scegli **Trusted Key Groups (Gruppi di chiavi attendibili)**

   1. Per **Trusted Key Groups (Gruppi di chiavi attendibili)**, scegli il gruppo di chiavi da aggiungere, quindi scegli **Add (Aggiungi)**. Ripeti l'operazione se desideri aggiungere più di un gruppo di chiavi.

1. Scegli **Yes, Edit (Sì, Modifica)** per aggiornare il comportamento cache.

------
#### [ API ]

Puoi utilizzare l' CloudFront API per aggiungere un gruppo di chiavi attendibile come firmatario. Puoi aggiungere un firmatario a una distribuzione esistente o a una nuova distribuzione. In entrambi i casi, specifica i valori nell'elemento `TrustedKeyGroups`.

Puoi anche aggiungerne uno Account AWS come firmatario attendibile, ma non è consigliato.

Consulta i seguenti argomenti nell'*Amazon CloudFront API Reference*:
+ **Aggiorna una distribuzione esistente**: [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)
+ **Crea una nuova distribuzione** — [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)

------

## Rotazione di coppie di chiavi
<a name="private-content-rotating-key-pairs"></a>

Ti consigliamo di ruotare (modificare) periodicamente le coppie di chiavi per i cookie firmati URLs e firmati. Per ruotare le coppie di chiavi che utilizzi per creare cookie firmati URLs o firmati senza invalidarli URLs o cookie che non sono ancora scaduti, esegui le seguenti operazioni:

1. Crea una nuova coppia di chiavi e aggiungi la chiave pubblica a un gruppo di chiavi. Per ulteriori informazioni, consulta [Crea una coppia di chiavi per un gruppo di chiavi attendibile (scelta consigliata)](#create-key-pair-and-key-group).

1. Se nel passaggio precedente hai creato un nuovo gruppo di chiavi, [aggiungi il gruppo di chiavi alla distribuzione come firmatario](#private-content-adding-trusted-signers).
**Importante**  
Non rimuovere le chiavi pubbliche esistenti dal gruppo di chiavi o i gruppi di chiavi dalla distribuzione. Aggiungi solo nuovi elementi.

1. Aggiorna la tua applicazione per creare firme utilizzando la chiave privata della nuova coppia di chiavi. Verifica che i cookie firmati URLs o quelli firmati con le nuove chiavi private funzionino.

1. Attendi che sia trascorsa la data di scadenza URLs o che i cookie siano stati firmati utilizzando la chiave privata precedente. Quindi rimuovi la vecchia chiave pubblica dal gruppo di chiavi. Se hai creato un nuovo gruppo di chiavi nel passaggio 2, rimuovi il vecchio gruppo di chiavi dalla distribuzione.

# Decidi di utilizzare cookie firmati URLs o firmati
<a name="private-content-choosing-signed-urls-cookies"></a>

CloudFront i cookie firmati URLs e firmati offrono le stesse funzionalità di base: consentono di controllare chi può accedere ai contenuti. Se desideri pubblicare contenuti privati CloudFront e stai cercando di decidere se utilizzare cookie firmati URLs o firmati, prendi in considerazione quanto segue.

Utilizza i file firmati URLs nei seguenti casi:
+ Intendi limitare l'accesso a singoli file, ad esempio, il download di un'installazione per l'applicazione.
+ I tuoi utenti stanno utilizzando un client (ad esempio, un client HTTP personalizzato) che non supporta i cookie.

Utilizza cookie firmati nei seguenti casi:
+ Intendi fornire accesso a più file con restrizioni, ad esempio, tutti i file per un video in formato HLS o tutti i file nell'area abbonati di un sito Web.
+ Non vuoi cambiare la tua versione attuale URLs.

Se attualmente non utilizzi signed URLs e se il file (unsigned) URLs contiene uno dei seguenti parametri della stringa di query, non puoi utilizzare cookie firmati URLs o firmati:
+ `Expires`
+ `Policy`
+ `Signature`
+ `Key-Pair-Id`
+ `Hash-Algorithm`

CloudFront presuppone URLs che i parametri della stringa di query che contengono uno di questi parametri siano firmati URLs e quindi non esaminerà i cookie firmati.

## Utilizza sia i cookie firmati che URLs quelli firmati
<a name="private-content-using-signed-urls-and-cookies"></a>

I cookie firmati URLs hanno la precedenza sui cookie firmati. Se utilizzi sia cookie firmati URLs che firmati per controllare l'accesso agli stessi file e un visualizzatore utilizza un URL firmato per richiedere un file, CloudFront determina se restituire il file al visualizzatore solo in base all'URL firmato.

# Usa firmato URLs
<a name="private-content-signed-urls"></a>

Un URL firmato include ulteriori informazioni, ad esempio, una data e un'ora di scadenza, che offrono un maggiore controllo sull'accesso al tuo contenuto. Queste informazioni aggiuntive appaiono in una dichiarazione di policy, basata su una policy predefinita o personalizzata. Le differenze tra policy predefinite e personalizzate sono descritte nelle due sezioni successive.

**Nota**  
È possibile crearne alcuni firmati URLs utilizzando criteri predefiniti e crearne alcuni firmati URLs utilizzando criteri personalizzati per la stessa distribuzione.

**Topics**
+ [Decidi di utilizzare politiche predefinite o personalizzate per la firma URLs](#private-content-choosing-canned-custom-policy)
+ [Come funzionano i URLs firmatari](#private-content-how-signed-urls-work)
+ [Decidi per quanto tempo i firmi URLs sono validi](#private-content-overview-choosing-duration)
+ [When CloudFront controlla la data e l'ora di scadenza in un URL firmato](#private-content-check-expiration)
+ [Codice di esempio e strumenti di terza parte.](#private-content-overview-sample-code)
+ [Creazione di un URL firmato utilizzando una policy di accesso predefinita](private-content-creating-signed-url-canned-policy.md)
+ [Creazione di un URL firmato utilizzando una policy personalizzata](private-content-creating-signed-url-custom-policy.md)

## Decidi di utilizzare politiche predefinite o personalizzate per la firma URLs
<a name="private-content-choosing-canned-custom-policy"></a>

Quando crei un URL firmato, scrivi una dichiarazione di policy in formato JSON che specifica le restrizioni sull'URL firmato, ad esempio, il periodo di validità dell'URL. Puoi utilizzare una policy predefinita o una personalizzata. Di seguito sono riportate le differenze tra policy predefinite e personalizzate:


****  

| Descrizione | Policy predefinita | Policy personalizzata | 
| --- | --- | --- | 
| Puoi riutilizzare la dichiarazione di policy per più file. Per riutilizzare la dichiarazione di policy, devi utilizzare caratteri jolly nell'oggetto `Resource`. Per ulteriori informazioni, consulta [Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-statement-values).)  | No | Sì | 
| Puoi specificare la data e l'ora in cui gli utenti possono iniziare ad accedere al tuo contenuto. | No | Sì (facoltativo) | 
| Puoi specificare la data e l'ora in cui gli utenti non possono più accedere al tuo contenuto. | Sì | Sì | 
| Puoi specificare l'indirizzo IP o l'intervallo di indirizzi IP degli utenti che possono accedere al tuo contenuto. | No | Sì (facoltativo) | 
| L'URL firmato include una versione con codifica base64 della policy, che risulta in un URL più lungo. | No | Sì | 

Per informazioni sulla creazione di criteri URLs *predefiniti firmati*, consulta. [Creazione di un URL firmato utilizzando una policy di accesso predefinita](private-content-creating-signed-url-canned-policy.md)

Per informazioni sulla creazione di una politica firmata URLs utilizzando una politica *personalizzata*, vedere[Creazione di un URL firmato utilizzando una policy personalizzata](private-content-creating-signed-url-custom-policy.md).

## Come funzionano i URLs firmatari
<a name="private-content-how-signed-urls-work"></a>

Ecco una panoramica di come CloudFront configuri Amazon S3 for signed URLs e di come CloudFront risponde quando un utente utilizza un URL firmato per richiedere un file. 

1. Nella tua CloudFront distribuzione, specifica uno o più gruppi di chiavi affidabili, che contengono le chiavi pubbliche da CloudFront utilizzare per verificare la firma dell'URL. Utilizzi le chiavi private corrispondenti per firmare il URLs.

   CloudFront supporta firme a URLs chiave firmate con RSA 2048 ed ECDSA 256.

   Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).

1. Sviluppa la tua applicazione per determinare se un utente debba avere accesso ai tuoi contenuti e creane una versione firmata URLs per i file o le parti dell'applicazione a cui desideri limitare l'accesso. Per ulteriori informazioni, consulta i seguenti argomenti:
   + [Creazione di un URL firmato utilizzando una policy di accesso predefinita](private-content-creating-signed-url-canned-policy.md)
   + [Creazione di un URL firmato utilizzando una policy personalizzata](private-content-creating-signed-url-custom-policy.md)

1. Un utente richiede la firma di un file per il quale si desidera richiedere la firma URLs.

1. La tua applicazione verifica che l'utente è autorizzato ad accedere al file: ha eseguito l'accesso, ha pagato per accedere al contenuto o ha soddisfatto altri requisiti per l'accesso.

1. La tua applicazione crea e restituisce un URL firmato all'utente.

1. L'URL firmato consente all'utente di scaricare o riprodurre in streaming il contenuto.

   Questa fase è automatica; l'utente in genere non deve eseguire ulteriori operazioni per accedere al contenuto. Ad esempio, se un utente accede al tuo contenuto in un browser Web, l'applicazione restituisce l'URL firmato al browser. Il browser utilizza immediatamente l'URL firmato per accedere al file nella cache CloudFront edge senza alcun intervento da parte dell'utente.

1. CloudFront utilizza la chiave pubblica per convalidare la firma e confermare che l'URL non è stato manomesso. Se la firma non è valida, la richiesta viene respinta. 

   Se la firma è valida, CloudFront esamina l'informativa nell'URL (o ne costruisce una se utilizzi una politica predefinita) per confermare che la richiesta è ancora valida. Ad esempio, se hai specificato una data e un'ora di inizio e di fine per l'URL, CloudFront conferma che l'utente sta tentando di accedere ai tuoi contenuti durante il periodo di tempo in cui desideri consentire l'accesso. 

   Se la richiesta soddisfa i requisiti dell'informativa, CloudFront esegue le operazioni standard: determina se il file è già presente nella cache edge, inoltra la richiesta all'origine se necessario e restituisce il file all'utente.

**Nota**  
Se un URL non firmato contiene parametri di stringa di query, assicurati di includerli nella parte dell'URL che firmi. Se aggiungi una stringa di query a un URL firmato dopo la sua creazione, l'URL restituisce uno stato HTTP 403.

## Decidi per quanto tempo i firmi URLs sono validi
<a name="private-content-overview-choosing-duration"></a>

Puoi distribuire contenuto privato utilizzando un URL firmato valido soltanto per un breve periodo di tempo, anche di pochi minuti. I URLs documenti firmati e validi per un periodo così breve sono utili per distribuire contenuti on-the-fly a un utente per uno scopo specifico, come la distribuzione di film a noleggio o download di musica ai clienti su richiesta. Se i file firmati URLs saranno validi solo per un breve periodo, probabilmente vorrai generarli automaticamente utilizzando un'applicazione sviluppata da te. Quando l'utente inizia a scaricare un file o inizia a riprodurre un file multimediale, CloudFront confronta l'ora di scadenza dell'URL con l'ora corrente per determinare se l'URL è ancora valido.

Puoi anche distribuire contenuto privato utilizzando un URL firmato valido per un periodo di tempo più lungo, anche di vari anni. I URLs documenti firmati validi per un periodo più lungo sono utili per distribuire contenuti privati a utenti noti, ad esempio per distribuire un piano aziendale agli investitori o distribuire materiali di formazione ai dipendenti. Puoi sviluppare un'applicazione per generare questi messaggi firmati a lungo termine per te. URLs 

## When CloudFront controlla la data e l'ora di scadenza in un URL firmato
<a name="private-content-check-expiration"></a>

CloudFront controlla la data e l'ora di scadenza in un URL firmato al momento della richiesta HTTP. Se un client inizia a scaricare un file di grandi dimensioni immediatamente prima della scadenza, il download viene completato anche se la scadenza avviene durante il download. Se la connessione TCP viene interrotta e il client tenta di riavviare il download dopo la scadenza, il download non riesce.

Se un client utilizza Range GETs per ottenere un file in parti più piccole, qualsiasi richiesta GET che si verifica dopo la scadenza avrà esito negativo. Per ulteriori informazioni su RangeGETs, vedere[Come CloudFront elabora le richieste parziali per un oggetto (intervallo GETs)](RangeGETs.md).

## Codice di esempio e strumenti di terza parte.
<a name="private-content-overview-sample-code"></a>

Per un esempio di codice che crea la parte con hash e firma di signed URLs, consulta i seguenti argomenti:
+ [Creazione di una firma per URL utilizzando Perl](CreateURLPerl.md)
+ [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md)
+ [Crea una firma per URL utilizzando C\$1 e .NET Framework](CreateSignatureInCSharp.md)
+ [Creazione di una firma per URL utilizzando Java](CFPrivateDistJavaDevelopment.md)

# Creazione di un URL firmato utilizzando una policy di accesso predefinita
<a name="private-content-creating-signed-url-canned-policy"></a>

Per creare un URL firmato utilizzando una policy predefinita, completa la procedura seguente.<a name="private-content-creating-signed-url-canned-policy-procedure"></a>

**Creazione di un URL firmato utilizzando una policy predefinita**

1. Se stai usando .NET o Java per creare un file firmato URLs e se non hai riformattato la chiave privata per la tua coppia di chiavi dal formato.pem predefinito a un formato compatibile con.NET o con Java, fallo ora. Per ulteriori informazioni, consulta [Riformattazione della chiave privata (solo .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Concatena i seguenti valori. Puoi utilizzare il formato in questo URL firmato di esempio. 

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Expires=1767290400&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F&Hash-Algorithm=SHA256
   ```

   Rimuovi tutti gli spazi vuoti (compresi i caratteri di tabulazione e di nuova riga). È possibile che tu debba includere caratteri di escape nella stringa del codice dell'applicazione. Tutti i valori hanno un tipo `String`.  
**1. *Base URL for the file***  
L'URL di base è l' CloudFront URL che utilizzeresti per accedere al file se non utilizzassi signed URLs, inclusi i parametri della stringa di query, se presenti. Nell’esempio precedente, l’URL di base è `https://d111111abcdef8.cloudfront.net/image.jpg`. Per ulteriori informazioni sul formato delle URLs distribuzioni, vedere[Personalizza il formato URL per i file in CloudFront](LinkFormat.md).  
   + L' CloudFront URL seguente riguarda un file di immagine in una distribuzione (utilizzando il nome di CloudFront dominio). Nota che `image.jpg` è una directory `images`. Il percorso al file nell'URL deve corrispondere al percorso al file nel server HTTP o nel bucket Amazon S3.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + Il seguente CloudFront URL include una stringa di query:

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Di seguito CloudFront URLs sono riportati i file di immagine in una distribuzione. Entrambi utilizzano un nome di dominio alternativo. Il secondo include una stringa di query:

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + L' CloudFront URL seguente riguarda un file di immagine in una distribuzione che utilizza un nome di dominio alternativo e il protocollo HTTPS:

     `https://www.example.com/images/image.jpg`  
** 2. `?`**  
Il carattere `?` indica che i parametri di query seguono l’URL di base. Includi il carattere `?` anche senza specificare alcun parametro di query.  
Puoi specificare i seguenti parametri di query in qualsiasi ordine.  
**3. *Your query string parameters, if any*`&`**  
(Facoltativo) Puoi immettere parametri della stringa di query personalizzati. A tale scopo, aggiungi una e commerciale (`&`) tra ciascuno di essi, ad esempio `color=red&size=medium`. Puoi specificare parametri della stringa di query in qualsiasi ordine all’interno dell’URL.  
I parametri della stringa di query non possono essere denominati `Expires``Signature`,`Key-Pair-Id`, o`Hash-Algorithm`.  
** 4. `Expires=`*date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC)***  
La data e l'ora in cui desideri che l'URL blocchi l'accesso al file.  
Specifica la data e l'ora di scadenza in formato Unix (in secondi) e UTC. Ad esempio, la data 1 gennaio 2026 10:00 UTC viene convertita in `1767290400` in un formato Unix, come illustrato nell’esempio all’inizio di questo argomento.   
Per usare il tempo epoch, specifica un numero intero a 64 bit per una data non posteriore a `9223372036854775807` (venerdì 11 aprile 2262 alle 23:47:16.854 UTC).  
  
Per informazioni sul formato UTC, consulta [RFC 3339, Date and Time on the Internet: Timestamps](https://tools.ietf.org/html/rfc3339).  
** 5. `&Signature=`*hashed and signed version of the policy statement***  
Una versione con hash, firma e codifica base64 della dichiarazione di policy JSON. Per ulteriori informazioni, consulta [Creazione di una firma per un URL firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-creating-signature).  
** 6. `&Key-Pair-Id=`*public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature***  
L'ID di una chiave CloudFront pubblica, ad esempio`K2JCJMDEHXQW5F`. L'ID della chiave pubblica indica CloudFront quale chiave pubblica utilizzare per convalidare l'URL firmato. CloudFront confronta le informazioni contenute nella firma con quelle contenute nell'informativa per verificare che l'URL non sia stato manomesso.  
Questa chiave pubblica deve appartenere a un gruppo di chiavi che sia un firmatario attendibile nella distribuzione. Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).  
** 7. `&Hash-Algorithm=`*SHA1 or SHA256***  
(Facoltativo) L'algoritmo hash utilizzato per creare la firma. I valori supportati sono `SHA1` e `SHA256`. Se non si specifica questo parametro, il valore CloudFront predefinito è. `SHA1`

## Creazione di una firma per un URL firmato che utilizza una policy di accesso predefinita
<a name="private-content-canned-policy-creating-signature"></a>

Per creare la firma per un URL firmato che utilizza una policy di accesso predefinita, completa le seguenti procedure.

**Topics**
+ [Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-creating-policy-statement)
+ [Creazione di una firma per un URL firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-signing-policy-statement)

### Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy di accesso predefinita
<a name="private-content-canned-policy-creating-policy-statement"></a>

Quando crei un URL firmato utilizzando una policy predefinita, il parametro `Signature` è una versione con hash e firma di una dichiarazione di policy. Per i criteri firmati URLs che utilizzano una politica predefinita, non includi l'informativa nell'URL, mentre per quelli firmati URLs che utilizzano una politica personalizzata. Per creare una dichiarazione di policy, esegui la procedura descritta di seguito.<a name="private-content-canned-policy-creating-policy-statement-procedure"></a>

**Per creare la dichiarazione di policy per un URL firmato che utilizza una policy predefinita**

1. Crea la dichiarazione di policy utilizzando il formato JSON seguente e la codifica caratteri UTF-8. Includi tutta le punteggiatura e altri valori letterali esattamente come specificato. Per informazioni sui parametri `Resource` e `DateLessThan`, consulta [Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy predefinita](#private-content-canned-policy-statement-values).

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. Rimuovi tutti gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla dichiarazione di policy. È possibile che tu debba includere caratteri di escape nella stringa del codice dell'applicazione.

#### Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy predefinita
<a name="private-content-canned-policy-statement-values"></a>

Quando crei una dichiarazione di policy per una policy predefinita, specifichi i valori seguenti.

**Risorsa**  
Puoi specificare un solo valore per `Resource`.
L'URL di base che include le stringhe di query, se presenti, ma escludendo CloudFront `Expires`, `Signature``Key-Pair-Id`, e `Hash-Algorithm` i parametri, ad esempio:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Tenere presente quanto segue:  
+ **Protocollo**: il valore deve iniziare con `http://` o `https://`.
+ **Parametri di stringa di query**: se non hai parametri di stringa di query, ometti il punto di domanda.
+ **Nomi di dominio alternativi**: se specifichi un nome di dominio alternativo (CNAME) nell'URL, devi specificarlo quando fai riferimento al file nella pagina Web o nell'applicazione. Non specificare l'URL di Amazon S3 per l'oggetto.

**DateLessThan**  
La data e l'ora di scadenza per l'URL in formato Unix (in secondi) e UTC. Ad esempio, le 10:00 UTC del 1° gennaio 2026 vengono convertite in 1767290400 nel formato orario Unix.  
Questo valore deve corrispondere al valore del parametro di stringa di query `Expires` nell'URL firmato. Non racchiudere il valore tra virgolette.  
Per ulteriori informazioni, consulta [When CloudFront controlla la data e l'ora di scadenza in un URL firmato](private-content-signed-urls.md#private-content-check-expiration).

#### Esempio di dichiarazione di policy per un URL firmato che utilizza una policy predefinita
<a name="private-content-canned-policy-creating-policy-statement-example"></a>

Quando si utilizza la seguente dichiarazione politica di esempio in un URL firmato, un utente può accedere al file `https://d111111abcdef8.cloudfront.net/horizon.jpg` fino alle 10:00 UTC del 1° gennaio 2026:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### Creazione di una firma per un URL firmato che utilizza una policy di accesso predefinita
<a name="private-content-canned-policy-signing-policy-statement"></a>

Per creare il valore per il parametro `Signature` in un URL firmato, devi sottoporre a hashing e firmare la dichiarazione di policy creata in [Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-creating-policy-statement).

Per ulteriori informazioni ed esempi su come sottoporre a hashing, firmare e codificare la dichiarazione di policy, consulta:
+ [Comandi Linux e OpenSSL per la crittografia e la codifica base64](private-content-linux-openssl.md)
+ [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md)

**Nota**  
Gli esempi collegati utilizzano SHA-1 per impostazione predefinita. Per utilizzare invece SHA-256, sostituiscilo `sha1` con `sha256` nei comandi OpenSSL e includi il parametro di `Hash-Algorithm=SHA256` query nell'URL firmato.<a name="private-content-canned-policy-creating-signature-download-procedure"></a>

**Opzione 1: per creare una firma utilizzando una policy predefinita**

1. Utilizzate la funzione hash SHA-1 o SHA-256 e la chiave privata RSA o ECDSA generata per eseguire l'hash e firmare la dichiarazione di policy creata nella procedura. [Per creare la dichiarazione di policy per un URL firmato che utilizza una policy predefinita](#private-content-canned-policy-creating-policy-statement-procedure) Utilizza la versione della dichiarazione di policy che non include più spazi vuoti.

   Se si utilizza SHA-256, è necessario includerlo nell'URL firmato. `&Hash-Algorithm=SHA256`

   Per la chiave privata richiesta dalla funzione hash, utilizza una chiave privata la cui chiave pubblica si trova in un gruppo di chiavi attendibili attivo per la distribuzione.
**Nota**  
Il metodo utilizzato per sottoporre a hashing e firmare la dichiarazione di policy dipende dalla piattaforma e dal linguaggio di programmazione. Per il codice di esempio, consulta [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md).

1. Rimuovi gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla stringa con hash e firmata.

1. Codifica la stringa utilizzando la codifica base64 MIME. Per ulteriori informazioni, vedere [Sezione 6.8, Base64 Content-Transfer-Encoding in RFC 2045,](https://tools.ietf.org/html/rfc2045#section-6.8) *MIME (Multipurpose Internet Mail Extensions), parte prima: Formato dei corpi dei messaggi Internet*.

1. Sostituisci i caratteri non validi nella stringa di query dell'URL con caratteri validi. La tabella seguente elenca i caratteri validi e non validi.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html)

1. Aggiungi il valore risultante all'URL firmato dopo `&Signature=` e ritorna a [Creazione di un URL firmato utilizzando una policy predefinita](#private-content-creating-signed-url-canned-policy-procedure) per completare il concatenamento delle parti dell'URL firmato.

# Creazione di un URL firmato utilizzando una policy personalizzata
<a name="private-content-creating-signed-url-custom-policy"></a>

Per creare un URL firmato utilizzando una policy personalizzata, completa la procedura seguente.<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**Per creare un URL firmato utilizzando una policy personalizzata**

1. Se stai usando .NET o Java per creare un file firmato URLs e se non hai riformattato la chiave privata per la tua coppia di chiavi dal formato.pem predefinito a un formato compatibile con.NET o con Java, fallo ora. Per ulteriori informazioni, consulta [Riformattazione della chiave privata (solo .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Concatena i seguenti valori. Puoi utilizzare il formato in questo URL firmato di esempio.

   

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F&Hash-Algorithm=SHA256
   ```

   Rimuovi tutti gli spazi vuoti (compresi i caratteri di tabulazione e di nuova riga). È possibile che tu debba includere caratteri di escape nella stringa del codice dell'applicazione. Tutti i valori hanno un tipo `String`.  
**1. *Base URL for the file***  
L'URL di base è l' CloudFront URL che utilizzeresti per accedere al file se non utilizzassi signed URLs, inclusi i parametri della stringa di query, se presenti. Nell’esempio precedente, l’URL di base è `https://d111111abcdef8.cloudfront.net/image.jpg`. Per ulteriori informazioni sul formato delle URLs distribuzioni, vedere[Personalizza il formato URL per i file in CloudFront](LinkFormat.md).  
I seguenti esempi mostrano i valori che specifichi per le distribuzioni.  
   + L' CloudFront URL seguente riguarda un file di immagine in una distribuzione (utilizzando il nome di CloudFront dominio). Nota che `image.jpg` è una directory `images`. Il percorso al file nell'URL deve corrispondere al percorso al file nel server HTTP o nel bucket Amazon S3.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + Il seguente CloudFront URL include una stringa di query:

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Di seguito CloudFront URLs sono riportati i file di immagine in una distribuzione. Entrambi utilizzano un nome di dominio alternativo; il secondo include una stringa di query:

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + L' CloudFront URL seguente riguarda un file di immagine in una distribuzione che utilizza un nome di dominio alternativo e il protocollo HTTPS:

     `https://www.example.com/images/image.jpg`  
**2. `?`**  
Il carattere `?` indica che i parametri della stringa di query seguono l’URL di base. Includi il carattere `?` anche senza specificare alcun parametro di query.  
Puoi specificare i seguenti parametri di query in qualsiasi ordine.  
**3. *Your query string parameters, if any*`&`**  
(Facoltativo) Puoi immettere parametri della stringa di query personalizzati. A tale scopo, aggiungi una e commerciale (&) tra ciascuno di essi, ad esempio `color=red&size=medium`. Puoi specificare parametri della stringa di query in qualsiasi ordine all’interno dell’URL.  
I parametri della stringa di query non possono essere denominati `Policy``Signature`,`Key-Pair-Id`, o`Hash-Algorithm`.
Se aggiungi parametri personalizzati, aggiungi un carattere `&` dopo ciascuno di essi, compreso l’ultimo.   
**4. `Policy=`*base64 encoded version of policy statement***  
La dichiarazione di policy in formato JSON, con spazi vuoti rimossi e codifica base64. Per ulteriori informazioni, consulta [Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-statement).  
La dichiarazione di policy controlla l'accesso che un URL firmato concede a un utente. Include l'URL del file, una data e un'ora di scadenza, una data e un'ora facoltative in cui l'URL diventa valido e un indirizzo IP facoltativo o un intervallo di indirizzi IP a cui è consentito accedere al file.  
**5. `&Signature=`*hashed and signed version of the policy statement***  
Una versione con hash, firma e codifica base64 della dichiarazione di policy JSON. Per ulteriori informazioni, consulta [Creazione di una firma per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-creating-signature).  
**6. `&Key-Pair-Id=`*public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature***  
L'ID di una chiave CloudFront pubblica, ad esempio`K2JCJMDEHXQW5F`. L'ID della chiave pubblica indica CloudFront quale chiave pubblica utilizzare per convalidare l'URL firmato. CloudFrontconfronta le informazioni contenute nella firma con quelle contenute nell'informativa per verificare che l'URL non sia stato manomesso.  
Questa chiave pubblica deve appartenere a un gruppo di chiavi che sia un firmatario attendibile nella distribuzione. Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).  
**7. `&Hash-Algorithm=`*SHA1 or SHA256***  
(Facoltativo) L'algoritmo hash utilizzato per creare la firma. I valori supportati sono `SHA1` e `SHA256`. Se non si specifica questo parametro, il valore CloudFront predefinito è. `SHA1`

## Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-statement"></a>

Completa i passaggi seguenti per creare un’istruzione di policy per un URL firmato che utilizza una policy personalizzata.

Per esempi di istruzioni di policy che controllano l'accesso a file in vari modi, consultare [Esempi di dichiarazioni di policy per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-statement-examples).<a name="private-content-custom-policy-creating-policy-procedure"></a>

**Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata**

1. Crea la dichiarazione di policy utilizzando il formato JSON seguente. Sostituisci i simboli minore di (`<`) e maggiore di (`>`) e le relative descrizioni con i tuoi valori. Per ulteriori informazioni, consulta [Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-statement-values).

   ```
   {
       "Statement": [
           {
               "Resource": "<Optional but recommended: URL of the file>",
               "Condition": {
                   "DateLessThan": {
   	                "AWS:EpochTime": <Required: ending date and time in Unix time format and UTC>
                   },
                   "DateGreaterThan": {
   	                "AWS:EpochTime": <Optional: beginning date and time in Unix time format and UTC>
                   },
                   "IpAddress": {
   	                "AWS:SourceIp": "<Optional: IP address>"
                   }
               }
           }
       ]
   }
   ```

   Tenere presente quanto segue:
   + Puoi includere una sola istruzione nella policy.
   + Utilizza la codifica caratteri UTF-8.
   + Includi tutta le punteggiatura e nomi di parametro esattamente come specificato. Le abbreviazioni per i nomi di parametro non sono accettate.
   + L'ordine dei parametri nella sezione `Condition` non è rilevante.
   + Per informazioni sui valori per `Resource`, `DateLessThan`, `DateGreaterThan` e `IpAddress`, consulta [Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-statement-values).

1. Rimuovi tutti gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla dichiarazione di policy. È possibile che tu debba includere caratteri di escape nella stringa del codice dell'applicazione.

1. Codifica la dichiarazione di policy utilizzando la codifica base64 MIME. Per ulteriori informazioni, vedere [Sezione 6.8, Base64 Content-Transfer-Encoding in RFC 2045,](https://tools.ietf.org/html/rfc2045#section-6.8) *MIME (Multipurpose Internet Mail Extensions), parte prima: Formato dei corpi dei messaggi Internet*.

1. Sostituisci i caratteri non validi nella stringa di query dell'URL con caratteri validi. La tabella seguente elenca i caratteri validi e non validi.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Aggiungi il valore risultante al tuo URL firmato dopo `Policy=`.

1. Crea una firma per l'URL firmato sottoponendo a hashing, firmando e codificando in base64 la dichiarazione di policy. Per ulteriori informazioni, consulta [Creazione di una firma per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-creating-signature).

### Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-statement-values"></a>

Quando crei una dichiarazione di policy per una policy personalizzata, specifichi i valori seguenti.

**Risorsa**  
L'URL, incluse tutte le stringhe di query, ma esclusi i parametri,, e. CloudFront `Policy` `Signature` `Key-Pair-Id` `Hash-Algorithm` Esempio:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes`  
Puoi specificare un solo valore URL per `Resource`.  
È possibile omettere il parametro `Resource` in una policy, ma in questo caso chiunque con l’URL firmato può accedere a *tutti* i file in *qualsiasi* distribuzione associata alla coppia di chiavi utilizzata per creare l’URL firmato.
Tenere presente quanto segue:  
+ **Protocollo**: il valore deve iniziare con `http://` `https://` o `*://`.
+ **Parametri della stringa** di query: se l'URL contiene parametri della stringa di query, non utilizzate una barra rovesciata (`\`) per evitare il carattere del punto interrogativo (`?`) che inizia la stringa di query. Esempio:

  `https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`
+ **Caratteri jolly**: puoi utilizzare caratteri jolly nell'URL della policy. Sono supportati i seguenti caratteri jolly:
  + asterisco (`*`), che corrisponde a zero o più caratteri
  + punto interrogativo (`?`), che corrisponde esattamente a un carattere

  Quando l'URL nella policy CloudFront corrisponde all'URL nella richiesta HTTP, l'URL nella policy viene diviso in quattro sezioni: protocol, domain, path e query string, come segue:

  `[protocol]://[domain]/[path]\?[query string]`

  Quando si utilizza un carattere jolly nell'URL nella policy, la corrispondenza con i caratteri jolly si applica solo entro i limiti della sezione che contiene il carattere jolly. Ad esempio, considera questo URL in una policy:

  `https://www.example.com/hello*world`

  In questo esempio, l'asterisco wildcard (`*`) si applica solo all'interno della sezione path, quindi corrisponde a URLs `https://www.example.com/helloworld` and`https://www.example.com/hello-world`, ma non all'URL. `https://www.example.net/hello?world`

  Le seguenti eccezioni si applicano ai limiti delle sezioni per la corrispondenza con i caratteri jolly:
  + Un asterisco finale nella sezione del percorso implica un asterisco nella sezione della stringa di query. Ad esempio, `http://example.com/hello*` è uguale a `http://example.com/hello*\?*`.
  + Un asterisco finale nella sezione del dominio implica un asterisco nelle sezioni del percorso e della stringa di query. Ad esempio, `http://example.com*` è uguale a `http://example.com*/*\?*`.
  + Un URL nella policy può omettere la sezione del protocollo e iniziare con un asterisco nella sezione del dominio. In tal caso, la sezione del protocollo è impostata implicitamente su un asterisco. Ad esempio, l'URL `*example.com` in una policy è equivalente a `*://*example.com/`.
  + Un asterisco da solo (`"Resource": "*"`) corrisponde a qualsiasi URL.

  Ad esempio, il valore: `https://d111111abcdef8.cloudfront.net/*game_download.zip*` in una policy corrisponde a tutti i seguenti valori: URLs
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **Nomi di dominio alternativi**: se specifichi un nome di dominio alternativo (CNAME) nell'URL nella policy, la richiesta HTTP deve utilizzare il nome di dominio alternativo nella pagina Web o nell’applicazione. Non specificare l'URL Amazon S3 per il file in una policy.

**DateLessThan**  
La data e l'ora di scadenza per l'URL in formato Unix (in secondi) e UTC. Nella policy, non racchiudere il valore tra virgolette. Per informazioni sul formato UTC, consultare [Date and Time on the Internet: Timestamps](https://tools.ietf.org/html/rfc3339).  
Ad esempio, la data 31 gennaio 2023 10:00 UTC viene convertita in 1675159200 nel formato Unix.  
Questo è l'unico parametro obbligatorio nella `Condition` sezione. CloudFront richiede questo valore per impedire agli utenti di avere accesso permanente ai tuoi contenuti privati.  
Per ulteriori informazioni, consulta [When CloudFront controlla la data e l'ora di scadenza in un URL firmato](private-content-signed-urls.md#private-content-check-expiration)

**DateGreaterThan (Facoltativo)**  
Una data e un'ora di inizio (facoltative) per l'URL in formato Unix (in secondi) e UTC. Agli utenti non è consentito accedere al file prima o in corrispondenza della data e ora specificate. Non racchiudere il valore tra virgolette. 

**IpAddress (Opzionale)**  
L'indirizzo IP del client che esegue la richiesta HTTP. Tenere presente quanto segue:  
+ Per consentire a qualsiasi indirizzo IP di accedere al file, ometti il parametro `IpAddress`.
+ Puoi specificare un indirizzo IP o un intervallo di indirizzi IP. Non puoi utilizzare la policy per consentire l'accesso se l'indirizzo IP del client si trova in uno dei due intervalli distinti.
+ Per consentire l'accesso da un singolo indirizzo IP, specifica:

  `"`*IPv4 IP address*`/32"`
+ È necessario specificare gli intervalli di indirizzi IP nel formato IPv4 CIDR standard (ad esempio,`192.0.2.0/24`). Per ulteriori informazioni, consultare [Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan](https://tools.ietf.org/html/rfc4632).
**Importante**  
Gli indirizzi IP in IPv6 formato, ad esempio 2001:0 db 8:85 a3: :8a2e: 0370:7334, non sono supportati. 

  Se utilizzi una politica personalizzata che include, non abilitarla per la distribuzione. `IpAddress` IPv6 Se desideri limitare l'accesso ad alcuni contenuti in base all'indirizzo IP e IPv6 alle richieste di supporto per altri contenuti, puoi creare due distribuzioni. Per ulteriori informazioni, consulta [Abilita IPv6 (richieste del visualizzatore)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) nell'argomento [Riferimento a tutte le impostazioni di distribuzione](distribution-web-values-specify.md).

## Esempi di dichiarazioni di policy per un URL firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-statement-examples"></a>

Gli esempi di dichiarazioni di policy seguenti mostrano il modo in cui controllare l'accesso a un determinato file, a tutti i file in una directory o a tutti i file associati a un ID di coppia di chiavi. Gli esempi mostrano inoltre come controllare l'accesso da un singolo indirizzo IP o da un intervallo di indirizzi IP e come impedire agli utenti di utilizzare l'URL firmato dopo una data e un'ora specificate.

Se copi e incolli uno di questi esempi, devi rimuovere gli eventuali spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni), sostituire i valori con i tuoi valori e includere un carattere di nuova riga dopo la parentesi graffa di chiusura (`}`).

Per ulteriori informazioni, consulta [Valori da specificare in una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-statement-values).

**Topics**
+ [Esempio di dichiarazione di policy: accesso a un file da un intervallo di indirizzi IP](#private-content-custom-policy-statement-example-one-object)
+ [Esempio di dichiarazione di policy: accesso a tutti i file in una directory da un intervallo di indirizzi IP](#private-content-custom-policy-statement-example-all-objects)
+ [Esempio di dichiarazione di policy: accesso a tutti i file associati a un ID di coppia di chiavi da un indirizzo IP](#private-content-custom-policy-statement-example-one-ip)

### Esempio di dichiarazione di policy: accesso a un file da un intervallo di indirizzi IP
<a name="private-content-custom-policy-statement-example-one-object"></a>

L'esempio di policy personalizzata seguente in un URL firmato specifica che un utente può accedere al file `https://d111111abcdef8.cloudfront.net/game_download.zip` dagli indirizzi IP nell'intervallo `192.0.2.0/24` fino al 31 gennaio 2023 10:00 UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

### Esempio di dichiarazione di policy: accesso a tutti i file in una directory da un intervallo di indirizzi IP
<a name="private-content-custom-policy-statement-example-all-objects"></a>

Il seguente esempio di politica personalizzata consente di creare un carattere firmato URLs per qualsiasi file nella `training` directory, come indicato dal carattere jolly asterisco (`*`) nel parametro. `Resource` Gli utenti possono accedere al file da un indirizzo IP incluso nell'intervallo `192.0.2.0/24` fino al 31 gennaio 2023 10:00 UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

Ogni URL firmato con cui utilizzi questa policy, dispone di un URL che identifica un file specifico, ad esempio:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### Esempio di dichiarazione di policy: accesso a tutti i file associati a un ID di coppia di chiavi da un indirizzo IP
<a name="private-content-custom-policy-statement-example-one-ip"></a>

La politica personalizzata di esempio seguente consente di creare un carattere firmato URLs per qualsiasi file associato a qualsiasi distribuzione, come indicato dal carattere jolly asterisco (`*`) nel parametro. `Resource` L'URL firmato deve utilizzare il protocollo `https://`, non `http://`. L'utente deve utilizzare l'indirizzo I `192.0.2.10/32`. (il valore `192.0.2.10/32` nella notazione CIDR fa riferimento a un singolo indirizzo IP, `192.0.2.10`). I file sono disponibili solo dal 31 gennaio 2023 10:00 UTC fino al 2 febbraio 2023 10:00 UTC:

```
{
    "Statement": [
       {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1675159200
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675332000
                }
            }
        }
    ]
}
```

Ogni URL firmato con cui utilizzate questa politica ha un URL che identifica un file specifico in una CloudFront distribuzione specifica, ad esempio:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

L'URL firmato include inoltre un ID di coppia di chiavi, che deve essere associato a un gruppo di chiavi attendibili nella distribuzione (d111111abcdef8.cloudfront.net) specificata nell'URL.

## Creazione di una firma per un URL firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-creating-signature"></a>

La firma per un URL firmato che utilizza una policy personalizzata è una versione con firma, hash e codifica base64 della dichiarazione della policy. Per creare una firma per una policy personalizzata, procedi come indicato di seguito.

Per ulteriori informazioni ed esempi su come sottoporre a hashing, firmare e codificare la dichiarazione di policy, consulta:
+ [Comandi Linux e OpenSSL per la crittografia e la codifica base64](private-content-linux-openssl.md)
+ [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md)

**Nota**  
Gli esempi collegati utilizzano SHA-1 per impostazione predefinita. Per utilizzare invece SHA-256, sostituiscilo `sha1` con `sha256` nei comandi OpenSSL e includi il parametro di `Hash-Algorithm=SHA256` query nell'URL firmato.<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**Opzione 1: per creare una firma utilizzando una policy personalizzata**

1. Utilizzate la funzione hash SHA-1 o SHA-256 e la chiave privata RSA o ECDSA generata per eseguire l'hash e firmare la dichiarazione di policy JSON creata nella procedura. [Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](#private-content-custom-policy-creating-policy-procedure) Utilizza la versione della dichiarazione di policy che non include più spazi vuoti, ma che non è ancora stata codificata in base64.

   Se utilizzi SHA-256, devi includerlo nell'URL firmato. `&Hash-Algorithm=SHA256`

   Per la chiave privata richiesta dalla funzione hash, utilizza una chiave privata la cui chiave pubblica si trova in un gruppo di chiavi attendibili attivo per la distribuzione.
**Nota**  
Il metodo utilizzato per sottoporre a hashing e firmare la dichiarazione di policy dipende dalla piattaforma e dal linguaggio di programmazione. Per il codice di esempio, consulta [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md).

1. Rimuovi gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla stringa con hash e firmata.

1. Codifica la stringa utilizzando la codifica base64 MIME. Per ulteriori informazioni, vedere [Sezione 6.8, Base64 Content-Transfer-Encoding in RFC 2045,](https://tools.ietf.org/html/rfc2045#section-6.8) *MIME (Multipurpose Internet Mail Extensions), parte prima: Formato dei corpi dei messaggi Internet*.

1. Sostituisci i caratteri non validi nella stringa di query dell'URL con caratteri validi. La tabella seguente elenca i caratteri validi e non validi.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Aggiungi il valore risultante all'URL firmato dopo `&Signature=` e ritorna a [Per creare un URL firmato utilizzando una policy personalizzata](#private-content-creating-signed-url-custom-policy-procedure) per completare il concatenamento delle parti dell'URL firmato.

# Utilizzo di cookie firmati
<a name="private-content-signed-cookies"></a>

CloudFront i cookie firmati consentono di controllare chi può accedere ai contenuti quando non si desidera modificare quelli correnti URLs o quando si desidera consentire l'accesso a più file con restrizioni, ad esempio tutti i file presenti nell'area riservata agli abbonati di un sito Web. Questo argomento descrive le considerazioni relative all'utilizzo di cookie firmati e come definire cookie firmati utilizzando policy predefinite e personalizzate.

**Topics**
+ [Scelta se utilizzare policy di accesso predefinite o personalizzate per cookie firmati](#private-content-choosing-canned-custom-cookies)
+ [Funzionamento di cookie firmati](#private-content-how-signed-cookies-work)
+ [Prevenzione contro l’uso improprio di cookie firmati](#private-content-signed-cookie-misuse)
+ [When CloudFront controlla la data e l'ora di scadenza in un cookie firmato](#private-content-check-expiration-cookie)
+ [Codice di esempio e strumenti di terza parte.](#private-content-overview-sample-code-cookies)
+ [Impostazione di cookie firmati mediante una policy di accesso predefinita](private-content-setting-signed-cookie-canned-policy.md)
+ [Impostazione di cookie firmati che utilizzano una policy personalizzata](private-content-setting-signed-cookie-custom-policy.md)
+ [Creazione di cookie firmati utilizzando PHP](signed-cookies-PHP.md)

## Scelta se utilizzare policy di accesso predefinite o personalizzate per cookie firmati
<a name="private-content-choosing-canned-custom-cookies"></a>

Quando crei un cookie firmato, scrivi una dichiarazione di policy in formato JSON che specifica le restrizioni sul cookie firmato, ad esempio, il periodo di validità del cookie. Puoi utilizzare policy predefinite o policy personalizzate. La seguente tabella confronta questi due tipi di policy:


****  

| Descrizione | Policy predefinita | Policy personalizzata | 
| --- | --- | --- | 
| Puoi riutilizzare la dichiarazione di policy per più file. Per riutilizzare la dichiarazione di policy, devi utilizzare caratteri jolly nell'oggetto `Resource`. Per ulteriori informazioni, consulta [Valori da specificare in una dichiarazione di policy per cookie firmati che utilizzano una policy personalizzata](private-content-setting-signed-cookie-custom-policy.md#private-content-custom-policy-statement-cookies-values).)  | No | Sì | 
| Puoi specificare la data e l'ora in cui gli utenti possono iniziare ad accedere al tuo contenuto. | No | Sì (facoltativo) | 
| Puoi specificare la data e l'ora in cui gli utenti non possono più accedere al tuo contenuto. | Sì | Sì | 
| Puoi specificare l'indirizzo IP o l'intervallo di indirizzi IP degli utenti che possono accedere al tuo contenuto | No | Sì (facoltativo) | 

Per informazioni sulla creazione di cookie firmati utilizzando una policy predefinita, consulta [Impostazione di cookie firmati mediante una policy di accesso predefinita](private-content-setting-signed-cookie-canned-policy.md).

Per informazioni sulla creazione di cookie firmati utilizzando una policy personalizzata, consulta [Impostazione di cookie firmati che utilizzano una policy personalizzata](private-content-setting-signed-cookie-custom-policy.md).

## Funzionamento di cookie firmati
<a name="private-content-how-signed-cookies-work"></a>

Ecco una panoramica di come CloudFront configuri i cookie firmati e di come CloudFront reagisce quando un utente invia una richiesta che contiene un cookie firmato. 

1. Nella tua CloudFront distribuzione, specifica uno o più gruppi di chiavi affidabili, che contengono le chiavi pubbliche che CloudFront possono essere utilizzate per verificare la firma dell'URL. Utilizzi le chiavi private corrispondenti per firmare il URLs.

   Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).

1. Sviluppa la tua applicazione per determinare se un utente deve avere accesso al tuo contenuto e, in caso affermativo, per inviare tre intestazioni `Set-Cookie` al visualizzatore (Ogni `Set-Cookie` intestazione può contenere solo una coppia nome-valore e un cookie CloudFront firmato richiede tre coppie nome-valore.) Devi inviare le intestazioni `Set-Cookie` al visualizzatore prima che il visualizzatore richieda il tuo contenuto privato. Se hai impostato un breve periodo di scadenza sul cookie, è possibile che tu intenda inviare tre ulteriori intestazioni `Set-Cookie` in risposta a richieste successive, in modo che l'utente continui ad avere accesso.

   In genere, la CloudFront distribuzione avrà almeno due comportamenti di cache, uno che non richiede l'autenticazione e uno che richiede l'autenticazione. La pagina di errore della parte protetta del sito include un redirector o un collegamento a una pagina di login.

   Se configuri la distribuzione per memorizzare nella cache i file basati sui cookie, CloudFront non memorizza nella cache file separati in base agli attributi dei cookie firmati.

1. Un utente accede al tuo sito Web e paga per il contenuto o soddisfa alcuni altri requisiti per l'accesso.

1. La tua applicazione restituisce le intestazioni `Set-Cookie` nella risposta e il visualizzatore archivia la coppia nome-valore.

1. L'utente richiede un file.

   Il browser dell'utente o un altro visualizzatore ottiene le coppie nome-valore della fase 4 e le aggiunge alla richiesta in un'intestazione `Cookie`. Questo è il cookie firmato.

1. CloudFront utilizza la chiave pubblica per convalidare la firma nel cookie firmato e per confermare che il cookie non è stato manomesso. Se la firma non è valida, la richiesta viene respinta.

   Se la firma nel cookie è valida, CloudFront esamina l'informativa contenuta nel cookie (o ne crea una se utilizzi una politica predefinita) per confermare che la richiesta è ancora valida. Ad esempio, se hai specificato una data e un'ora di inizio e di fine per il cookie, CloudFront conferma che l'utente sta tentando di accedere ai tuoi contenuti durante il periodo di tempo in cui desideri consentire l'accesso.

   Se la richiesta soddisfa i requisiti dell'informativa, CloudFront serve i contenuti come per i contenuti non soggetti a restrizioni: determina se il file è già presente nella cache edge, inoltra la richiesta all'origine se necessario e restituisce il file all'utente.

## Prevenzione contro l’uso improprio di cookie firmati
<a name="private-content-signed-cookie-misuse"></a>

Se specifichi il parametro `Domain` in un'intestazione `Set-Cookie`, specifica il valore più preciso possibile per ridurre l'accesso potenziale da parte di un utente con lo stesso nome di dominio radice. Ad esempio, ape.example.com è preferibile a example.com, soprattutto quando non controlli example.com. In questo modo, impedisci agli utenti di accedere al tuo contenuto a partire da www.example.com.

Per impedire questo tipo di attacco, procedi come segue:
+ Escludi gli attributi di cookie `Expires` e `Max-Age`, in modo che l'intestazione `Set-Cookie` crei un cookie di sessione. I cookie di sessione vengono eliminati automaticamente quando l'utente chiude il browser, cosa che riduce la possibilità che qualcuno ottenga accesso non autorizzato al tuo contenuto.
+ Includi l'attributo `Secure`, in modo che il cookie sia crittografato quando un visualizzatore lo include in una richiesta.
+ Quando possibile, utilizza una policy personalizzata e includi l'indirizzo IP del visualizzatore.
+ Nell'attributo `CloudFront-Expires`, specifica la scadenza ragionevole più corta basata sul periodo di tempo durante il quale intendi autorizzare gli utenti ad accedere al tuo contenuto.

## When CloudFront controlla la data e l'ora di scadenza in un cookie firmato
<a name="private-content-check-expiration-cookie"></a>

Per determinare se un cookie firmato è ancora valido, CloudFront controlla la data e l'ora di scadenza nel cookie al momento della richiesta HTTP. Se un client inizia a scaricare un file di grandi dimensioni immediatamente prima della scadenza, il download viene completato anche se la scadenza avviene durante il download. Se la connessione TCP viene interrotta e il client tenta di riavviare il download dopo la scadenza, il download non riesce.

Se un client utilizza Range GETs per ottenere un file in parti più piccole, qualsiasi richiesta GET che si verifica dopo la scadenza avrà esito negativo. Per ulteriori informazioni su Range GETs, vedere[Come CloudFront elabora le richieste parziali per un oggetto (intervallo GETs)](RangeGETs.md).

## Codice di esempio e strumenti di terza parte.
<a name="private-content-overview-sample-code-cookies"></a>

Il codice di esempio per i contenuti privati mostra solo come creare la firma per signed URLs. Tuttavia, il processo per la creazione di una firma per un cookie firmato è molto simile, di conseguenza una gran parte del codice di esempio è ancora rilevante. Per ulteriori informazioni, consultare i seguenti argomenti: 
+ [Creazione di una firma per URL utilizzando Perl](CreateURLPerl.md)
+ [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md)
+ [Crea una firma per URL utilizzando C\$1 e .NET Framework](CreateSignatureInCSharp.md)
+ [Creazione di una firma per URL utilizzando Java](CFPrivateDistJavaDevelopment.md)

# Impostazione di cookie firmati mediante una policy di accesso predefinita
<a name="private-content-setting-signed-cookie-canned-policy"></a>

Per definire un cookie firmato utilizzando una policy predefinita, completa la procedura descritta di seguito. Per creare la firma, consulta [Creazione di una firma per un cookie firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-signature-cookies).<a name="private-content-setting-signed-cookie-canned-policy-procedure"></a>

**Definizione di un cookie firmato utilizzando una policy predefinita**

1. Se utilizzi .NET o Java per creare cookie firmati e non hai riformattato la chiave privata per la coppia di chiavi dal formato default .pem a un formato compatibile con .NET o Java, fallo adesso. Per ulteriori informazioni, consulta [Riformattazione della chiave privata (solo .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programma l'applicazione per inviare tre `Set-Cookie` header a utenti approvati (o quattro, se desideri specificare un algoritmo hash). Sono necessarie tre intestazioni `Set-Cookie` in quanto ogni intestazione `Set-Cookie` può contenere una sola coppia nome-valore e un cookie firmato di CloudFront richiede tre coppie nome-valore. Le coppie nome-valore sono: `CloudFront-Expires`, `CloudFront-Signature` e `CloudFront-Key-Pair-Id`. Facoltativamente, puoi includere una quarta coppia nome-valore per specificare l'algoritmo `CloudFront-Hash-Algorithm` hash utilizzato per la firma. I valori devono essere presenti sul visualizzatore prima che un utente effettui la prima richiesta per un file di cui intendi controllare l'accesso. 
**Nota**  
Come regola generale, ti consigliamo di escludere attributi `Expires` e `Max-Age`. In seguito all'esclusione degli attributi, il browser elimina il cookie quando l'utente chiude il browser e ciò riduce la possibilità che qualcuno ottenga accesso non autorizzato al tuo contenuto. Per ulteriori informazioni, consulta [Prevenzione contro l’uso improprio di cookie firmati](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **I nomi degli attributi di cookie fanno distinzione tra maiuscole e minuscole**. 

   Le interruzioni di riga sono incluse solo per rendere gli attributi più leggibili.

   ```
   Set-Cookie: 
   CloudFront-Expires=date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC); 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Hash-Algorithm=SHA1 or SHA256; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Facoltativo) `Domain`**  
Il nome di dominio per il file richiesto. Se non specifichi un attributo `Domain`, il valore di default è il nome di dominio nell'URL e viene applicato solo al nome di dominio specificato, non ai sottodomini. Se specifichi un attributo `Domain`, è applicabile anche ai sottodomini. Un punto all'inizio del nome di dominio (ad esempio `Domain=.example.com`) è facoltativo. Inoltre, se specifichi un attributo `Domain`, il nome di dominio nell'URL e il valore dell'attributo `Domain` devono corrispondere.  
Puoi specificare il nome di dominio CloudFront assegnato alla tua distribuzione, ad esempio d111111abcdef8.cloudfront.net, ma non puoi specificare \$1.cloudfront.net per il nome di dominio.  
Se desideri utilizzare un nome di dominio alternativo come example.com in, devi aggiungere il nome di dominio alternativo alla tua distribuzione indipendentemente dal fatto che tu specifichi l'attributo. URLs `Domain` Per ulteriori informazioni, consulta [Nomi di dominio alternativi () CNAMEs](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) nell'argomento [Riferimento a tutte le impostazioni di distribuzione](distribution-web-values-specify.md).  
**(Facoltativo) `Path`**  
Il percorso per il file richiesto. Se non si specifichi un attributo `Path`, il valore di default è il percorso nell'URL.  
**`Secure`**  
Richiede al visualizzatore di crittografare i cookie prima dell'invio di una richiesta. Ti consigliamo di inviare l'`Set-Cookie`intestazione tramite una connessione HTTPS per assicurarti che gli attributi del cookie siano protetti dagli attacchi. man-in-the-middle  
**`HttpOnly`**  
Definisce in che modo il browser (ove supportato) interagisce con il valore del cookie. Con`HttpOnly`, i valori dei cookie sono inaccessibili a. JavaScript Questa precauzione può aiutare a mitigare gli attacchi di cross-site scripting (XSS). Per ulteriori informazioni, consulta [Utilizzo di cookie HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies).  
**`CloudFront-Expires`**  
Specifica la data e l'ora di scadenza in formato Unix (in secondi) e UTC. Ad esempio, le 10:00 UTC del 1° gennaio 2026 vengono convertite in 1767290400 nel formato orario Unix.   
Per usare il tempo epoch, specifica un numero intero a 64 bit per una data non posteriore a `9223372036854775807` (venerdì 11 aprile 2262 alle 23:47:16.854 UTC).  
Per informazioni sul formato UTC, consulta *RFC 3339, Date and Time on the Internet: Timestamps*, [https://tools.ietf.org/html/rfc3339](https://tools.ietf.org/html/rfc3339).  
**`CloudFront-Signature`**  
Una versione con hash, firma e codifica base64 di una dichiarazione di policy JSON. Per ulteriori informazioni, consulta [Creazione di una firma per un cookie firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
L'ID di una chiave pubblica, ad esempio,. CloudFront `K2JCJMDEHXQW5F` L'ID della chiave pubblica indica CloudFront quale chiave pubblica utilizzare per convalidare l'URL firmato. CloudFront confronta le informazioni contenute nella firma con quelle contenute nell'informativa per verificare che l'URL non sia stato manomesso.  
Questa chiave pubblica deve appartenere a un gruppo di chiavi che sia un firmatario attendibile nella distribuzione. Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).  
**`CloudFront-Hash-Algorithm`**  
(Facoltativo) L'algoritmo hash utilizzato per creare la firma. I valori supportati sono `SHA1` e `SHA256`. Se non includi questo cookie, l'CloudFront impostazione predefinita è. `SHA1`

L'esempio seguente mostra le `Set-Cookie` intestazioni per un cookie firmato quando utilizzi il nome di dominio associato alla distribuzione in URLs for your files:

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
```

L'esempio seguente mostra le `Set-Cookie` intestazioni per un cookie firmato quando utilizzi il nome di dominio alternativo example.org nella cartella per i tuoi file: URLs 

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/images/*; Secure; HttpOnly
```

Se desideri utilizzare un nome di dominio alternativo come example.com in URLs, devi aggiungere il nome di dominio alternativo alla tua distribuzione indipendentemente dal fatto che tu specifichi l'attributo. `Domain` Per ulteriori informazioni, consulta [Nomi di dominio alternativi () CNAMEs](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) nell'argomento [Riferimento a tutte le impostazioni di distribuzione](distribution-web-values-specify.md).

## Creazione di una firma per un cookie firmato che utilizza una policy di accesso predefinita
<a name="private-content-canned-policy-signature-cookies"></a>

Per creare la firma per un cookie firmato che utilizza una policy di accesso predefinita, completa le seguenti procedure.

**Topics**
+ [Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-statement-cookies)
+ [Firma di una dichiarazione di policy per creare una firma per un cookie firmato che utilizza una policy di accesso predefinita](#private-content-canned-policy-cookies-signing-policy-statement)

### Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy di accesso predefinita
<a name="private-content-canned-policy-statement-cookies"></a>

Quando definisci un cookie firmato che utilizza una policy predefinita, l'attributo `CloudFront-Signature` è una versione con hash e firma di una dichiarazione di policy. Per i cookie firmati che utilizzano una policy predefinita, non includi la dichiarazione di policy nell'intestazione `Set-Cookie`, come avviene per i cookie firmati che utilizzano una policy personalizzata. Per creare una dichiarazione di policy, esegui la procedura descritta di seguito.<a name="private-content-canned-policy-statement-cookies-procedure"></a>

**Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy predefinita**

1. Crea la dichiarazione di policy utilizzando il formato JSON seguente e la codifica caratteri UTF-8. Includi tutta le punteggiatura e altri valori letterali esattamente come specificato. Per informazioni sui parametri `Resource` e `DateLessThan`, consulta [Valori da specificare in una dichiarazione di policy per cookie firmati che utilizzano una policy predefinita](#private-content-canned-policy-statement-cookies-values).

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. Rimuovi tutti gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla dichiarazione di policy. È possibile che tu debba includere caratteri di escape nella stringa del codice dell'applicazione.

#### Valori da specificare in una dichiarazione di policy per cookie firmati che utilizzano una policy predefinita
<a name="private-content-canned-policy-statement-cookies-values"></a>

Quando crei una dichiarazione di policy per una policy predefinita, specifichi i valori seguenti:

**Risorsa**  
L'URL di base che include le eventuali stringhe di query, ad esempio:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Puoi specificare un solo valore per `Resource`.  
Tieni presente quanto segue:  
+ **Protocollo**: il valore deve iniziare con `http://` o `https://`.
+ **Parametri di stringa di query**: se non hai parametri di stringa di query, ometti il punto di domanda.
+ **Nomi di dominio alternativi**: se specifichi un nome di dominio alternativo (CNAME) nell'URL, devi specificarlo quando fai riferimento al file nella pagina Web o nell'applicazione. Non specificare l'URL Amazon S3 per il file.

**DateLessThan**  
La data e l'ora di scadenza per l'URL in formato Unix (in secondi) e UTC. Non racchiudere il valore tra virgolette.  
Ad esempio, 16 marzo 2015 10:00 UTC viene convertito in 1426500000 nel formato Unix.  
Questo valore deve corrispondere al valore dell'attributo `CloudFront-Expires` nell'intestazione `Set-Cookie`. Non racchiudere il valore tra virgolette.  
Per ulteriori informazioni, consulta [When CloudFront controlla la data e l'ora di scadenza in un cookie firmato](private-content-signed-cookies.md#private-content-check-expiration-cookie).

#### Esempio di dichiarazione di policy per una policy predefinita
<a name="private-content-canned-policy-cookies-sample-policy-statement"></a>

Quando utilizzi l'esempio di dichiarazione di policy seguente in un cookie firmato, un utente può accedere al file `https://d111111abcdef8.cloudfront.net/horizon.jpg` fino al 16 marzo 2015 10:00 UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1426500000
                }
            }
        }
    ]
}
```

### Firma di una dichiarazione di policy per creare una firma per un cookie firmato che utilizza una policy di accesso predefinita
<a name="private-content-canned-policy-cookies-signing-policy-statement"></a>

Per creare il valore per l'attributo `CloudFront-Signature` in un'intestazione `Set-Cookie`, sottoponi a hashing e firmi la dichiarazione di policy che hai creato in [Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy predefinita](#private-content-canned-policy-statement-cookies-procedure). 

Per ulteriori informazioni ed esempi su come sottoporre a hashing, firmare e codificare la dichiarazione di policy, consulta i seguenti argomenti:
+ [Comandi Linux e OpenSSL per la crittografia e la codifica base64](private-content-linux-openssl.md)
+ [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md)

**Nota**  
Gli esempi collegati utilizzano SHA-1 per impostazione predefinita. Per utilizzare invece SHA-256, sostituiscilo `sha1` con `sha256` nei comandi OpenSSL e includi il cookie con il `CloudFront-Hash-Algorithm` valore di. `SHA256`<a name="private-content-canned-policy-cookie-creating-signature-procedure"></a>

**Creazione di una firma per un cookie firmato che utilizza una policy predefinita**

1. Utilizzate la funzione hash SHA-1 o SHA-256 e RSA per eseguire l'hash e firmare la dichiarazione politica creata durante la procedura. [Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy predefinita](#private-content-canned-policy-statement-cookies-procedure) Utilizza la versione della dichiarazione di policy che non include più spazi vuoti.

   Se si utilizza SHA-256, è necessario includere il cookie con un valore di. `CloudFront-Hash-Algorithm` `SHA256`

   Per la chiave privata richiesta dalla funzione hash, utilizza una chiave privata la cui chiave pubblica si trova in un gruppo di chiavi attendibili attivo per la distribuzione.
**Nota**  
Il metodo utilizzato per sottoporre a hashing e firmare la dichiarazione di policy dipende dalla piattaforma e dal linguaggio di programmazione. Per il codice di esempio, consulta [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md).

1. Rimuovi gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla stringa con hash e firmata.

1. Codifica la stringa utilizzando la codifica base64 MIME. Per ulteriori informazioni, vedere [Sezione 6.8, Base64 Content-Transfer-Encoding in RFC 2045,](https://tools.ietf.org/html/rfc2045#section-6.8) *MIME (Multipurpose Internet Mail Extensions), parte prima: Formato dei corpi dei messaggi Internet*.

1. Sostituisci i caratteri non validi nella stringa di query dell'URL con caratteri validi. La tabella seguente elenca i caratteri validi e non validi.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-canned-policy.html)

1. Includi il valore risultante nell'intestazione `Set-Cookie` per la coppia nome-valore `CloudFront-Signature`. Quindi ritorna a [Definizione di un cookie firmato utilizzando una policy predefinita](#private-content-setting-signed-cookie-canned-policy-procedure) e aggiungi l'intestazione `Set-Cookie` per `CloudFront-Key-Pair-Id`.

# Impostazione di cookie firmati che utilizzano una policy personalizzata
<a name="private-content-setting-signed-cookie-custom-policy"></a>

Per definire un cookie firmato che utilizza una policy personalizzata, procedi come indicato di seguito.<a name="private-content-setting-signed-cookie-custom-policy-procedure"></a>

**Impostazione di un cookie firmato che utilizza una policy personalizzata**

1. Se stai usando .NET o Java per creare un file firmato URLs e se non hai riformattato la chiave privata per la tua coppia di chiavi dal formato.pem predefinito a un formato compatibile con.NET o con Java, fallo ora. Per ulteriori informazioni, consulta [Riformattazione della chiave privata (solo .NET e Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programma l'applicazione per inviare tre `Set-Cookie` intestazioni ai visualizzatori approvati (o quattro, se desideri specificare un algoritmo hash). Sono necessarie tre `Set-Cookie` intestazioni perché ogni `Set-Cookie` intestazione può contenere solo una coppia nome-valore e un CloudFront cookie firmato richiede tre coppie nome-valore. Le coppie nome-valore sono: `CloudFront-Policy`, `CloudFront-Signature` e `CloudFront-Key-Pair-Id`. Facoltativamente, puoi includere una quarta coppia nome-valore per specificare l'algoritmo hash utilizzato per `CloudFront-Hash-Algorithm` la firma. I valori devono essere presenti sul visualizzatore prima che un utente effettui la prima richiesta per un file di cui intendi controllare l'accesso. 
**Nota**  
Come regola generale, ti consigliamo di escludere attributi `Expires` e `Max-Age`. Ciò comporta l'eliminazione del cookie da parte del browser quando l'utente chiude il browser, cosa che riduce la possibilità che qualcuno ottenga accesso non autorizzato al tuo contenuto. Per ulteriori informazioni, consulta [Prevenzione contro l’uso improprio di cookie firmati](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **I nomi degli attributi di cookie fanno distinzione tra maiuscole e minuscole**. 

   Le interruzioni di riga sono incluse solo per rendere gli attributi più leggibili.

   ```
   Set-Cookie: 
   CloudFront-Policy=base64 encoded version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Hash-Algorithm=SHA1 or SHA256; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Facoltativo) `Domain`**  
Il nome di dominio per il file richiesto. Se non specifichi un attributo `Domain`, il valore di default è il nome di dominio nell'URL e viene applicato solo al nome di dominio specificato, non ai sottodomini. Se specifichi un attributo `Domain`, è applicabile anche ai sottodomini. Un punto all'inizio del nome di dominio (ad esempio `Domain=.example.com`) è facoltativo. Inoltre, se specifichi un attributo `Domain`, il nome di dominio nell'URL e il valore dell'attributo `Domain` devono corrispondere.  
Puoi specificare il nome di dominio CloudFront assegnato alla tua distribuzione, ad esempio d111111abcdef8.cloudfront.net, ma non puoi specificare \$1.cloudfront.net per il nome di dominio.  
Se desideri utilizzare un nome di dominio alternativo come example.com in, devi aggiungere il nome di dominio alternativo alla tua distribuzione indipendentemente dal fatto che tu specifichi l'attributo. URLs `Domain` Per ulteriori informazioni, consulta [Nomi di dominio alternativi () CNAMEs](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) nell'argomento [Riferimento a tutte le impostazioni di distribuzione](distribution-web-values-specify.md).  
**(Facoltativo) `Path`**  
Il percorso per il file richiesto. Se non si specifichi un attributo `Path`, il valore di default è il percorso nell'URL.  
**`Secure`**  
Richiede al visualizzatore di crittografare i cookie prima dell'invio di una richiesta. Ti consigliamo di inviare l'`Set-Cookie`intestazione tramite una connessione HTTPS per assicurarti che gli attributi del cookie siano protetti dagli attacchi. man-in-the-middle  
**`HttpOnly`**  
Richiede al visualizzatore di inviare il cookie solo nelle richieste HTTP o HTTPS.  
**`CloudFront-Policy`**  
La dichiarazione di policy in formato JSON, con spazi vuoti rimossi e codifica base64. Per ulteriori informazioni, consulta [Creazione di una firma per un cookie firmato che utilizza una policy personalizzata](#private-content-custom-policy-signature-cookies).  
La dichiarazione di policy controlla l'accesso che un cookie firmato concede a un utente. Include i file a cui l'utente può accedere, una data e un'ora di scadenza, una data e un'ora facoltative in cui l'URL diventa valido e un indirizzo IP facoltativo o un intervallo di indirizzi IP a cui è consentito accedere al file.  
**`CloudFront-Signature`**  
Una versione con hash, firma e codifica base64 della dichiarazione di policy JSON. Per ulteriori informazioni, consulta [Creazione di una firma per un cookie firmato che utilizza una policy personalizzata](#private-content-custom-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
L'ID di una chiave CloudFront pubblica, ad esempio,`K2JCJMDEHXQW5F`. L'ID della chiave pubblica indica CloudFront quale chiave pubblica utilizzare per convalidare l'URL firmato. CloudFrontconfronta le informazioni contenute nella firma con quelle contenute nell'informativa per verificare che l'URL non sia stato manomesso.  
Questa chiave pubblica deve appartenere a un gruppo di chiavi che sia un firmatario attendibile nella distribuzione. Per ulteriori informazioni, consulta [Specificate i firmatari che possono creare cookie firmati e firmati URLs](private-content-trusted-signers.md).  
**`CloudFront-Hash-Algorithm`**  
(Facoltativo) L'algoritmo hash utilizzato per creare la firma. I valori supportati sono `SHA1` e `SHA256`. Se non includi questo cookie, l'CloudFront impostazione predefinita è. `SHA1`

## Intestazioni `Set-Cookie` di esempio per policy personalizzate
<a name="example-set-cookie-headers-custom-policy"></a>

Vedi i seguenti esempi di coppie di intestazioni `Set-Cookie`. 

Se desideri utilizzare un nome di dominio alternativo come example.org in URLs, devi aggiungere il nome di dominio alternativo alla tua distribuzione indipendentemente dal fatto che tu specifichi l'attributo. `Domain` Per ulteriori informazioni, consulta [Nomi di dominio alternativi () CNAMEs](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) nell'argomento [Riferimento a tutte le impostazioni di distribuzione](distribution-web-values-specify.md).

**Example Esempio 1**  
Puoi utilizzare le `Set-Cookie` intestazioni per un cookie firmato quando utilizzi il nome di dominio associato alla tua distribuzione in for your files. URLs   

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Esempio 2**  
Puoi utilizzare le `Set-Cookie` intestazioni per un cookie firmato quando utilizzi un nome di dominio alternativo (example.org) nella cartella per i tuoi file. URLs   

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

**Example Esempio 3**  
Puoi utilizzare le coppie di `Set-Cookie` intestazioni per una richiesta firmata quando utilizzi il nome di dominio associato alla tua distribuzione in for your files. URLs   

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Esempio 4**  
Puoi utilizzare le coppie di `Set-Cookie` intestazioni per una richiesta firmata quando utilizzi un nome di dominio alternativo (example.org) associato alla tua distribuzione nella sezione per i tuoi file. URLs   

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Hash-Algorithm=SHA256; Domain=example.org; Path=/; Secure; HttpOnly
```

## Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-statement-cookies"></a>

Per creare una dichiarazione di policy per una policy personalizzata, completa i seguenti passaggi. Per vari esempi di dichiarazioni di policy che controllano l'accesso a file in vari modi, consulta [Esempi di dichiarazioni di policy per un cookie firmato che utilizza una policy personalizzata](#private-content-custom-policy-statement-signed-cookies-examples).<a name="private-content-custom-policy-statement-cookies-procedure"></a>

**Creazione di una dichiarazione di policy per un cookie firmato che utilizza una policy personalizzata**

1. Crea la dichiarazione di policy utilizzando il formato JSON seguente.

   ```
   {
       "Statement": [
           {
               "Resource": "URL of the file",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime":required ending date and time in Unix time format and UTC
                   },
                   "DateGreaterThan": {
                       "AWS:EpochTime":optional beginning date and time in Unix time format and UTC
                   },
                   "IpAddress": {
                       "AWS:SourceIp": "optional IP address"
                   }
               }
           }
       ]
   }
   ```

   Tieni presente quanto segue:
   + Puoi includere solo una dichiarazione.
   + Utilizza la codifica caratteri UTF-8.
   + Includi tutta le punteggiatura e nomi di parametro esattamente come specificato. Le abbreviazioni per i nomi di parametro non sono accettate.
   + L'ordine dei parametri nella sezione `Condition` non è rilevante.
   + Per informazioni sui valori per `Resource`, `DateLessThan`, `DateGreaterThan` e `IpAddress`, consulta [Valori da specificare in una dichiarazione di policy per cookie firmati che utilizzano una policy personalizzata](#private-content-custom-policy-statement-cookies-values).

1. Rimuovi tutti gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla dichiarazione di policy. È possibile che tu debba includere caratteri di escape nella stringa del codice dell'applicazione.

1. Codifica la dichiarazione di policy utilizzando la codifica base64 MIME. Per ulteriori informazioni, vedere [Sezione 6.8, Base64 Content-Transfer-Encoding in RFC 2045,](https://tools.ietf.org/html/rfc2045#section-6.8) *MIME (Multipurpose Internet Mail Extensions),* parte prima: Formato dei corpi dei messaggi Internet.

1. Sostituisci i caratteri non validi nella stringa di query dell'URL con caratteri validi. La tabella seguente elenca i caratteri validi e non validi.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Includi il valore risultante nella tua intestazione `Set-Cookie` dopo `CloudFront-Policy=`.

1. Crea una firma per l'intestazione `Set-Cookie` per `CloudFront-Signature` sottoponendo a hashing, firmando e codificando in base64 la dichiarazione di policy. Per ulteriori informazioni, consulta [Creazione di una firma per un cookie firmato che utilizza una policy personalizzata](#private-content-custom-policy-signature-cookies).

### Valori da specificare in una dichiarazione di policy per cookie firmati che utilizzano una policy personalizzata
<a name="private-content-custom-policy-statement-cookies-values"></a>

Quando crei una dichiarazione di policy per una policy personalizzata, specifichi i valori seguenti.

**Risorsa**  
L'URL di base che include le eventuali stringhe di query:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Se ometti il parametro `Resource`, gli utenti possono accedere a tutti i file associati a qualsiasi distribuzione associata alla coppia di chiavi che utilizzi per creare l'URL firmato.
Puoi specificare un solo valore per `Resource`.  
Tieni presente quanto segue:  
+ **Protocollo**: il valore deve iniziare con `http://` o `https://`.
+ **Parametri di stringa di query**: se non hai parametri di stringa di query, ometti il punto di domanda.
+ **Caratteri jolly**: puoi utilizzare il carattere jolly che corrisponde a zero o più caratteri (\$1) o il carattere jolly che corrisponde esattamente a un carattere (?) in qualsiasi punto della stringa. Ad esempio, il valore:

  `https://d111111abcdef8.cloudfront.net/*game_download.zip*`

  includerebbe (ad esempio) i seguenti file:
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **Nomi di dominio alternativi**: se specifichi un nome di dominio alternativo (CNAME) nell'URL, devi specificarlo quando fai riferimento al file nella pagina Web o nell'applicazione. Non specificare l'URL Amazon S3 per il file.

**DateLessThan**  
La data e l'ora di scadenza per l'URL in formato Unix (in secondi) e UTC. Non racchiudere il valore tra virgolette.  
Ad esempio, 16 marzo 2015 10:00 UTC viene convertito in 1426500000 nel formato Unix.  
Per ulteriori informazioni, consulta [When CloudFront controlla la data e l'ora di scadenza in un cookie firmato](private-content-signed-cookies.md#private-content-check-expiration-cookie).

**DateGreaterThan (Facoltativo)**  
Una data e un'ora di inizio (facoltative) per l'URL in formato Unix (in secondi) e UTC. Agli utenti non è consentito accedere al file prima o in corrispondenza della data e ora specificate. Non racchiudere il valore tra virgolette. 

**IpAddress (Opzionale)**  
L'indirizzo IP del client che esegue la richiesta GET. Tieni presente quanto segue:  
+ Per consentire a qualsiasi indirizzo IP di accedere al file, ometti il parametro `IpAddress`.
+ Puoi specificare un indirizzo IP o un intervallo di indirizzi IP. Ad esempio, non puoi definire la policy per consentire l'accesso se l'indirizzo IP del client è in uno dei due intervalli distinti.
+ Per consentire l'accesso da un singolo indirizzo IP, specifica:

  `"`*IPv4 IP address*`/32"`
+ È necessario specificare gli intervalli di indirizzi IP nel formato IPv4 CIDR standard (ad esempio,`192.0.2.0/24`). Per ulteriori informazioni, consulta *RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan*, [https://tools.ietf.org/html/rfc4632](https://tools.ietf.org/html/rfc4632).
**Importante**  
Gli indirizzi IP in IPv6 formato, ad esempio 2001:0 db 8:85 a3: :8a2e: 0370:7334, non sono supportati. 

  Se utilizzi una politica personalizzata che include, non abilitarla per la distribuzione. `IpAddress` IPv6 Se desideri limitare l'accesso ad alcuni contenuti in base all'indirizzo IP e IPv6 alle richieste di supporto per altri contenuti, puoi creare due distribuzioni. Per ulteriori informazioni, consulta [Abilita IPv6 (richieste del visualizzatore)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) nell'argomento [Riferimento a tutte le impostazioni di distribuzione](distribution-web-values-specify.md).

## Esempi di dichiarazioni di policy per un cookie firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-statement-signed-cookies-examples"></a>

Gli esempi di dichiarazioni di policy seguenti mostrano il modo in cui controllare l'accesso a un determinato file, a tutti i file in una directory o a tutti i file associati a un ID di coppia di chiavi. Gli esempi mostrano inoltre come controllare l'accesso da un singolo indirizzo IP o da un intervallo di indirizzi IP e come impedire agli utenti di utilizzare il cookie firmato dopo una data e un'ora specificate.

Se copi e incolli uno di questi esempi, devi rimuovere gli eventuali spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni), sostituire i valori con i tuoi valori e includere un carattere di nuova riga dopo la parentesi graffa di chiusura ( \$1 ).

Per ulteriori informazioni, consulta [Valori da specificare in una dichiarazione di policy per cookie firmati che utilizzano una policy personalizzata](#private-content-custom-policy-statement-cookies-values).

**Topics**
+ [Esempio di dichiarazione di policy: accesso a un file da un intervallo di indirizzi IP](#private-content-custom-policy-statement-signed-cookies-example-one-object)
+ [Esempio di dichiarazione di policy: accesso a tutti i file in una directory da un intervallo di indirizzi IP](#private-content-custom-policy-statement-signed-cookies-example-all-objects)
+ [Esempio di dichiarazione di policy: accesso a tutti i file associati a un ID di coppia di chiavi da un indirizzo IP](#private-content-custom-policy-statement-signed-cookies-example-one-ip)

### Esempio di dichiarazione di policy: accesso a un file da un intervallo di indirizzi IP
<a name="private-content-custom-policy-statement-signed-cookies-example-one-object"></a>

L'esempio seguente di policy personalizzata in un cookie firmato specifica che un utente può accedere al file `https://d111111abcdef8.cloudfront.net/game_download.zip` dagli indirizzi IP nell'intervallo `192.0.2.0/24` fino al 1° gennaio 2013 10:00 UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/game_download.zip",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### Esempio di dichiarazione di policy: accesso a tutti i file in una directory da un intervallo di indirizzi IP
<a name="private-content-custom-policy-statement-signed-cookies-example-all-objects"></a>

L'esempio di policy personalizzata seguente consente di creare cookie firmati per qualsiasi file nella directory `training`, come indicato dal carattere jolly \$1 nel parametro `Resource`. Gli utenti possono accedere al file da un indirizzo IP incluso nell'intervallo `192.0.2.0/24` fino al 1° gennaio 2013 10:00 UTC:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

Ogni cookie firmato in cui utilizzi questa policy include un URL di base che identifica un file specifico, ad esempio:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### Esempio di dichiarazione di policy: accesso a tutti i file associati a un ID di coppia di chiavi da un indirizzo IP
<a name="private-content-custom-policy-statement-signed-cookies-example-one-ip"></a>

L'esempio di policy personalizzata seguente ti consente di definire cookie firmati per qualsiasi file associato a qualsiasi distribuzione, come indicato dal carattere jolly \$1 nel parametro `Resource`. L'utente deve utilizzare l'indirizzo I `192.0.2.10/32`. (il valore `192.0.2.10/32` nella notazione CIDR fa riferimento a un singolo indirizzo IP, `192.0.2.10`). I file sono disponibili solo dal 1° gennaio 2013 10:00 UTC fino al 2 gennaio 2013 10:00 UTC:

```
{
    "Statement": [
        {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1767290400
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767376800
                }
            }
        }
    ]
}
```

Ogni cookie firmato in cui si utilizza questa politica include un URL di base che identifica un file specifico in una CloudFront distribuzione specifica, ad esempio:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

Il cookie firmato include inoltre un ID di coppia di chiavi, che deve essere associato a un firmatario attendibile nella distribuzione (d111111abcdef8.cloudfront.net) specificato nell'URL di base.

## Creazione di una firma per un cookie firmato che utilizza una policy personalizzata
<a name="private-content-custom-policy-signature-cookies"></a>

La firma di un cookie firmato che utilizza una policy personalizzata è una versione con hash, firma e codifica base64 della dichiarazione di policy. 

Per ulteriori informazioni ed esempi su come sottoporre a hashing, firmare e codificare la dichiarazione di policy, consulta:
+ [Comandi Linux e OpenSSL per la crittografia e la codifica base64](private-content-linux-openssl.md)
+ [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md)

**Nota**  
Gli esempi collegati utilizzano SHA-1 per impostazione predefinita. Per utilizzare invece SHA-256, sostituiscilo `sha1` con `sha256` nei comandi OpenSSL e includi il cookie con il `CloudFront-Hash-Algorithm` valore di. `SHA256`<a name="private-content-custom-policy-signature-cookies-procedure"></a>

**Creazione di una firma per un cookie firmato utilizzando una policy personalizzata**

1. Utilizzate la funzione hash SHA-1 o SHA-256 e RSA per eseguire l'hash e firmare la dichiarazione di policy JSON creata durante la procedura. [Creazione di una dichiarazione di policy per un URL firmato che utilizza una policy personalizzata](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-creating-policy-procedure) Utilizza la versione della dichiarazione di policy che non include più spazi vuoti, ma che non è ancora stata codificata in base64.

   Se si utilizza SHA-256, è necessario includere il cookie con un valore di. `CloudFront-Hash-Algorithm` `SHA256`

   Per la chiave privata richiesta dalla funzione hash, utilizza una chiave privata la cui chiave pubblica si trova in un gruppo di chiavi attendibili attivo per la distribuzione.
**Nota**  
Il metodo utilizzato per sottoporre a hashing e firmare la dichiarazione di policy dipende dalla piattaforma e dal linguaggio di programmazione. Per il codice di esempio, consulta [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md).

1. Rimuovi gli spazi vuoti (inclusi i caratteri di nuova riga e le tabulazioni) dalla stringa con hash e firmata.

1. Codifica la stringa utilizzando la codifica base64 MIME. Per ulteriori informazioni, vedere [Sezione 6.8, Base64 Content-Transfer-Encoding in RFC 2045,](https://tools.ietf.org/html/rfc2045#section-6.8) *MIME (Multipurpose Internet Mail Extensions), parte prima: Formato dei corpi dei messaggi Internet*.

1. Sostituisci i caratteri non validi nella stringa di query dell'URL con caratteri validi. La tabella seguente elenca i caratteri validi e non validi.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Includi il valore risultante nell'intestazione `Set-Cookie` per la coppia nome-valore `CloudFront-Signature=` e ritorna a [Impostazione di un cookie firmato che utilizza una policy personalizzata](#private-content-setting-signed-cookie-custom-policy-procedure) per aggiungere l'intestazione `Set-Cookie` per `CloudFront-Key-Pair-Id`.

# Creazione di cookie firmati utilizzando PHP
<a name="signed-cookies-PHP"></a>

Il seguente esempio di codice è simile all’esempio in [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md) in quanto crea un collegamento a un video. Tuttavia, invece di firmare l’URL nel codice, questo esempio firma i cookie con la funzione `create_signed_cookies()`. Il player lato client utilizza i cookie per autenticare ogni richiesta alla distribuzione. CloudFront

Questo approccio è utile per lo streaming di contenuti, come HTTP Live Streaming (HLS) o Dynamic Adaptive Streaming over HTTP (DASH), in cui il client deve effettuare più richieste per recuperare il manifesto, i segmenti e gli asset di riproduzione correlati. Utilizzando i cookie firmati, il client può autenticare ogni richiesta senza dover generare un nuovo URL firmato per ogni segmento. 

**Nota**  
La creazione di una firma URL è solo una parte del processo di gestione di contenuti privati tramite cookie firmati. Per ulteriori informazioni, consulta [Utilizzo di cookie firmati](private-content-signed-cookies.md).



**Topics**
+ [Crea la firma RSA SHA-1 o SHA-256](#create-rsa-sha-1signature-cookies)
+ [Creazione di cookie firmati](#create-the-signed-cookie)
+ [Codice completo](#full-code-signed-cookies)

Nelle sezioni seguenti, l’esempio di codice viene suddiviso in singole parti. Di seguito è riportato l’[esempio di codice](#full-code-signed-cookies) completo.

## Crea la firma RSA SHA-1 o SHA-256
<a name="create-rsa-sha-1signature-cookies"></a>

In questo codice di esempio vengono eseguite le seguenti operazioni:

1. La funzione esegue l'`rsa_sha1_sign`hashing e firma l'informativa sulla politica utilizzando SHA-1. Per utilizzare invece SHA-256, utilizzate la funzione rsa\$1sha256\$1sign mostrata di seguito. Gli argomenti richiesti sono una dichiarazione di policy e la chiave privata che corrisponde a una chiave pubblica appartenente a un gruppo di chiavi attendibili per la distribuzione.

1. Successivamente, la funzione `url_safe_base64_encode` crea una versione URL-safe della firma.

   ```
   function rsa_sha1_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid);
       openssl_free_key($pkeyid);
       return $signature;
   }
   
   function url_safe_base64_encode($value) {
       $encoded = base64_encode($value);
       return str_replace(
           array('+', '=', '/'),
           array('-', '_', '~'),
           $encoded);
   }
   ```

   La seguente funzione utilizza SHA-256 anziché SHA-1:

   ```
   function rsa_sha256_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
       openssl_free_key($pkeyid);
       return $signature;
   }
   ```

   La `rsa_sha256_sign` funzione è la stessa di`rsa_sha1_sign`, tranne per il fatto che passa a. `OPENSSL_ALGO_SHA256` `openssl_sign` Quando usi SHA-256, includi il `CloudFront-Hash-Algorithm` cookie con un valore di. `SHA256`

## Creazione di cookie firmati
<a name="create-the-signed-cookie"></a>

Il codice seguente costruisce a crea i cookie firmati, utilizzando i seguenti attributi dei cookie:`CloudFront-Expires`, `CloudFront-Signature` e. `CloudFront-Key-Pair-Id` `CloudFront-Hash-Algorithm` Il codice utilizza una policy personalizzata.

```
function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null, $hash_algorithm = 'SHA1') {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    if ($hash_algorithm === 'SHA256') {
        $signature = rsa_sha256_sign($policy, $private_key_filename);
    } else {
        $signature = rsa_sha1_sign($policy, $private_key_filename);
    }
    $encoded_signature = url_safe_base64_encode($signature);

    $cookies = array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );

    if ($hash_algorithm === 'SHA256') {
        $cookies['CloudFront-Hash-Algorithm'] = 'SHA256';
    }

    return $cookies;
}
```

Per ulteriori informazioni, consulta [Impostazione di cookie firmati che utilizzano una policy personalizzata](private-content-setting-signed-cookie-custom-policy.md).

## Codice completo
<a name="full-code-signed-cookies"></a>

Il codice di esempio seguente fornisce una dimostrazione completa della creazione di cookie CloudFront firmati con PHP. Puoi scaricare l’esempio completo dal file [demo-php.zip](samples/demo-php.zip).

Nell'esempio seguente, è possibile modificare l'`$policy Condition`elemento per consentire sia gli intervalli di indirizzi che gli intervalli IPv4 di IPv6 indirizzi. Per un esempio, [ IPv6 consulta Using address in IAM policies](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) nella *Amazon Simple Storage Service User Guide*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid);
    openssl_free_key($pkeyid);
    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function rsa_sha256_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
    openssl_free_key($pkeyid);
    return $signature;
}

function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null, $hash_algorithm = 'SHA1') {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    if ($hash_algorithm === 'SHA256') {
        $signature = rsa_sha256_sign($policy, $private_key_filename);
    } else {
        $signature = rsa_sha1_sign($policy, $private_key_filename);
    }
    $encoded_signature = url_safe_base64_encode($signature);

    $cookies = array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );

    if ($hash_algorithm === 'SHA256') {
        $cookies['CloudFront-Hash-Algorithm'] = 'SHA256';
    }

    return $cookies;
}



$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';
$base_url = 'https://d1234.cloudfront.net';

$expires = time() + 3600; // 1 hour from now

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];


// For HLS manifest and segments (using wildcard)
$hls_resource = $base_url . '/sign/*';
$signed_cookies = create_signed_cookies($hls_resource, $private_key_filename, $key_pair_id, $expires, $client_ip, 'SHA256');

// Set the cookies
$cookie_domain = parse_url($base_url, PHP_URL_HOST);
foreach ($signed_cookies as $name => $value) {
    setcookie($name, $value, $expires, '/', $cookie_domain, true, true);
}

?>

<!DOCTYPE html>
<html>
<head>
    <title>CloudFront Signed HLS Stream with Cookies</title>
</head>
<body>
    <h1>Amazon CloudFront Signed HLS Stream with Cookies</h1>
    <h2>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h2>
    
    <div id='hls-video'>
        <video id="video" width="640" height="360" controls></video>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        var video = document.getElementById('video');
        var manifestUrl = '<?php echo $base_url; ?>/sign/manifest.m3u8';
        
        if (Hls.isSupported()) {
            var hls = new Hls();
            hls.loadSource(manifestUrl);
            hls.attachMedia(video);
        }
        else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = manifestUrl;
        }
    </script>
</body>
</html>
```

Invece di utilizzare cookie firmati, puoi utilizzare cookie firmati URLs. Per ulteriori informazioni, consulta [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md).

# Comandi Linux e OpenSSL per la crittografia e la codifica base64
<a name="private-content-linux-openssl"></a>

Puoi utilizzare il seguente comando della riga di comando Linux e OpenSSL per sottoporre a hashing e firmare la dichiarazione di policy, codificare in base64 la firma e sostituire i caratteri non validi nei parametri di stringa di query degli URL con caratteri validi.

Per informazioni su OpenSSL, consulta [https://www.openssl.org](https://www.openssl.org).

SHA-1 (impostazione predefinita):

```
cat policy | tr -d "\n" | tr -d " \t\n\r" | openssl sha1 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'
```

SHA-256:

```
cat policy | tr -d "\n" | tr -d " \t\n\r" | openssl sha256 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'
```

Nel precedente comando:
+ `cat` legge il file `policy`.
+ `tr -d "\n" | tr -d " \t\n\r"` rimuove gli spazi e il carattere di nuova riga aggiunti da `cat`.
+ OpenSSL esegue l'hash del file utilizzando SHA-1 (o SHA-256) e lo firma utilizzando il file della chiave privata. `private_key.pem` La firma chiave privata può essere RSA 2048 o ECDSA 256. Se utilizzi SHA-256, includi il parametro di `Hash-Algorithm=SHA256` query nell'URL firmato o il cookie per i cookie firmati. `CloudFront-Hash-Algorithm=SHA256`
+ OpenSSL codifica in base64 la dichiarazione di policy con hash e firmata.
+ `tr` sostituisce i caratteri non validi nei parametri di stringa di query dell’URL con caratteri validi.

Per ulteriori codici di esempio che illustrano la creazione di una firma, consulta [Codice di esempio per la creazione di una firma per un URL firmato](PrivateCFSignatureCodeAndExamples.md).

# Codice di esempio per la creazione di una firma per un URL firmato
<a name="PrivateCFSignatureCodeAndExamples"></a>

Questa sezione include esempi di applicazioni scaricabili che dimostrano come creare firme per signed. URLs Vengono forniti esempi in Perl, PHP, C\$1 e Java. È possibile utilizzare uno qualsiasi degli esempi per creare firme firmate. URLs Lo script Perl viene eseguito su piattaforme Linux e macOS. L'esempio PHP funzionerà su qualsiasi server che esegue PHP. L'esempio C\$1 utilizza .NET Framework.

Gli esempi di questa sezione utilizzano SHA-1 per eseguire l'hash e firmare la dichiarazione politica. È inoltre possibile utilizzare SHA-256. Per usare SHA-256, aggiorna l'algoritmo hash nella funzione di firma (ad esempio, sostituiscilo con `sha1` nelle chiamate `sha256` OpenSSL o usa la costante SHA-256 equivalente nella libreria crittografica della tua lingua). Quando usi SHA-256, includi il parametro di query nell'URL firmato. `Hash-Algorithm=SHA256`

Ad esempio, codice in JavaScript (Node.js), consulta [Creazione di Amazon CloudFront Signed URLs in Node.js](https://aws.amazon.com/blogs/developer/creating-amazon-cloudfront-signed-urls-in-node-js/) sul blog AWS degli sviluppatori.

[Per un esempio di codice in Python, consulta [Generare un URL firmato per Amazon CloudFront](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudfront.html#examples) nell'API di riferimento dell'*AWS SDK for Python (Boto3) e questo codice di esempio nel repository Boto3*.](https://github.com/boto/boto3/blob/develop/boto3/examples/cloudfront.rst) GitHub 

**Topics**
+ [Creazione di una firma per URL utilizzando Perl](CreateURLPerl.md)
+ [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md)
+ [Crea una firma per URL utilizzando C\$1 e .NET Framework](CreateSignatureInCSharp.md)
+ [Creazione di una firma per URL utilizzando Java](CFPrivateDistJavaDevelopment.md)

# Creazione di una firma per URL utilizzando Perl
<a name="CreateURLPerl"></a>

Questa sezione include uno script Perl per Linux/Mac piattaforme che è possibile utilizzare per creare la firma per contenuti privati. Per creare la firma, esegui lo script con argomenti della riga di comando che specificano l' CloudFront URL, il percorso della chiave privata del firmatario, l'ID della chiave e una data di scadenza dell'URL. Lo strumento può anche decodificare i segni firmati. URLs 

**Note**  
La creazione di una firma per URL è solo una parte del processo di distribuzione di contenuto privato mediante un URL firmato. Per ulteriori informazioni sul end-to-end processo, vedere[Usa firmato URLs](private-content-signed-urls.md). 
Nel comando di firma, nota che `sha1` può essere sostituito con `sha256` nella `openssl dgst` chiamata.

**Topics**
+ [Origine dello script Perl per la creazione di un URL firmato](#CreateURLPerlScriptSource)

## Origine dello script Perl per la creazione di un URL firmato
<a name="CreateURLPerlScriptSource"></a>

Il seguente codice sorgente Perl può essere usato per creare un URL firmato per CloudFront. I commenti del codice includono informazioni sulle opzioni della riga di comando e le caratteristiche dello strumento.

```
#!/usr/bin/perl -w

# Copyright 2008 Amazon Technologies, Inc.  Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. You may obtain a copy of the License at:
#
# https://aws.amazon.com/apache2.0
#
# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.

=head1 cfsign.pl

cfsign.pl - A tool to generate and verify Amazon CloudFront signed URLs

=head1 SYNOPSIS

This script uses an existing RSA key pair to sign and verify Amazon CloudFront signed URLs

View the script source for details as to which CPAN packages are required beforehand. 

For help, try:

cfsign.pl --help

URL signing examples:

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --policy sample_policy.json --private-key privkey.pem --key-pair-id mykey

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --expires 1257439868 --private-key privkey.pem --key-pair-id mykey

URL decode example:

cfsign.pl --action decode --url "http//mydist.cloudfront.net/?Signature=AGO-PgxkYo99MkJFHvjfGXjG1QDEXeaDb4Qtzmy85wqyJjK7eKojQWa4BCRcow__&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovLypicmFkbS5qcGciLCJDb25kaXRpb24iOnsiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjEwLjUyLjE3LjkvMCJ9LCJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI1MjUyMDgzMH19fV19Cg__&Key-Pair-Id=mykey"


To generate an RSA key pair, you can use openssl and the following commands:

# Generate a 2048 bit key pair
openssl genrsa -out private-key.pem 2048
openssl rsa -in private-key.pem -pubout -out public-key.pem


=head1 OPTIONS

=over 8

=item B<--help>

Print a help message and exits.

=item B<--action> [action]

The action to execute.  action can be one of:

  encode - Generate a signed URL (using a canned policy or a user policy)
  decode - Decode a signed URL

=item B<--url>

The URL to en/decode

=item B<--stream>

The stream to en/decode

=item B<--private-key>

The path to your private key.

=item B<--key-pair-id>

The key pair identifier.

=item B<--policy>

The CloudFront policy document.

=item B<--expires>

The Unix epoch time when the URL is to expire. If both this option and
the --policy option are specified, --policy will be used. Otherwise, this 
option alone will use a canned policy.

=back

=cut

use strict;
use warnings;

# you might need to use CPAN to get these modules.
# run perl -MCPAN -e "install <module>" to get them.
# The openssl command line will also need to be in your $PATH.
use File::Temp qw/tempfile/;
use File::Slurp;
use Getopt::Long;
use IPC::Open2;
use MIME::Base64 qw(encode_base64 decode_base64);
use Pod::Usage;
use URI;

my $CANNED_POLICY 
    = '{"Statement":[{"Resource":"<RESOURCE>","Condition":{"DateLessThan":{"AWS:EpochTime":<EXPIRES>}}}]}';

my $POLICY_PARAM      = "Policy";
my $EXPIRES_PARAM     = "Expires";
my $SIGNATURE_PARAM   = "Signature";
my $KEY_PAIR_ID_PARAM = "Key-Pair-Id";

my $verbose = 0;
my $policy_filename = "";
my $expires_epoch = 0;
my $action = "";
my $help = 0;
my $key_pair_id = "";
my $url = "";
my $stream = "";
my $private_key_filename = "";

my $result = GetOptions("action=s"      => \$action,
                        "policy=s"      => \$policy_filename,
                        "expires=i"     => \$expires_epoch,
                        "private-key=s" => \$private_key_filename,
                        "key-pair-id=s" => \$key_pair_id,
                        "verbose"       => \$verbose,
                        "help"          => \$help,
                        "url=s"         => \$url,
                        "stream=s"      => \$stream,
                    );

if ($help or !$result) {
    pod2usage(1);
    exit;
}

if ($url eq "" and $stream eq "") {
    print STDERR "Must include a stream or a URL to encode or decode with the --stream or --url option\n";
    exit;
}

if ($url ne "" and $stream ne "") {
    print STDERR "Only one of --url and --stream may be specified\n";
    exit;
}

if ($url ne "" and !is_url_valid($url)) {
    exit;
}

if ($stream ne "") {
    exit unless is_stream_valid($stream);

    # The signing mechanism is identical, so from here on just pretend we're
    # dealing with a URL
    $url = $stream;
} 

if ($action eq "encode") {
    # The encode action will generate a private content URL given a base URL, 
    # a policy file (or an expires timestamp) and a key pair id parameter
    my $private_key;
    my $public_key;
    my $public_key_file;
    
    my $policy;
    if ($policy_filename eq "") {
        if ($expires_epoch == 0) {
            print STDERR "Must include policy filename with --policy argument or an expires" . 
                          "time using --expires\n";            
        }
        
        $policy = $CANNED_POLICY;
        $policy =~ s/<EXPIRES>/$expires_epoch/g;
        $policy =~ s/<RESOURCE>/$url/g;
    } else {
        if (! -e $policy_filename) {
            print STDERR "Policy file $policy_filename does not exist\n";
            exit;
        }
        $expires_epoch = 0; # ignore if set
        $policy = read_file($policy_filename);
    }

    if ($private_key_filename eq "") {
        print STDERR "You must specific the path to your private key file with --private-key\n";
        exit;
    }

    if (! -e $private_key_filename) {
        print STDERR "Private key file $private_key_filename does not exist\n";
        exit;
    }

    if ($key_pair_id eq "") {
        print STDERR "You must specify a key pair id with --key-pair-id\n";
        exit;
    }

    my $encoded_policy = url_safe_base64_encode($policy);
    my $signature = rsa_sha1_sign($policy, $private_key_filename);
    my $encoded_signature = url_safe_base64_encode($signature);

    my $generated_url = create_url($url, $encoded_policy, $encoded_signature, $key_pair_id, $expires_epoch);


    if ($stream ne "") {
        print "Encoded stream (for use within a swf):\n" . $generated_url . "\n";
        print "Encoded and escaped stream (for use on a webpage):\n" .  escape_url_for_webpage($generated_url) . "\n"; 
    } else {
        print "Encoded URL:\n" . $generated_url . "\n";
    }
} elsif ($action eq "decode") {
    my $decoded = decode_url($url);
    if (!$decoded) {
        print STDERR "Improperly formed URL\n";
        exit;
    }

    print_decoded_url($decoded);
} else {
    # No action specified, print help.  But only if this is run as a program (caller will be empty)
    pod2usage(1) unless caller();
}

# Decode a private content URL into its component parts
sub decode_url {
    my $url = shift;

    if ($url =~ /(.*)\?(.*)/) {
        my $base_url = $1;
        my $params = $2;

        my @unparsed_params = split(/&/, $params);
        my %params = ();
        foreach my $param (@unparsed_params) {
            my ($key, $val) = split(/=/, $param);
            $params{$key} = $val;
        }

        my $encoded_signature = "";
        if (exists $params{$SIGNATURE_PARAM}) {
            $encoded_signature = $params{"Signature"};
        } else {
            print STDERR "Missing Signature URL parameter\n";
            return 0;
        }

        my $encoded_policy = "";
        if (exists $params{$POLICY_PARAM}) {
            $encoded_policy = $params{$POLICY_PARAM};
        } else {
            if (!exists $params{$EXPIRES_PARAM}) {
                print STDERR "Either the Policy or Expires URL parameter needs to be specified\n";
                return 0;    
            }
            
            my $expires = $params{$EXPIRES_PARAM};
            
            my $policy = $CANNED_POLICY;
            $policy =~ s/<EXPIRES>/$expires/g;
            
            my $url_without_cf_params = $url;
            $url_without_cf_params =~ s/$SIGNATURE_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$POLICY_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$EXPIRES_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$KEY_PAIR_ID_PARAM=[^&]*&?//g;
            
            if ($url_without_cf_params =~ /(.*)\?$/) {
                $url_without_cf_params = $1;
            }
            
            $policy =~ s/<RESOURCE>/$url_without_cf_params/g;
            
            $encoded_policy = url_safe_base64_encode($policy);
        }

        my $key = "";
        if (exists $params{$KEY_PAIR_ID_PARAM}) {
            $key = $params{$KEY_PAIR_ID_PARAM};
        } else {
            print STDERR "Missing $KEY_PAIR_ID_PARAM parameter\n";
            return 0;
        }

        my $policy = url_safe_base64_decode($encoded_policy);

        my %ret = ();
        $ret{"base_url"} = $base_url;
        $ret{"policy"} = $policy;
        $ret{"key"} = $key;

        return \%ret;
    } else {
        return 0;
    }
}

# Print a decoded URL out
sub print_decoded_url {
    my $decoded = shift;

    print "Base URL: \n" . $decoded->{"base_url"} . "\n";
    print "Policy: \n" . $decoded->{"policy"} . "\n";
    print "Key: \n" . $decoded->{"key"} . "\n";
}

# Encode a string with base 64 encoding and replace some invalid URL characters
sub url_safe_base64_encode {
    my ($value) = @_;

    my $result = encode_base64($value);
    $result =~ tr|+=/|-_~|;

    return $result;
}

# Decode a string with base 64 encoding.  URL-decode the string first
# followed by reversing any special character ("+=/") translation.
sub url_safe_base64_decode {
    my ($value) = @_;

    $value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    $value =~ tr|-_~|+=/|;

    my $result = decode_base64($value);

    return $result;
}

# Create a private content URL
sub create_url {
    my ($path, $policy, $signature, $key_pair_id, $expires) = @_;
    
    my $result;
    my $separator = $path =~ /\?/ ? '&' : '?';
    if ($expires) {
        $result = "$path$separator$EXPIRES_PARAM=$expires&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    } else {
        $result = "$path$separator$POLICY_PARAM=$policy&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    }
    $result =~ s/\n//g;

    return $result;
}

# Sign a document with given private key file.
# The first argument is the document to sign
# The second argument is the name of the private key file
sub rsa_sha1_sign {
    my ($to_sign, $pvkFile) = @_;
    print "openssl sha1 -sign $pvkFile $to_sign\n";

    return write_to_program($pvkFile, $to_sign);
}

# Helper function to write data to a program
sub write_to_program {
my ($keyfile, $data) = @_;
unlink "temp_policy.dat" if (-e "temp_policy.dat");
unlink "temp_sign.dat" if (-e "temp_sign.dat");

write_file("temp_policy.dat", $data);

system("openssl dgst -sha1 -sign \"$keyfile\" -out temp_sign.dat temp_policy.dat");

my $output = read_file("temp_sign.dat");

    return $output;
}

# Read a file into a string and return the string
sub read_file {
    my ($file) = @_;

    open(INFILE, "<$file") or die("Failed to open $file: $!");
    my $str = join('', <INFILE>);
    close INFILE;

    return $str;
}

sub is_url_valid {
    my ($url) = @_;

    # HTTP distributions start with http[s]:// and are the correct thing to sign
    if ($url =~ /^https?:\/\//) {
        return 1;
    } else {
        print STDERR "CloudFront requires absolute URLs for HTTP distributions\n";
        return 0;
    }
}

sub is_stream_valid {
    my ($stream) = @_;

    if ($stream =~ /^rtmp:\/\// or $stream =~ /^\/?cfx\/st/) {
        print STDERR "Streaming distributions require that only the stream name is signed.\n";
        print STDERR "The stream name is everything after, but not including, cfx/st/\n";
        return 0;
    } else {
        return 1;
    }
}

# flash requires that the query parameters in the stream name are url
# encoded when passed in through javascript, etc.  This sub handles the minimal
# required url encoding.
sub escape_url_for_webpage {
    my ($url) = @_;

    $url =~ s/\?/%3F/g;
    $url =~ s/=/%3D/g;
    $url =~ s/&/%26/g;

    return $url;
}

1;
```

# Creazione di una firma per URL utilizzando PHP
<a name="CreateURL_PHP"></a>

Qualsiasi server Web che esegue PHP può utilizzare questo codice di esempio PHP per creare dichiarazioni politiche e firme per distribuzioni private. CloudFront L'esempio completo crea una pagina Web funzionante con collegamenti URL firmati che riproducono uno streaming video utilizzando lo streaming. CloudFront Puoi scaricare l’esempio completo dal file [demo-php.zip](samples/demo-php.zip).

**Note**  
La creazione di una firma per URL è solo una parte del processo di distribuzione di contenuto privato mediante un URL firmato. Per ulteriori informazioni sull'intero processo, consulta [Usa firmato URLs](private-content-signed-urls.md). 
È inoltre possibile creare un URLs file firmato utilizzando la `UrlSigner` classe in. AWS SDK per PHP Per ulteriori informazioni, vedete [Class UrlSigner](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CloudFront.UrlSigner.html) nel *AWS SDK per PHP API Reference*.
Nella `openssl_sign` chiamata, notate che passando `OPENSSL_ALGO_SHA256` come quarto argomento si passa a SHA-256. (Vedi anche [Creazione di cookie firmati utilizzando PHP](signed-cookies-PHP.md) per un esempio completo).

**Topics**
+ [Creazione della firma RSA SHA-1](#sample-rsa-sign)
+ [Creazione di una policy di accesso predefinita](#sample-canned-policy)
+ [Creare una policy personalizzata](#sample-custom-policy)
+ [Esempio di codice completo](#full-example)

Nelle sezioni seguenti, l’esempio di codice viene suddiviso in singole parti. Di seguito è riportato il [Esempio di codice completo](#full-example) completo.

## Creazione della firma RSA SHA-1
<a name="sample-rsa-sign"></a>

In questo codice di esempio vengono eseguite le seguenti operazioni:
+ La funzione `rsa_sha1_sign` esegue l’hashing e firma la dichiarazione di policy. Gli argomenti richiesti sono una dichiarazione di policy e la chiave privata che corrisponde a una chiave pubblica appartenente a un gruppo di chiavi attendibili per la distribuzione. 
+ Successivamente, la funzione `url_safe_base64_encode` crea una versione URL-safe della firma.

```
function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with 
    // the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}
```

Il seguente frammento di codice utilizza le funzioni `get_canned_policy_stream_name()` e `get_custom_policy_stream_name()` crea una politica predefinita e personalizzata. CloudFront utilizza le politiche per creare l'URL per lo streaming del video, inclusa la specifica dell'ora di scadenza. 

Puoi quindi utilizzare una policy di accesso predefinita o una policy personalizzata per determinare come gestire l’accesso ai contenuti. Per ulteriori informazioni su quale scegliere, consulta la sezione [Decidi di utilizzare politiche predefinite o personalizzate per la firma URLs](private-content-signed-urls.md#private-content-choosing-canned-custom-policy).

## Creazione di una policy di accesso predefinita
<a name="sample-canned-policy"></a>

Il codice di esempio seguente crea una dichiarazione di policy *predefinita* per la firma. 

**Nota**  
La `$expires` variabile è un date/time timbro che deve essere un numero intero, non una stringa.

```
function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}
```

Per ulteriori informazioni sulle policy predefinite, consulta [Creazione di un URL firmato utilizzando una policy di accesso predefinita](private-content-creating-signed-url-canned-policy.md).

## Creare una policy personalizzata
<a name="sample-custom-policy"></a>

Il codice di esempio seguente crea una dichiarazione di policy *personalizzata* per la firma. 

```
function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}
```

Per ulteriori informazioni sulle policy personalizzate, consulta [Creazione di un URL firmato utilizzando una policy personalizzata](private-content-creating-signed-url-custom-policy.md).

## Esempio di codice completo
<a name="full-example"></a>

Il codice di esempio seguente fornisce una dimostrazione completa della creazione di CloudFront signed URLs with PHP. Puoi scaricare l’esempio completo dal file [demo-php.zip](samples/demo-php.zip).

Nell'esempio seguente, è possibile modificare l'`$policy``Condition`elemento per consentire sia gli intervalli di indirizzi che gli intervalli IPv4 di IPv6 indirizzi. Per un esempio, [ IPv6consulta Using address in IAM policies](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) nella *Amazon Simple Storage Service User Guide*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function create_stream_name($stream, $policy, $signature, $key_pair_id, $expires) {
    $result = $stream;
    // if the stream already contains query parameters, attach the new query parameters to the end
    // otherwise, add the query parameters
    $separator = strpos($stream, '?') == FALSE ? '?' : '&';
    // the presence of an expires time means we're using a canned policy
    if($expires) {
        $result .= $separator . "Expires=" . $expires . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }
    // not using a canned policy, include the policy itself in the stream name
    else {
        $result .= $separator . "Policy=" . $policy . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }

    // new lines would break us, so remove them
    return str_replace('\n', '', $result);
}


function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}

function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}


// Path to your private key.  Be very careful that this file is not accessible
// from the web!

$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';

// Make sure you have "Restrict viewer access" enabled on this path behaviour and using the above Trusted key groups (recommended).
$video_path = 'https://example.com/secure/example.mp4';

$expires = time() + 300; // 5 min from now
$canned_policy_stream_name = get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires);

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$policy =
'{'.
    '"Statement":['.
        '{'.
            '"Resource":"'. $video_path . '",'.
            '"Condition":{'.
                '"IpAddress":{"AWS:SourceIp":"' . $client_ip . '/32"},'.
                '"DateLessThan":{"AWS:EpochTime":' . $expires . '}'.
            '}'.
        '}'.
    ']' .
    '}';
$custom_policy_stream_name = get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy);

?>

<html>

<head>
    <title>CloudFront</title>
</head>

<body>
    <h1>Amazon CloudFront</h1>
    <h2>Canned Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?></h3>
    <br />

    <div id='canned'>The canned policy video will be here: <br>
    
        <video width="640" height="360" autoplay muted controls>
        <source src="<?php echo $canned_policy_stream_name; ?>" type="video/mp4">
        Your browser does not support the video tag.
        </video>
    </div>

    <h2>Custom Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h3>
    <div id='custom'>The custom policy video will be here: <br>

         <video width="640" height="360" autoplay muted controls>
         <source src="<?php echo $custom_policy_stream_name; ?>" type="video/mp4">
         Your browser does not support the video tag.
        </video>
    </div> 

</body>

</html>
```

Per ulteriori esempi di firme URL, consulta i seguenti argomenti:
+ [Creazione di una firma per URL utilizzando Perl](CreateURLPerl.md)
+ [Crea una firma per URL utilizzando C\$1 e .NET Framework](CreateSignatureInCSharp.md)
+ [Creazione di una firma per URL utilizzando Java](CFPrivateDistJavaDevelopment.md)

Invece di utilizzare signed URLs per creare la firma, puoi utilizzare cookie firmati. Per ulteriori informazioni, consulta [Creazione di cookie firmati utilizzando PHP](signed-cookies-PHP.md).

# Crea una firma per URL utilizzando C\$1 e .NET Framework
<a name="CreateSignatureInCSharp"></a>

Gli esempi in C\$1 in questa sezione implementano un'applicazione di esempio che dimostra come creare le firme per le distribuzioni CloudFront private utilizzando istruzioni di policy predefinite e personalizzate. Gli esempi includono funzioni utility basate sul [AWS SDK per .NET](https://aws.amazon.com/sdkfornet) che può rivelarsi utile nelle applicazioni .NET.

È inoltre possibile creare cookie firmati URLs e firmati utilizzando. SDK per .NET Nella *Documentazione di riferimento delle API di SDK per .NET *, consulta i seguenti argomenti:
+ **Firmato URLs**: [AmazonCloudFrontUrlSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontUrlSigner.html) 
+ **Cookie firmati** — [AmazonCloudFrontCookieSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontCookieSigner.html) 

Per scaricare il codice, consulta [Signature Code in C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip).

**Note**  
Le classi `AmazonCloudFrontUrlSigner` e `AmazonCloudFrontCookieSigner` sono state spostate in un pacchetto separato. Per ulteriori informazioni sul loro utilizzo, consulta [CookieSigner e UrlSigner](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html#net-dg-v4-CookieSigner-UrlSigner) nella *AWS SDK per .NET (V4) Developer Guide*. 
La creazione di una firma per URL è solo una parte del processo di distribuzione di contenuto privato mediante un URL firmato. Per ulteriori informazioni, consulta [Usa firmato URLs](private-content-signed-urls.md). Per ulteriori informazioni sull’utilizzo di cookie firmati, consulta [Utilizzo di cookie firmati](private-content-signed-cookies.md).
Nella chiamata di firma RSA, tieni presente che `SHA1` può essere sostituito con il parametro dell'`SHA256`algoritmo hash.

## Utilizzo di una chiave RSA in .NET Framework
<a name="rsa-key-sdk-net"></a>

Per utilizzare una chiave RSA in.NET Framework, è necessario convertire il file.pem AWS fornito nel formato XML utilizzato da .NET Framework.

Dopo la conversione, il file di chiave privata RSA è nel seguente formato:

**Example : chiave privata RSA nel formato .NET Framework XML**  <a name="RSAPrivateKeyXML.NETFrameworkFormat"></a>

```
<RSAKeyValue>
  <Modulus>
    wO5IvYCP5UcoCKDo1dcspoMehWBZcyfs9QEzGi6Oe5y+ewGr1oW+vB2GPB
    ANBiVPcUHTFWhwaIBd3oglmF0lGQljP/jOfmXHUK2kUUnLnJp+oOBL2NiuFtqcW6h/L5lIpD8Yq+NRHg
    Ty4zDsyr2880MvXv88yEFURCkqEXAMPLE=
  </Modulus>
  <Exponent>AQAB</Exponent>
  <P>
    5bmKDaTz
    npENGVqz4Cea8XPH+sxt+2VaAwYnsarVUoSBeVt8WLloVuZGG9IZYmH5KteXEu7fZveYd9UEXAMPLE==
  </P>
  <Q>
    1v9l/WN1a1N3rOK4VGoCokx7kR2SyTMSbZgF9IWJNOugR/WZw7HTnjipO3c9dy1Ms9pUKwUF4
    6d7049EXAMPLE==
  </Q>
  <DP>
    RgrSKuLWXMyBH+/l1Dx/I4tXuAJIrlPyo+VmiOc7b5NzHptkSHEPfR9s1
    OK0VqjknclqCJ3Ig86OMEtEXAMPLE==
  </DP>
  <DQ>
    pjPjvSFw+RoaTu0pgCA/jwW/FGyfN6iim1RFbkT4
    z49DZb2IM885f3vf35eLTaEYRYUHQgZtChNEV0TEXAMPLE==
  </DQ>
  <InverseQ>
    nkvOJTg5QtGNgWb9i
    cVtzrL/1pFEOHbJXwEJdU99N+7sMK+1066DL/HSBUCD63qD4USpnf0myc24in0EXAMPLE==</InverseQ>
  <D>
      Bc7mp7XYHynuPZxChjWNJZIq+A73gm0ASDv6At7F8Vi9r0xUlQe/v0AQS3ycN8QlyR4XMbzMLYk
      3yjxFDXo4ZKQtOGzLGteCU2srANiLv26/imXA8FVidZftTAtLviWQZBVPTeYIA69ATUYPEq0a5u5wjGy
      UOij9OWyuEXAMPLE=
   </D>
</RSAKeyValue>
```

## Metodo di firma di policy predefinita in C\$1
<a name="canned-policy-signed-url-net"></a>

Il codice C\$1 esposto di seguito crea un URL firmato che utilizza una policy predefinita eseguendo la procedura seguente:
+ Crea una dichiarazione di policy.
+ Esegue l'hash della dichiarazione politica utilizzando SHA1 e firma il risultato utilizzando RSA e la chiave privata la cui chiave pubblica corrispondente si trova in un gruppo di chiavi attendibili.
+ Codifica in base64 la dichiarazione di policy con firma e hash e sostituisce i caratteri speciali per rendere sicura la stringa da utilizzare come parametro di richiesta URL.
+ Concatena i valori.

Per l'implementazione completa, vedi l'esempio in [Signature Code in C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**Nota**  
`keyId`Viene restituito quando si carica una chiave pubblica su. CloudFront Per ulteriori informazioni, consulta ![\[6\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : metodo di firma di policy di accesso predefinita in C\$1**  <a name="ExampleCannedPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCannedPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string pathToPolicyStmnt, 
    string pathToPrivateKey, string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-pathToPolicyStmnt, 
    // 5-pathToPrivateKey, 6-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);

    // Create the policy statement.
    string strPolicy = CreatePolicyStatement(pathToPolicyStmnt,
        urlString, 
        DateTime.Now, 
        DateTime.Now.Add(timeSpanInterval), 
        "0.0.0.0/0");
    if ("Error!" == strPolicy) return "Invalid time frame." + 
        "Start time cannot be greater than end time.";

    // Copy the expiration time defined by policy statement.
    string strExpiration = CopyExpirationTimeFromPolicy(strPolicy);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    using (SHA1CryptoServiceProvider 
        cryptoSHA1 = new SHA1CryptoServiceProvider())
    {
        bufferPolicy = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA and 
        // create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter rsaFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        rsaFormatter.SetHashAlgorithm("SHA1");
        byte[] signedPolicyHash = rsaFormatter.CreateSignature(bufferPolicy);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedPolicyHash);

        // Concatenate the URL, the timestamp, the signature, 
        // and the key pair ID to form the signed URL.
        return urlString + 
            "?Expires=" + 
            strExpiration + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Metodo di firma di policy personalizzata in C\$1
<a name="custom-policy-signed-url-net"></a>

Il codice C\$1 esposto di seguito crea un URL firmato che utilizza una policy personalizzata mediante le seguenti operazioni:

1. Crea una dichiarazione di policy.

1. Codifica in base64 la dichiarazione di policy e sostituisce caratteri speciali per rendere sicura la stringa da utilizzare come parametro di richiesta URL.

1. Esegue l'hash della dichiarazione politica utilizzando SHA1 e crittografa il risultato utilizzando RSA e la chiave privata la cui chiave pubblica corrispondente si trova in un gruppo di chiavi attendibile.

1. Codifica in base64 la dichiarazione di policy con hash e sostituisce i caratteri speciali per rendere sicura la stringa da utilizzare come parametro di richiesta URL.

1. Concatena i valori.

Per l'implementazione completa, vedi l'esempio in [Signature Code in C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**Nota**  
`keyId`Viene restituito quando si carica una chiave pubblica su. CloudFront Per ulteriori informazioni, consulta ![\[6\]](http://docs.aws.amazon.com/it_it/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : metodo di firma di policy personalizzato in C\$1**  <a name="ExampleCustomPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCustomPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string startIntervalFromNow, 
    string ipaddress, string pathToPolicyStmnt, string pathToPrivateKey, 
    string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-starttimeFromNow, 
    // 5-ip_address, 6-pathToPolicyStmt, 7-pathToPrivateKey, 8-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);
    TimeSpan timeSpanToStart = GetDurationByUnits(durationUnits, 
        startIntervalFromNow);
    if (null == timeSpanToStart) 
        return "Invalid duration units." + 
            "Valid options: seconds, minutes, hours, or days";
            
    string strPolicy = CreatePolicyStatement(
        pathToPolicyStmnt, urlString, DateTime.Now.Add(timeSpanToStart), 
        DateTime.Now.Add(timeSpanInterval), ipaddress);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Convert the policy statement to URL-safe base64 encoding and 
    // replace unsafe characters + = / with the safe characters - _ ~

    string urlSafePolicy = ToUrlSafeBase64String(bufferPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    byte[] bufferPolicyHash;
    using (SHA1CryptoServiceProvider cryptoSHA1 = 
        new SHA1CryptoServiceProvider())
    {
        bufferPolicyHash = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA 
        // and create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter RSAFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        RSAFormatter.SetHashAlgorithm("SHA1");
        byte[] signedHash = RSAFormatter.CreateSignature(bufferPolicyHash);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedHash);

        return urlString + 
            "?Policy=" + 
            urlSafePolicy + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Metodi utility per generazione di firme
<a name="utility-methods-signed-url"></a>

I seguenti metodi ottengono la dichiarazione di policy da un file e analizzano gli intervalli di tempo per la generazione di firme.

**Example : metodi di utilità per generazione di firme**  <a name="UtilityMethodsForSignatureGeneration"></a>

```
public static string CreatePolicyStatement(string policyStmnt, 
   string resourceUrl, 
   DateTime startTime, 
   DateTime endTime, 
   string ipAddress)
   
{
   // Create the policy statement.
   FileStream streamPolicy = new FileStream(policyStmnt, FileMode.Open, FileAccess.Read);
   using (StreamReader reader = new StreamReader(streamPolicy))
   {
      string strPolicy = reader.ReadToEnd();

      TimeSpan startTimeSpanFromNow = (startTime - DateTime.Now);
      TimeSpan endTimeSpanFromNow = (endTime - DateTime.Now);
      TimeSpan intervalStart = 
         (DateTime.UtcNow.Add(startTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
      TimeSpan intervalEnd = 
         (DateTime.UtcNow.Add(endTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

      int startTimestamp = (int)intervalStart.TotalSeconds; // START_TIME
      int endTimestamp = (int)intervalEnd.TotalSeconds;  // END_TIME

      if (startTimestamp > endTimestamp)
         return "Error!";

      // Replace variables in the policy statement.
      strPolicy = strPolicy.Replace("RESOURCE", resourceUrl);
      strPolicy = strPolicy.Replace("START_TIME", startTimestamp.ToString());
      strPolicy = strPolicy.Replace("END_TIME", endTimestamp.ToString());
      strPolicy = strPolicy.Replace("IP_ADDRESS", ipAddress);
      strPolicy = strPolicy.Replace("EXPIRES", endTimestamp.ToString());
      return strPolicy;
   }   
}

public static TimeSpan GetDuration(string units, string numUnits)
{
   TimeSpan timeSpanInterval = new TimeSpan();
   switch (units)
   {
      case "seconds":
         timeSpanInterval = new TimeSpan(0, 0, 0, int.Parse(numUnits));
         break;
      case "minutes":
         timeSpanInterval = new TimeSpan(0, 0, int.Parse(numUnits), 0);
         break;
      case "hours":
         timeSpanInterval = new TimeSpan(0, int.Parse(numUnits), 0 ,0);
         break;
      case "days":
         timeSpanInterval = new TimeSpan(int.Parse(numUnits),0 ,0 ,0);
         break;
      default:
         Console.WriteLine("Invalid time units;" + 
            "use seconds, minutes, hours, or days");
         break;
   }
   return timeSpanInterval;
}

private static TimeSpan GetDurationByUnits(string durationUnits, 
   string startIntervalFromNow)
{
   switch (durationUnits)
   {
      case "seconds":
         return new TimeSpan(0, 0, int.Parse(startIntervalFromNow));
      case "minutes":
         return new TimeSpan(0, int.Parse(startIntervalFromNow), 0);
      case "hours":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0);
      case "days":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0, 0);
      default:
         return new TimeSpan(0, 0, 0, 0);
   }
}

public static string CopyExpirationTimeFromPolicy(string policyStatement)
{
   int startExpiration = policyStatement.IndexOf("EpochTime");
   string strExpirationRough = policyStatement.Substring(startExpiration + 
      "EpochTime".Length);
   char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
         
   List<char> listDigits = new List<char>(digits);
   StringBuilder buildExpiration = new StringBuilder(20);
         
   foreach (char c in strExpirationRough)
   {
      if (listDigits.Contains(c))
         buildExpiration.Append(c);
   }
   return buildExpiration.ToString();   
}
```

Consulta anche
+ [Creazione di una firma per URL utilizzando Perl](CreateURLPerl.md)
+ [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md)
+ [Creazione di una firma per URL utilizzando Java](CFPrivateDistJavaDevelopment.md)

# Creazione di una firma per URL utilizzando Java
<a name="CFPrivateDistJavaDevelopment"></a>

Oltre al seguente esempio di codice, è possibile utilizzare [la classe di `CloudFrontUrlSigner` utilità nella AWS SDK per Java (versione 1)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontUrlSigner.html) per creare [CloudFront signed URLs](private-content-signed-urls.md).

Per altri esempi, consulta [Creare cookie firmati URLs e cookie utilizzando un AWS SDK nella libreria](https://docs.aws.amazon.com/code-library/latest/ug/cloudfront_example_cloudfront_CloudFrontUtilities_section.html) di codici *AWS SDK Code Examples.* 

**Note**  
La creazione di un URL firmato è solo una parte del processo di [pubblicazione di contenuti privati](PrivateContent.md). CloudFront Per ulteriori informazioni sull'intero processo, consulta [Usa firmato URLs](private-content-signed-urls.md).
Nella `Signature.getInstance` chiamata, nota che `SHA1withRSA` può essere sostituito con`SHA256withRSA`.

**Example Metodi di policy e di crittografia di firme Java**  <a name="ExampleJavaPolicyAndSignatureEncryptionMethods"></a>

```
package org.example;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import software.amazon.awssdk.services.cloudfront.CloudFrontUtilities;
import software.amazon.awssdk.services.cloudfront.model.CannedSignerRequest;
import software.amazon.awssdk.services.cloudfront.url.SignedUrl;

public class Main {

    public static void main(String[] args) throws Exception {
        CloudFrontUtilities cloudFrontUtilities = CloudFrontUtilities.create();
        Instant expirationDate = Instant.now().plus(7, ChronoUnit.DAYS);
        String resourceUrl = "https://a1b2c3d4e5f6g7.cloudfront.net";
        String keyPairId = "K1UA3WV15I7JSD";
        CannedSignerRequest cannedRequest = CannedSignerRequest.builder()
                .resourceUrl(resourceUrl)
                .privateKey(new java.io.File("/path/to/private_key.pem").toPath())
                .keyPairId(keyPairId)
                .expirationDate(expirationDate)
                .build();
        SignedUrl signedUrl = cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);
        String url = signedUrl.url();
        System.out.println(url);

    }
}
```

**Example Esempio di firma di policy predefinite con SHA256 in Java**  <a name="ExampleJavaPolicySHA256AndSignatureEncryptionMethods"></a>

```
package org.example;

import java.io.File;
import java.nio.file.Files;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Base64;

public class Main {

    public static void main(String[] args) throws Exception {
        String resourceUrl = "https://a1b2c3d4e5f6g7.cloudfront.net/myfile.html";
        String keyPairId = "K1UA3WV15I7JSD";
        Instant expiration = Instant.now().plus(7, ChronoUnit.DAYS);
        PrivateKey privateKey = loadPrivateKey("/path/to/private_key.der");

        System.out.println(createSignedUrl(resourceUrl, keyPairId, privateKey, expiration, "SHA1"));
        System.out.println(createSignedUrl(resourceUrl, keyPairId, privateKey, expiration, "SHA256"));
    }

    static String createSignedUrl(String resourceUrl, String keyPairId,
                                  PrivateKey privateKey, Instant expiration,
                                  String hashAlgorithm) throws Exception {
        long epochSeconds = expiration.getEpochSecond();

        String policy = "{\"Statement\":[{\"Resource\":\"" + resourceUrl
                + "\",\"Condition\":{\"DateLessThan\":{\"AWS:EpochTime\":" + epochSeconds + "}}}]}";

        String jcaAlgorithm = hashAlgorithm.equals("SHA256") ? "SHA256withRSA" : "SHA1withRSA";

        Signature sig = Signature.getInstance(jcaAlgorithm);
        sig.initSign(privateKey);
        sig.update(policy.getBytes("UTF-8"));
        String signature = base64UrlEncode(sig.sign());

        String url = resourceUrl
                + (resourceUrl.contains("?") ? "&" : "?")
                + "Expires=" + epochSeconds
                + "&Signature=" + signature
                + "&Key-Pair-Id=" + keyPairId;

        if (hashAlgorithm.equals("SHA256")) {
            url += "&Hash-Algorithm=SHA256";
        }

        return url;
    }

    static String base64UrlEncode(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes)
                .replace('+', '-')
                .replace('=', '_')
                .replace('/', '~');
    }

    static PrivateKey loadPrivateKey(String path) throws Exception {
        byte[] keyBytes = Files.readAllBytes(new File(path).toPath());
        return KeyFactory.getInstance("RSA")
                .generatePrivate(new PKCS8EncodedKeySpec(keyBytes));
    }
}
```

Consulta anche:
+ [Creazione di una firma per URL utilizzando Perl](CreateURLPerl.md)
+ [Creazione di una firma per URL utilizzando PHP](CreateURL_PHP.md)
+ [Crea una firma per URL utilizzando C\$1 e .NET Framework](CreateSignatureInCSharp.md)