2015-12-27 11 views
5

Verwenden von Java8 und aws-java-sdk 1.10.43 Ich versuche, eine Pre-Signed-URL zu einer S3-Datei zu erhalten. Ich bekomme einen Link zurück, aber es gerade zu diesem Fehler führen:Zugriff auf die S3 Pre-Signed-URL aufgrund der Autorisierung nicht möglich

authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256

Um zu betonen, ich möchte eine URL erzeugen, die in einem Browser per E-Mail und geöffnet gesendet werden können, nicht Java-Code zu verwenden, um Lese von dieser URL.

Ich benutze den folgenden Code, und ich glaube, ich muss SetSEAlgorithm irgendwie festlegen, um "v4" zu verwenden, aber ich habe es nicht geschafft, es zu arbeiten. Was vermisse ich? Was sollte ich konfigurieren (Anmerkung: Ich Konfigurationsdatei absichtlich bin zu vermeiden, möchte ich den Code alle Attribute von Umgebungsvariablen zu setzen)

Date expiration = <some date>; 
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, targetPath); 
generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
generatePresignedUrlRequest.setExpiration(expiration); 

AmazonS3 s3client = new AmazonS3Client(s3Credentials); 
URL s = s3client.generatePresignedUrl(generatePresignedUrlRequest); 

Der Eimer auf EU-central-1 ist

Danke

+0

Die dort vorgeschlagene Lösung half nicht - die noch generierte Eigenschaft auf das gleiche Ergebnis zu setzen. Zu clerify: Ich kann eine URL generieren, die wie eine vordefinierte URL aussieht, aber das Einfügen dieser URL in einen Browser führt zu der Fehlermeldung. Ich versuche nicht, den Inhalt mit meinem Java-Code zu lesen, aber ich möchte eine URL erzeugen, die innerhalb eines Browsers eingefügt wird (zB per E-Mail) – user2339344

+0

Das Generieren von vor-signierten URLs erfolgt ohne Interaktion mit dem eigentlichen S3-Dienst, also Es macht Sinn, dass Ihr Code zu diesem Punkt "funktioniert" und der Fehler auftritt, wenn die URL verwendet wird. Enthält die signierte URL, die Sie generieren, Signature = '? ... oder ist es 'x-amz-signature ='? –

+0

Signatur = . Hier ist ein Beispiel für die URL, die ich erhalte: https: // ? AWSAccessKeyId = & Expires = 1451297351 & Signatur = 1kD1IQfn2gfmJ% 2Fa2Wp2ZORVte0Y% 3D – user2339344

Antwort

5

etwas Hilfe verwenden ich die Antwort gefunden haben, die eine Kombination aus zwei fehlenden Stücken war (von denen in den Kommentaren genannt wurde):

  1. dies einstellen müssen:

    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true"); 
    
  2. Muss die "endPoint" gesetzt (die nicht für den Upload oder Download erforderlich war):

    s3Client.setEndpoint(endpoint); 
    

Optional kann es sinnvoll sein, auch hinzufügen:

s3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true)); 
+0

Das funktioniert ... Ich habe nur den '2'-Punkt ausgeführt. – Tirath