通过Java应用程序将对象放入S3会提示缺少AWS签名

0

【以下的问题经过翻译处理】 你好,

我正在尝试从我的Java应用程序向S3存储桶写入数据。我的应用程序运行在EKS上。我已经使用系统属性aws.accessKeyIdaws.secretAccessKey提供了AWS凭证。

当发送put请求时,我收到这个错误 - com.amazonaws.services.s3.model.AmazonS3Exception: Put Object requests with Object Lock parameters require AWS Signature Version 4 (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument

Java SDK应该自动使用凭证进行身份验证,不需要计算签名。我是否漏掉了什么?

profile picture
专家
已提问 5 个月前10 查看次数
1 回答
0

【以下的回答经过翻译处理】 该错误消息表明,您需要使用AWS Signature Version 4来验证带Object Lock参数的请求到Amazon S3。这是因为Object Lock是一项提供WORM(一次写入,多次读取)功能的特性,因此需要更高级别的安全性。

您可以通过从代码中删除.withClientConfiguration(new ClientConfiguration().withSignerOverride("AWSS3V4SignerType"))行来启用Signature Version 4。如果所调用的API需要它,AWS SDK for Java将自动使用Signature Version 4。

以下是更新后的代码:

final AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration(
            s3Endpoint,
            s3Region
    );

final AmazonS3 s3client = AmazonS3ClientBuilder
            .standard()
            .withEndpointConfiguration(endpoint)
            .enablePathStyleAccess()
            .build();

请注意,建议使用IAM role或Instance Profile为在EC2或EKS上运行的应用程序提供AWS凭证,而不是使用显式访问密钥。这种方法可以帮助提高安全性和简化凭证管理。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则