AWS Java SDK - AWS身份验证需要有效的Date或x-amz-date标头

时间:2015-08-17 19:43:23

标签: java amazon-web-services amazon-s3 jodatime aws-sdk

使用AWS SDK for Java和Java 1.8u60 +时获得以下异常。

com.amazonaws.services.s3.model.AmazonS3Exception: AWS authentication requires a valid Date or x-amz-date header (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 41C359C079CBAFCF)
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1182) ~[aws-java-sdk-core-1.10.10.jar:na]
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:770) ~[aws-java-sdk-core-1.10.10.jar:na]
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:489) ~[aws-java-sdk-core-1.10.10.jar:na]
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:310) ~[aws-java-sdk-core-1.10.10.jar:na]
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3608) ~[aws-java-sdk-s3-1.10.10.jar:na]
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3561) ~[aws-java-sdk-s3-1.10.10.jar:na]
    at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:647) ~[aws-java-sdk-s3-1.10.10.jar:na]
    at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:632) ~[aws-java-sdk-s3-1.10.10.jar:na]

6 个答案:

答案 0 :(得分:87)

这是由JodaTime与Java版本之间的错误导致的,大于1.8u60。升级到JodaTime版本2.8.1或更高版本可以解决此问题。请参阅以下Github问题以供参考。

https://github.com/aws/aws-sdk-java/issues/484 https://github.com/aws/aws-sdk-java/issues/444

答案 1 :(得分:5)

据我所知,这个问题有三种解决方案:

  • 升级joda时间
  • 升级AWS java SDK
  • 将java降级到小于1.8u60的版本(java7似乎工作正常)

答案 2 :(得分:4)

将您的AWS Java SDK更新为1.10.1或更高版本

答案 3 :(得分:2)

我在使用presto时遇到了。 问题是java版jdk1.8.0_60更大降级到jdk1.8.0_45会解决问题

答案 4 :(得分:1)

我遇到了同样的问题。我现在已经解决了。唯一的事情是java 1.8u60 +不支持aws sdk 1.10.10所以你可以更新aws sdk版本1.11.52 ..i意味着最新版本它解决了它

另外,请在升级版本时注意依赖关系树中的冲突。在我的情况下,升级aws sdk版本后与httpclient发生冲突。

答案 5 :(得分:0)

以上所有答案都让我抓狂,因为他们建议更改库、客户端或其他一些重大更改。我必须使用客户端 1.9.31,我无法控制哪个 joda 或 JVM。所以这里是 java 修复程序,无需执行上述所有操作!

在您发送请求(如 PutObjectRequest)之前,请执行以下操作:

putObjectRequest.putCustomRequestHeader("x-amz-date", getServerTime());

public static String getServerTime() {
    SimpleDateFormat dateFormat = new SimpleDateFormat(
        "EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
    return dateFormat.format(Calendar.getInstance().getTime());
}