Procedura di firma V2

Questa pagina fornisce una panoramica degli URL firmati quando si utilizza la procedura di firma V2, che è un meccanismo per l'autenticazione della stringa di query per bucket e oggetti. Gli URL firmati forniscono un modo per concedere l'accesso in lettura o scrittura a tempo limitato a chiunque sia in possesso dell'URL, indipendentemente dal fatto che abbia un account utente.

Componenti della stringa che richiede la firma

Quando crei un URL firmato utilizzando un programma, il programma crea una stringa che verrà firmata. Questa stringa deve essere definita nel programma come:

StringToSign = HTTP_Verb + "\n" +
               Content_MD5 + "\n" +
               Content_Type + "\n" +
               Expires + "\n" +
               Canonicalized_Extension_Headers +
               Canonicalized_Resource

I componenti che compongono questa struttura sono descritti nella tabella seguente:

Componente stringa Esempio Descrizione
HTTP_Verb GET Obbligatorio. Il verbo HTTP da utilizzare con l'URL firmato.

Nota: il verbo HTTP POST non è supportato nelle stringhe degli URL firmati, ad eccezione di quanto indicato sopra. Puoi utilizzare POST per definire i documenti delle policy firmati, che specificano le caratteristiche degli oggetti che possono essere caricati in un bucket. Scopri di più nella documentazione relativa all'oggetto POST.

Content_MD5 rmYdCNHKFXam78uCt7xQLw== Facoltativo. Il valore del digest MD5 in Base64. Se lo fornisci nella stringa, il client (in genere un browser) deve fornire questa intestazione HTTP con lo stesso valore nella richiesta.
Content_Type text/plain Se necessario. Se fornisci un tipo di contenuto, il client (browser) deve fornire questa intestazione HTTP impostata sullo stesso valore.
Expires 1388534400 Obbligatorio. Questo è il timestamp (rappresentato come il numero di secondi trascorsi dall'epoca di Unix 00:00:00 UTC del 1° gennaio 1970) in cui la firma scade. Il server rifiuta tutte le richieste ricevute dopo questo timestamp, nonché tutte le richieste ricevute dopo la rotazione della chiave utilizzata per generare l'URL firmato. Per motivi di sicurezza e per la compatibilità con la procedura di firma V4, devi impostare Expires in modo che corrisponda a un massimo di 1 settimana (604800 secondi) nel futuro.
Canonicalized_Extension_Headers x-goog-acl:public-read\nx-goog-meta-foo:bar,baz\n Se necessario. Il server verifica che il client fornisca valori corrispondenti nelle richieste che utilizzano l'URL firmato. Per informazioni su come creare intestazioni canoniche per la firma, consulta Intestazioni di estensione canoniche.
Canonicalized_Resource /bucket/objectname Obbligatorio. La risorsa a cui si fa riferimento nell'URL. Per ulteriori dettagli, consulta Risorse canoniche.

Firma delle stringhe con il servizio di identità di App Engine

Quando crei un URL firmato utilizzando un programma, puoi firmare la stringa all'interno del programma o all'interno di un'applicazione App Engine utilizzando il servizio App Identity di App Engine, che utilizza le credenziali dell'account di servizio di App Engine. Ad esempio, utilizzando l' API App Identity di Python, puoi:

  • Utilizzare google.appengine.api.app_identity.sign_blob() per firmare i byte della stringa creata, fornendo la Signature necessaria per assemblare l'URL firmato.

  • Utilizzare google.appengine.api.app_identity.get_service_account_name() per recuperare il nome di un account di servizio, che è il GoogleAccessId necessario per assemblare l'URL firmato.

Per il supporto in altre lingue, consulta Panoramica dell'API App Identity per Java, Panoramica dell'API App Identity per PHP, e Funzioni App Identity Go.

Il servizio App Identity ruota le chiavi private quando firma i blob. Gli URL firmati generati dal servizio di identità dell'app sono validi per almeno un'ora e sono ideali per l'accesso a breve termine alle risorse.

Intestazioni di estensione canoniche

Quando crei un URL firmato utilizzando un programma, costruisci la parte delle intestazioni di estensione canoniche del messaggio concatenando tutte le intestazioni di estensione (personalizzate) che iniziano con x-goog-. Tuttavia, non puoi eseguire una semplice concatenazione. Tieni presente il seguente algoritmo durante la creazione delle intestazioni:

  1. Rendi minuscoli tutti i nomi delle intestazioni personalizzate.

  2. Ordina tutte le intestazioni personalizzate in base al nome dell'intestazione utilizzando un ordinamento lessicografico in base al valore del punto di codice.

  3. Se presenti, rimuovi le x-goog-encryption-key e le x-goog-encryption-key-sha256 intestazioni. Queste intestazioni contengono informazioni sensibili che non devono essere incluse nella stringa da firmare; tuttavia, queste intestazioni devono comunque essere utilizzate in tutte le richieste che utilizzano l'URL firmato generato.

  4. Elimina i nomi delle intestazioni duplicati creando un nome di intestazione con un elenco di valori separati da virgole. Assicurati che non ci siano spazi vuoti tra i valori e che l'ordine dell'elenco separato da virgole corrisponda all'ordine in cui le intestazioni appaiono nella richiesta. Per saperne di più, consulta la sezione 3.2 di RFC 7230.

  5. Sostituisci gli spazi vuoti o le nuove righe (CRLF o LF) con un singolo spazio. Per saperne di più sugli spazi vuoti, consulta la sezione 3.2.4 di RFC 7230.

  6. Rimuovi gli spazi vuoti intorno ai due punti che appaiono dopo il nome dell'intestazione.

  7. Aggiungi una nuova riga "\n" (U+000A) a ogni intestazione personalizzata.

  8. Concatena tutte le intestazioni personalizzate.

Risorse canoniche

Quando crei un URL firmato utilizzando un programma, costruisci la parte della risorsa canonica del messaggio concatenando il percorso della risorsa (bucket, oggetto e sotto-risorsa) su cui agisce la richiesta. Tieni presente quanto segue durante la creazione della risorsa:

  • La risorsa canonica è tutto ciò che segue il nome host. Ad esempio, se l'URL di Cloud Storage è https://storage.s3nsapis.fr/example-bucket/cat-pics/tabby.jpeg, la risorsa canonica è /example-bucket/cat-pics/tabby.jpeg.

  • Se la richiesta è limitata a una sotto-risorsa, ad esempio ?cors, aggiungi questa sotto-risorsa, incluso il punto interrogativo, alla fine della stringa.

  • Assicurati di copiare letteralmente il percorso della richiesta HTTP, ovvero devi includere tutta la codifica URL (segni di percentuale) nella stringa che crei. Inoltre, assicurati di includere solo i parametri della stringa di query che designano le sotto-risorse (ad esempio cors). Non devi includere parametri della stringa di query come ?prefix, ?max-keys, ?marker e ?delimiter.