AWS Java SDK - AWS authentication requires a valid Date or x-amz-date header

JavaAmazon Web-ServicesAmazon S3JodatimeAws Sdk

Java Problem Overview


Getting the following exception when using the AWS SDK for Java and 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]

Java Solutions


Solution 1 - Java

This is caused by a bug between JodaTime and versions of Java greater then 1.8u60. Upgrading to JodaTime version 2.8.1 or later solves the issue. See the following Github issues for reference.

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

Solution 2 - Java

As far as I can see, there are three solutions to this issue:

  • upgrade joda time
  • upgrade the AWS java SDK
  • downgrade java to a version less than 1.8u60 (java7 seems to work fine)

Solution 3 - Java

Update your AWS Java SDK to 1.10.1 or later

Solution 4 - Java

I faced while using presto. The problem is with java version jdk1.8.0_60 greater downgrade it to jdk1.8.0_45 will solve the problem

Solution 5 - Java

i have faced same problem.i have solved now.only thing is that java 1.8u60+ does not support aws sdk 1.10.10 so you can just update aws sdk version 1.11.52 ..i mean latest version and it resolved it.

Also please look out for the conflicts in the dependency tree, when you upgrade the versions. In my case there was a conflict with the httpclient after upgrading aws sdk version.

Solution 6 - Java

All the answers above drove me nuts because they recommend changing libraries, clients or some other major change. I have to use client 1.9.31 and I don't have control over which joda or JVM. So here is the java fix without having to do everything above!

Before you send your request, like PutObjectRequest, do this:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndrew ShoreView Question on Stackoverflow
Solution 1 - JavaAndrew ShoreView Answer on Stackoverflow
Solution 2 - JavamooredsView Answer on Stackoverflow
Solution 3 - JavaRhythmView Answer on Stackoverflow
Solution 4 - JavaAvinash SinghView Answer on Stackoverflow
Solution 5 - JavaVipul KachaView Answer on Stackoverflow
Solution 6 - JavaJon CanoView Answer on Stackoverflow