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, quest'ultimo crea una stringa che verrà firmata. Questa stringa deve essere definita nel tuo programma come:

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

I componenti che costituiscono 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 URL firmate, ad eccezione di quanto indicato sopra. Puoi utilizzare POST per definire documenti di criteri 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 digest MD5 in Base64. Se fornisci questo valore nella stringa, il client (di solito un browser) deve fornire questa intestazione HTTP con lo stesso valore nella sua richiesta.
Content_Type text/plain Se necessario. Se fornisci un content-type, il client (browser) deve fornire questo set di intestazioni HTTP impostato 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 al massimo a una 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 utilizzando l'URL firmato. Per informazioni su come creare intestazioni canoniche per la firma, consulta Intestazioni canoniche delle estensioni.
Canonicalized_Resource /bucket/objectname Obbligatorio. La risorsa a cui si fa riferimento nell'URL. Per ulteriori dettagli, consulta Risorse canoniche.

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

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

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

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

Per l'assistenza in altre lingue, consulta Panoramica dell'API App Identity per Java, Panoramica dell'API App Identity per PHP e Funzioni Go di App Identity.

Il servizio di identità dell'app 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 temporaneo alle risorse.

Intestazioni delle estensioni 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 tutti i nomi delle intestazioni personalizzate minuscoli.

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

  3. Se presenti, rimuovi le intestazioni x-goog-encryption-key e x-goog-encryption-key-sha256. Queste intestazioni contengono informazioni sensibili che non devono essere incluse nella stringa da firmare; tuttavia, devono comunque essere utilizzate in qualsiasi richiesta che utilizza 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 vengono visualizzate le intestazioni nella richiesta. Per ulteriori informazioni, consulta la sezione 3.2 di RFC 7230.

  5. Sostituisci gli eventuali spazi vuoti o nuove righe (CRLF o LF) con un unico spazio. Per ulteriori informazioni sugli spazi vuoti di piegatura, consulta RFC 7230, sezione 3.2.4.

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

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

  8. Concatenare 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 risorsa secondaria) 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.googleapis.com/example-bucket/cat-pics/tabby.jpeg, la risorsa canonica è /example-bucket/cat-pics/tabby.jpeg.

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

  • Assicurati di copiare il percorso della richiesta HTTP letteralmente, 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 risorse secondarie (ad esempio cors). Non devi includere parametri della stringa di query come ?prefix, ?max-keys, ?marker e ?delimiter.