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

Posted

技术标签:

【中文标题】AWS Java SDK - AWS 身份验证需要有效的 Date 或 x-amz-date 标头【英文标题】:AWS Java SDK - AWS authentication requires a valid Date or x-amz-date header 【发布时间】:2015-11-10 13:33:26 【问题描述】:

使用适用于 Java 和 Java 1.8u60+ 的 AWS 开发工具包时出现以下异常。

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]

【问题讨论】:

请说明问题是什么。 【参考方案1】:

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

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

【讨论】:

为什么这不是一个被接受的答案?无论如何,谢谢伙计,为我节省了很多时间!【参考方案2】:

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

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

【讨论】:

是否有更新的 Java 更新可以解决该问题?这是 java 的一个 bug,还是会在未来的 java 版本中中断?【参考方案3】:

将您的 AWS Java 开发工具包更新到 1.10.1 或更高版本

【讨论】:

我将 AWS Java SDK 更新到 1.10.10 但仍然出现此错误。【参考方案4】:

我在使用 presto 时遇到过。 问题是java版本jdk1.8.0_60更大,降级到jdk1.8.0_45就可以解决问题

【讨论】:

降级 JDK 不是答案。按照上面的建议更好地更新 Joda - 通过更新 AWS SDK 或明确【参考方案5】:

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

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

【讨论】:

【参考方案6】:

以上所有答案都让我发疯了,因为他们建议更改库、客户端或其他一些重大更改。我必须使用客户端 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());

【讨论】:

以上是关于AWS Java SDK - AWS 身份验证需要有效的 Date 或 x-amz-date 标头的主要内容,如果未能解决你的问题,请参考以下文章

AWS iOS SDK Cognito 开发人员身份验证 (Swift)

在 React 应用程序中为基于 JavaScript AWS Amplify SDK / AWS Cognito 的身份验证分离用户池

向 AWS Userpool 验证社交身份联合用户? - 安卓

AWS Java SDK 按配置文件调用

保护 AWS JS SDK Api 调用

AWS SES PHP SDK 请求需要来自经过验证的域?