2015-10-08 5 views
9

Bilder werden in einen Amazon S3-Bucket hochgeladen. Ich muss eine vorgebrachte URL vom Amazon-Server erhalten. Ich möchte auch die Ablaufzeit dieser URL festlegen. Das kann nur maximal 17 Tage dauern. Aber ich kann nicht maximal 1 Jahr Ablaufzeit einstellen.So legen Sie die Ablaufzeit für vordefinierte URLs für Amazon S3-Buckets in einem Jahr ab dem aktuellen Datum fest

 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 - v4 Unterzeichnung Algo erlaubt nur 7 Tage. (Zu v4 aus der Dokumentation: Diese neueste Signaturversion wird in allen Regionen unterstützt und alle neuen Regionen nach dem 30. Januar 2014 unterstützen nur die Signaturversion 4.) Sie sollten also die vordefinierte URL bei Bedarf generieren. – HopeKing

Antwort

13

Sie erhalten keine zuvor signierte URL "vom Server". Die Signaturberechnung erfolgt auf dem Client. Pre-signed URLs werden tatsächlich auf Ihrem Computer und nicht von dem Dienst berechnet.

Wenn Sie ein aktuelles SDK verwenden, wird wahrscheinlich Signature V4 verwendet. Wenn die signierte URL X-Amz-Signature= enthält, bestätigt dies V4. Der ältere V2-Algorithmus verwendet nur Signature= in einer signierten URL.

Wenn Ihre Unterschrift ist in der Tat V4, dann sehen Sie eine beabsichtigte Einschränkung:

A presigned URL kann für maximal sieben Tage gültig sein, weil der Signaturschlüssel Sie in Signaturberechnung aufbrauchen gültig ist zu sieben Tagen.

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

Wenn Sie bereits V2 verwenden, sollten Sie in der Lage sein, URLs mit Ablaufzeiten unterzeichnen noch im Jahr 2038. Wenn Sie V4 verwenden, können Sie rund um die Einschränkung zu umgehen durch die Umstellung auf benutze V2, aber das ist nicht ratsam. V2 wird in neueren S3-Regionen, wie Frankfurt, nicht unterstützt. Wenn Sie Ihre AWS-Zugriffsschlüssel wie gewünscht drehen, werden auch alle Signaturen, die mit diesem Schlüssel erstellt wurden, ungültig.

In den meisten Fällen ist es die korrektere Methode, die signierte URL zu generieren, wenn Sie sie benötigen. Diese Operation erfordert, wie erwähnt, keine Interaktion mit dem S3-Dienst und kann typischerweise in Echtzeit ausgeführt werden.

Wenn Sie einem bestimmten Benutzer Zugriff auf einen "direkten Link" gewähren möchten, sollten Sie einen Endpunkt in Ihrer Anwendung erstellen, in dem die Anmeldeinformationen des Benutzers ausgewertet werden können. An diesem Punkt können Sie eine signierte URL generieren und den Browser umleiten HTTP 302 Antwort.

+0

Wie kann ich zu V2 wechseln? Gibt es eine globale Eigenschaft dafür? – Ruslan

+1

V2 funktioniert nicht in neueren Regionen, @Ruslan, und da V4 in den meisten Fällen ein weit besserer Algorithmus ist, weiß ich nicht, ob das mehr möglich ist, aber es ist wahrscheinlich. In welcher Region arbeiten Sie und welches SDK verwenden Sie? Etwas, das ich in dieser Antwort hätte erwähnen sollen, ist CloudFront. CloudFront verwendet einen anderen Authentifizierungsmechanismus als S3, kann jedoch vor jedem Bucket verwendet werden. CloudFront-signierte URLs sind nicht auf kurze Zeitintervalle beschränkt und haben zwei Optionen, die S3 nicht hat: Sie können eine signierte URL auf die Verwendung von einer einzelnen IP-Adresse beschränken, und Sie können auch die Startgültigkeitszeit festlegen. –

+1

Ich bin in einer alten Region, denke ich. Danke für die Antwort, aber ich habe schon eine Lösung gefunden :-) clientConfiguration.setSignerOverride ("S3SignerType") – Ruslan

Verwandte Themen