Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Questa pagina fornisce una panoramica dei cookie firmati e le istruzioni per utilizzarli con Cloud CDN. I cookie firmati offrono accesso a risorse limitate nel tempo a un insieme di
anche se gli utenti hanno o meno un Account Google.
I cookie firmati sono un'alternativa agli URL firmati. I cookie firmati proteggono l'accesso
quando la firma separata di decine o centinaia di URL per ciascun utente non è possibile
la tua applicazione.
I cookie firmati ti consentono di:
Autorizza un utente e forniscigli un token a tempo limitato per l'accesso
i tuoi contenuti protetti (anziché firmare ogni URL).
Impostare l'accesso dell'utente a un prefisso URL specifico, ad esempio
https://media.example.com/videos/ e concedi all'utente autorizzato l'accesso a
contenuti protetti solo all'interno di quel prefisso URL.
Mantieni invariati gli URL e i manifest dei contenuti multimediali, semplificando la pipeline di imballaggio e migliorando la memorizzazione nella cache.
Se invece vuoi limitare l'accesso a URL specifici, valuta la possibilità di utilizzare
URL.
Prima di iniziare
Prima di utilizzare i cookie firmati, segui questi passaggi:
Assicurati che Cloud CDN sia abilitato. Per istruzioni, consulta
Utilizzo di Cloud CDN. Puoi configurare i cookie firmati su un backend prima di attivare Cloud CDN, ma non avranno alcun effetto finché Cloud CDN non sarà attivato.
Se necessario, esegui l'aggiornamento alla versione più recente di Google Cloud CLI:
Configurazione delle chiavi per le richieste firmate
La creazione di chiavi per gli URL o i cookie firmati richiede diversi passaggi,
descritti nelle sezioni seguenti.
Considerazioni sulla sicurezza
Cloud CDN non convalida le richieste nelle seguenti circostanze:
La richiesta non è firmata.
Il servizio di backend o il bucket di backend per la richiesta non contiene
Cloud CDN abilitato.
Le richieste firmate devono sempre essere convalidate all'origine prima di gestire
la risposta corretta. Questo perché le origini possono essere utilizzate per pubblicare una combinazione di contenuti firmati e non firmati e perché un client potrebbe accedere direttamente all'origine.
Cloud CDN non blocca le richieste senza una query Signature
o il cookie HTTP Cloud-CDN-Cookie. Rifiuta le richieste con parametri non validi
(o con formato non valido).
Quando la tua applicazione rileva una firma non valida, assicurati che il tuo
l'applicazione risponde con un codice di risposta HTTP 403 (Unauthorized).
I codici di risposta HTTP 403 non sono memorizzabili nella cache.
Le risposte alle richieste firmate e non firmate vengono memorizzate nella cache separatamente, pertanto una risposta positiva a una richiesta firmata valida non viene mai utilizzata per soddisfare una richiesta non firmata.
Se l'applicazione invia un codice di risposta memorizzabile nella cache a una richiesta non valida,
richieste future valide potrebbero essere rifiutate erroneamente.
Per i backend Cloud Storage, assicurati
rimuovi l'accesso pubblico,
in modo che Cloud Storage possa rifiutare le richieste prive di un indirizzo
firma.
La seguente tabella riassume il comportamento.
La richiesta ha la firma
Hit della cache
Comportamento
No
No
Inoltra all'origine del backend.
No
Sì
Pubblicazione dalla cache.
Sì
No
Convalida firma. Se valido, inoltra all'origine del backend.
Sì
Sì
Convalida la firma. Se valido, pubblica dalla cache.
Crea chiavi di richiesta firmate
Per attivare il supporto degli URL e dei cookie firmati di Cloud CDN,
crea una o più chiavi su un servizio di backend, un bucket di backend o entrambi abilitati per Cloud CDN.
Per ogni servizio di backend o bucket di backend, puoi creare ed eliminare le chiavi in base alle tue esigenze di sicurezza. Ogni backend può avere fino a tre chiavi configurate
contemporaneamente. Ti suggeriamo di ruotare periodicamente le chiavi eliminando le chiavi più vecchie
aggiungendo una nuova chiave e utilizzando la nuova chiave quando si firmano URL o cookie.
Puoi utilizzare lo stesso nome di chiave in più servizi e bucket di backend
poiché ogni set di chiavi è indipendente l'uno dall'altro. I nomi delle chiavi possono contenere fino a 63 caratteri. Per assegnare un nome alle chiavi, utilizza i caratteri A-Z, a-z, 0-9,
_ (trattino basso) e - (trattino).
Quando crei chiavi, assicurati di tenerle al sicuro perché chiunque abbia uno di
le chiavi possono creare URL e cookie firmati che Cloud CDN
accetta finché la chiave non viene eliminata da Cloud CDN. Le chiavi sono memorizzate su
il computer in cui vengono generati gli URL o i cookie firmati.
Cloud CDN archivia anche le chiavi per verificare le firme delle richieste.
Per mantenere segrete le chiavi, le coppie chiave-valore non vengono incluse nelle risposte a nessun
richieste API. Se perdi una chiave, devi crearne una nuova.
Per creare una chiave di richiesta firmata:
Console
Nella console Google Cloud, vai alla pagina Cloud CDN.
Fai clic sul nome dell'origine a cui vuoi aggiungere la chiave.
Nella pagina Dettagli dell'origine, fai clic sul pulsante Modifica.
Nella sezione Nozioni di base sulle origini, fai clic su Avanti per aprire la sezione Regole host e percorso.
Nella sezione Regole host e percorso, fai clic su Avanti per aprire lo
Sezione Prestazioni della cache.
Nella sezione Contenuti con limitazioni, seleziona
Limita l'accesso tramite URL e cookie firmati.
Fai clic su Aggiungi chiave di firma.
Specifica un nome univoco per la nuova chiave di firma.
Nella sezione Metodo di creazione della chiave, seleziona Genera automaticamente.
In alternativa, fai clic su Fammi inserire e specifica un valore della chiave di firma.
Per la prima opzione, copia la chiave di firma generata automaticamente
in un file privato, che puoi utilizzare per
creare URL firmati.
Fai clic su Fine.
Nella sezione Durata massima delle voci di cache, inserisci un valore, quindi
seleziona un'unità di tempo.
Fai clic su Fine.
gcloud
Lo strumento a riga di comando gcloud legge le chiavi da un file locale specificato. Il file della chiave deve essere creato generando 128 bit fortemente casuali, codificandoli con base64 e sostituendo il carattere + con - e il carattere / con _. Per ulteriori informazioni, vedi
RFC 4648.
È fondamentale che la chiave sia fortemente casuale. Su un sistema UNIX-like, puoi
generare una chiave fortemente casuale e memorizzarla nel file della chiave con il
seguente comando:
Se utilizzi Cloud Storage e hai limitato gli utenti che possono leggere
devi concedere a Cloud CDN l'autorizzazione a leggere gli oggetti
l'aggiunta dell'account di servizio Cloud CDN agli ACL di Cloud Storage.
Non è necessario creare l'account di servizio. L'account di servizio viene creato automaticamente la prima volta che aggiungi una chiave a un bucket di backend in un progetto.
Prima di eseguire questo comando, aggiungi almeno una chiave a un bucket di backend
nel tuo progetto. In caso contrario, il comando non va a buon fine a causa di un errore perché l'account di servizio per il riempimento della cache Cloud CDN non viene creato finché non aggiungi una o più chiavi per il progetto.
Sostituisci PROJECT_NUM con il numero del tuo progetto e
BUCKET con il tuo bucket di archiviazione.
L'account di servizio Cloud CDN
service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com
non è presente nell'elenco degli account di servizio del tuo progetto. Questo accade perché
l'account di servizio Cloud CDN è di proprietà di Cloud CDN, non del tuo
progetto.
Per ulteriori informazioni sui numeri di progetto, consulta
Individuare l'ID e il numero del progetto
consulta la documentazione di assistenza
della console Google Cloud.
Personalizza il tempo massimo di memorizzazione nella cache
Cloud CDN memorizza nella cache le risposte per le richieste firmate indipendentemente dal
all'intestazione Cache-Control del backend. Il tempo massimo per cui le risposte possono essere memorizzate nella cache
senza riconvalida viene impostato dal flag signed-url-cache-max-age, che
il valore predefinito è un'ora e possono essere modificati come mostrato qui.
Per impostare il tempo massimo della cache per un servizio di backend o un bucket di backend, eseguine uno
uno dei seguenti comandi:
Quando gli URL firmati da una determinata chiave non devono più essere rispettati, esegui una delle
seguenti comandi per eliminare la chiave dal servizio di backend o dal bucket di backend:
Le norme relative ai cookie firmati sono una serie di coppie key-value (delimitate dal valore :
), simili ai parametri di ricerca utilizzati in un URL firmato.
Per alcuni esempi, consulta l'articolo sull'emissione di cookie agli utenti.
I criteri rappresentano i parametri per i quali una richiesta è valida. I criteri vengono firmati utilizzando un codice HMAC (Hash-based Message Authentication Code) che Cloud CDN convalida a ogni richiesta.
Definizione del formato e dei campi dei criteri
Esistono quattro campi obbligatori che devi definire nel seguente ordine:
URLPrefix
Expires
KeyName
Signature
Le coppie key-value in un criterio relativo ai cookie firmati sono sensibili alle maiuscole.
URLPrefix
URLPrefix indica un prefisso URL con codifica Base64 sicuro per l'URL che include tutte
percorsi per i quali deve essere valida la firma.
Un URLPrefix codifica uno schema (http:// o https://), un FQDN e un
percorso facoltativo. La fine del percorso con / è facoltativa, ma consigliata. La
non deve includere parametri di ricerca o frammenti come ? o #.
Ad esempio, https://media.example.com/videos corrisponde alle richieste per entrambi i seguenti elementi:
Il percorso del prefisso viene utilizzato come sottostringa di testo, non strettamente un percorso di directory.
Ad esempio, il prefisso https://example.com/data concede l'accesso a entrambi i seguenti elementi:
/data/file1
/database
Per evitare questo errore, ti consigliamo di terminare tutti i prefissi con /, a meno che non scelga intenzionalmente di terminare il prefisso con un nome file parziale come https://media.example.com/videos/123 per concedere l'accesso a quanto segue:
/videos/123_chunk1
/videos/123_chunk2
/videos/123_chunkN
Se l'URL richiesto non corrisponde a URLPrefix, Cloud CDN
rifiuta la richiesta e restituisce un errore HTTP 403 al client.
Scadenza
Expires deve essere un timestamp Unix (il numero di secondi dal 1° gennaio 1970).
KeyName
KeyName è il nome della chiave creata per il bucket di backend o il servizio di backend. I nomi delle chiavi sono sensibili alle maiuscole.
Firma
Signature è la firma HMAC-SHA-1 con codifica Base64 sicura per l'URL dei campi
che compongono le norme sui cookie. Questo viene convalidato per ogni richiesta. richieste
con una firma non valida vengono rifiutate con un errore HTTP 403.
Creazione programmatica di cookie firmati
I seguenti esempi di codice mostrano come creare programmaticamente cookie firmati.
Vai
import("crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"time"
)// signCookie creates a signed cookie for an endpoint served by Cloud CDN.//// - urlPrefix must start with "https://" and should include the path prefix// for which the cookie will authorize access to.// - key should be in raw form (not base64url-encoded) which is// 16-bytes long.// - keyName must match a key added to the backend service or bucket.funcsignCookie(urlPrefix,keyNamestring,key[]byte,expirationtime.Time)(string,error){encodedURLPrefix:=base64.URLEncoding.EncodeToString([]byte(urlPrefix))input:=fmt.Sprintf("URLPrefix=%s:Expires=%d:KeyName=%s",encodedURLPrefix,expiration.Unix(),keyName)mac:=hmac.New(sha1.New,key)mac.Write([]byte(input))sig:=base64.URLEncoding.EncodeToString(mac.Sum(nil))signedValue:=fmt.Sprintf("%s:Signature=%s",input,sig,)returnsignedValue,nil}
Java
importjava.net.MalformedURLException;importjava.net.URL;importjava.nio.charset.StandardCharsets;importjava.nio.file.Files;importjava.nio.file.Paths;importjava.security.InvalidKeyException;importjava.security.Key;importjava.security.NoSuchAlgorithmException;importjava.time.ZonedDateTime;importjava.util.Base64;importjavax.crypto.Mac;importjavax.crypto.spec.SecretKeySpec;publicclassSignedCookies{publicstaticvoidmain(String[]args)throwsException{// TODO(developer): Replace these variables before running the sample.// The name of the signing key must match a key added to the back end bucket or service.StringkeyName="YOUR-KEY-NAME";// Path to the URL signing key uploaded to the backend service/bucket.StringkeyPath="/path/to/key";// The Unix timestamp that the signed URL expires.longexpirationTime=ZonedDateTime.now().plusDays(1).toEpochSecond();// URL prefix to sign as a string. URL prefix must start with either "http://" or "https://"
// and must not include query parameters.StringurlPrefix="https://media.example.com/videos/";// Read the key as a base64 url-safe encoded string, then convert to byte array.// Key used in signing must be in raw form (not base64url-encoded).Stringbase64String=newString(Files.readAllBytes(Paths.get(keyPath)),StandardCharsets.UTF_8);byte[]keyBytes=Base64.getUrlDecoder().decode(base64String);// Create signed cookie from policy.StringsignedCookie=signCookie(urlPrefix,keyBytes,keyName,expirationTime);System.out.println(signedCookie);}// Creates a signed cookie for the specified policy.publicstaticStringsignCookie(StringurlPrefix,byte[]key,StringkeyName,longexpirationTime)throwsInvalidKeyException,NoSuchAlgorithmException{// Validate input URL prefix.try{URLvalidatedUrlPrefix=newURL(urlPrefix);if(!validatedUrlPrefix.getProtocol().startsWith("http")){thrownewIllegalArgumentException("urlPrefixmuststartwitheitherhttp:// or https://: " + urlPrefix);}if(validatedUrlPrefix.getQuery()!=null){thrownewIllegalArgumentException("urlPrefixmustnotincludequeryparams: " +urlPrefix);}}catch(MalformedURLExceptione){thrownewIllegalArgumentException("urlPrefixmalformed: " +urlPrefix);}StringencodedUrlPrefix=Base64.getUrlEncoder().encodeToString(urlPrefix.getBytes(StandardCharsets.UTF_8));StringpolicyToSign=String.format("URLPrefix=%s:Expires=%d:KeyName=%s",encodedUrlPrefix,expirationTime,keyName);Stringsignature=getSignatureForUrl(key,policyToSign);returnString.format("Cloud-CDN-Cookie=%s:Signature=%s",policyToSign,signature);}// Creates signature for input string with private key.privatestaticStringgetSignatureForUrl(byte[]privateKey,Stringinput)throwsInvalidKeyException,NoSuchAlgorithmException{finalStringalgorithm="HmacSHA1";finalintoffset=0;Keykey=newSecretKeySpec(privateKey,offset,privateKey.length,algorithm);Macmac=Mac.getInstance(algorithm);mac.init(key);returnBase64.getUrlEncoder().encodeToString(mac.doFinal(input.getBytes(StandardCharsets.UTF_8)));}}
La procedura di convalida di un cookie firmato è essenzialmente la stessa della generazione di un
cookie firmato. Ad esempio, supponiamo che tu voglia convalidare la seguente intestazione del cookie firmata:
Puoi utilizzare la chiave segreta denominata da KEY_NAME per
generare in modo indipendente la firma e poi convalidarne la corrispondenza con
SIGNATURE.
Emissione di cookie agli utenti
L'applicazione deve generare e inviare a ogni utente (client) un singolo HTTP
Cookie contenenti norme firmate correttamente:
Crea un firmatario HMAC-SHA-1 nel codice dell'applicazione.
Firma il criterio utilizzando la chiave scelta, prendendo nota del nome della chiave che hai
aggiunto al backend, ad esempio mySigningKey.
Crea una norma relativa ai cookie nel formato seguente, tenendo presente che sia il nome
e valore sono sensibili alle maiuscole:
Gli attributi Domain e Path nel cookie determinano se il client invia il cookie a Cloud CDN.
Consigli e requisiti
Imposta esplicitamente gli attributi Domain e Path in modo che corrispondano al prefisso del dominio e del percorso da cui intendi pubblicare i contenuti protetti, che potrebbero essere diversi dal dominio e dal percorso in cui viene emesso il cookie (example.com rispetto a media.example.com o /browse rispetto a /videos).
Assicurati di avere un solo cookie con un determinato nome per lo stesso nome
Domain e Path.
Assicurati di non inviare cookie in conflitto poiché ciò potrebbe impedire
accesso ai contenuti in altre sessioni del browser (finestre o schede).
Imposta i flag Secure e HttpOnly ove applicabile. Secure garantisce che
il cookie viene inviato solo tramite connessioni HTTPS. HttpOnly impedisce di rendere il
cookie disponibile a JavaScript.
Gli attributi dei cookie Expires e Max-Age sono facoltativi. Se le ometti,
il cookie esiste mentre esiste la sessione del browser (scheda, finestra).
In caso di riempimento della cache o mancata corrispondenza della cache, il cookie firmato viene trasmesso all'origine definita nel servizio di backend. Assicurati di convalidare la tua richiesta
il valore del cookie firmato su ogni richiesta prima della pubblicazione dei contenuti.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 2024-10-11 UTC."],[],[]]