2015-12-27 32 views
5

Utilizzo di Java8 e aws-java-sdk 1.10.43 Sto cercando di ottenere un URL pre-firmato su un file S3. Faccio tornare un link, ma la navigazione ad esso portare a questo errore:Impossibile accedere all'URL S3 pre-firmato a causa dell'autorizzazione

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

sottolineare desidero generare un URL che può essere inviato via e-mail e ha aperto in un browser, non utilizzare il codice Java per leggi da quell'URL.

Sto usando il codice qui sotto, e credo di scoprire che ho bisogno di impostare in qualche modo setSSEAlgorithm per utilizzare "v4", tuttavia non sono riuscito a farlo funzionare. Cosa mi manca? Cosa devo configurare (nota: Sto evitando file di configurazione di proposito, voglio il codice per impostare tutti gli attributi da variabili d'ambiente)

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); 

il secchio è a eu-centrale-1

Grazie

+0

La soluzione proposta non ha aiutato - l'impostazione della proprietà è ancora generata per lo stesso risultato. Per confermare: sono in grado di generare un URL che sembra un URL presegnato, tuttavia incollare quell'URL in un browser porta al messaggio di errore. Non sto cercando di leggere il contenuto utilizzando il mio codice Java, ma desidero generare un URL da incollare all'interno di un browser (ad esempio inviare tramite e-mail) – user2339344

+0

La generazione di URL pre-firmati viene eseguita senza interagire con il servizio S3 effettivo, quindi ha senso che il tuo codice "funzioni" fino a quel punto e l'errore si verifica quando viene utilizzato l'URL. L'URL firmato che stai generando include 'Signature ='? ... o è 'x-amz-signature ='? –

+0

Firma = . Ecco un esempio dell'URL che ricevo: https: // ? AWSAccessKeyId = & Expires = 1451297351 & Signature = 1kD1IQfn2gfmJ% 2Fa2Wp2ZORVte0Y% 3D – user2339344

risposta

5

Utilizzando un certo aiuto che ho trovato la risposta, che era una combinazione di 2 pezzi mancanti (uno dei quali è stato indicato nei commenti):

  1. necessario impostare questo:

    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true"); 
    
  2. necessario impostare la "endPoint" (che non è stato richiesto per l'upload o il download):

    s3Client.setEndpoint(endpoint); 
    

Opzionalmente potrebbe essere utile aggiungere anche questo:

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

Questo funziona ... Ho eseguito solo il punto '2'. – Tirath