2015-10-08 14 views
9

Le immagini vengono caricate su un bucket Amazon S3. Devo ottenere un URL preselezionato dal server Amazon. Inoltre voglio impostare il tempo di scadenza di tale URL. Questo può richiedere solo un massimo di 17 giorni. Ma non posso impostare un massimo di 1 anno di scadenza.Come impostare il tempo di scadenza dell'URL del secchio Amazon S3 in 1 anno dalla data corrente

 Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.YEAR, 1); 
     Date nextYear = cal.getTime(); 

    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
       "bucketName", "accessname"); 
     generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
     generatePresignedUrlRequest 
       .setExpiration(nextYear); 
     URL url = s3client 
       .generatePresignedUrl(generatePresignedUrlRequest); 
     bucketURL = url.toString(); 
+0

TL: DR - la firma v4 algo consente solo 7 giorni. (Per quanto riguarda la v4 dai documenti: questa ultima versione della firma è supportata in tutte le regioni e ogni nuova regione dopo il 30 gennaio 2014 supporterà solo la versione 4 della firma). Pertanto, è meglio generare l'URL preselezionato quando richiesto. – HopeKing

risposta

13

Non si "ottiene" un URL pre-firmato dal server. " Il calcolo della firma viene eseguito sul client. Gli URL pre-firmati vengono effettivamente calcolati sulla macchina, non dal servizio.

Se si utilizza un SDK corrente, è probabile che si utilizzi Signature V4. Se l'URL firmato include X-Amz-Signature=, ciò conferma V4. Il precedente algoritmo V2 utilizza solo Signature= in un URL firmato.

Se la firma è davvero V4, allora si sta vedendo una limitazione intenzionale:

Un URL presigned può essere valido per un massimo di sette giorni, perché la chiave di firma si utilizza nel calcolo della firma è valida per un massimo a sette giorni.

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

Se si sta già utilizzando V2, si dovrebbe essere in grado di firmare gli URL con tempi di scadenza più tardi l'anno 2038. Se si utilizza V4, si potrebbe aggirare la limitazione passando a usare V2, ma non è consigliabile. V2 non è supportato nelle nuove regioni S3, come Francoforte, e se si ruotano le chiavi di accesso AWS come si deve, l'eventuale invalidazione della chiave invaliderà anche le firme create con quella chiave.

L'approccio più corretto nella maggior parte dei casi è generare l'URL firmato quando è necessario. Tale operazione, come notato, non richiede alcuna interazione con il servizio S3 e in genere può essere eseguita in tempo reale.

Se è necessario concedere a un utente specifico l'accesso a un "collegamento diretto", prendere in considerazione la creazione di un endpoint nell'applicazione in cui è possibile valutare le credenziali dell'utente, a quel punto è possibile generare un URL firmato e reindirizzare il browser con un Risposta HTTP 302.

+0

Come posso passare a V2? Esiste una proprietà globale per questo? – Ruslan

+1

V2 non funziona nelle regioni più recenti, @Ruslan, e dal momento che V4 è per molti aspetti un algoritmo di gran lunga migliore, non so se questo è più possibile, ma probabilmente lo è. In quale regione stai lavorando e quale SDK stai utilizzando? Qualcosa che avrei dovuto pensare di questa risposta è CloudFront. CloudFront utilizza un meccanismo di autenticazione diverso da S3 ma può essere utilizzato davanti a qualsiasi Bucket. Gli URL firmati CloudFront non sono limitati a intervalli di tempo brevi e hanno due opzioni S3: non è possibile limitare l'utilizzo di un URL firmato da un singolo indirizzo IP e impostare anche l'ora di inizio validità. –

+1

Sono in una vecchia regione, immagino. Grazie per la risposta, ma ho già trovato una soluzione :-) clientConfiguration.setSignerOverride ("S3SignerType") – Ruslan

Problemi correlati