2015-12-27 17 views
5

Sử dụng Java8 và aws-java-sdk 1.10.43 Tôi đang cố gắng lấy URL được ký trước vào tệp S3. Tôi làm lấy lại một liên kết, nhưng việc duyệt để nó dẫn đến lỗi này:Không thể truy cập S3 URL đã ký trước do ủy quyền

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

Để nhấn mạnh, tôi muốn tạo ra một URL có thể được gửi qua email và mở trong một trình duyệt, không sử dụng mã Java để đọc từ URL đó.

Tôi đang sử dụng mã dưới đây và tôi tin rằng tôi cần phải thiết lập setSSEAlgorithm để sử dụng "v4", tuy nhiên tôi đã không thực hiện được. Tôi đang thiếu gì? Tôi nên cấu hình gì (lưu ý: Tôi tránh tập tin cấu hình trên mục đích, tôi muốn mã để thiết lập tất cả các thuộc tính từ biến môi trường)

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

Các xô là eu-trung-1

Cảm ơn bạn

+0

Giải pháp được đề xuất không có tác dụng - thiết lập thuộc tính vẫn được tạo ra cho cùng một kết quả. Để liên kết: Tôi có thể tạo URL có vẻ như là URL được chỉ định, tuy nhiên việc dán URL đó vào trình duyệt dẫn đến thông báo lỗi. Tôi không cố gắng đọc nội dung bằng mã Java của mình, nhưng tôi muốn tạo URL để dán trong trình duyệt (ví dụ: gửi qua email) – user2339344

+0

Tạo URL được ký trước được thực hiện mà không tương tác với dịch vụ S3 thực, vì vậy có nghĩa là mã của bạn "hoạt động" đến thời điểm đó và lỗi xảy ra khi URL được sử dụng. URL đã ký bạn đang tạo có bao gồm 'Chữ ký ='? ... hay là 'x-amz-signature ='? –

+0

Chữ ký = . đây là ví dụ về URL tôi nhận được: https: // ? AWSAccessKeyId = & Expires = 1451297351 & Signature = 1kD1IQfn2gfmJ% 2Fa2Wp2ZORVte0Y% 3D – user2339344

Trả lời

5

Sử dụng một số giúp đỡ tôi đã tìm thấy câu trả lời, đó là sự kết hợp của 2 mảnh còn thiếu (một trong số đó đã được đề cập đến trong các ý kiến):

  1. Cần phải thiết lập này:

    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true"); 
    
  2. Phải đặt "dùng cuối" (mà đã không cần thiết cho upload hoặc download):

    s3Client.setEndpoint(endpoint); 
    

tùy ý nó có thể có ích cũng để thêm video này:

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

Tác phẩm này ... Tôi chỉ thực thi điểm '2'. – Tirath

Các vấn đề liên quan