微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

即使设置了 v4 签名,AWS 异常“使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4”

如何解决即使设置了 v4 签名,AWS 异常“使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4”

我有以下代码可以连接到 AWS S3。

    System.setProperty(SDKGlobalConfiguration.ENABLE_S3_sigv4_SYstem_PROPERTY,"true");

    try {
        s3Client = new AmazonS3Client(new BasicAWSCredentials("myAccessKey","mySecretKey"),new ClientConfiguration());
        ......
        s3Client.putObject(...);
        ......
    } catch (Exception e) {
        System.out.println(e.toString());
    }

但是,我遇到了错误

com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400,AWS Service: Amazon S3,AWS Request ID: 9CA32042ABE3635A,AWS Error Code: InvalidArgument,AWS Error Message: Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
! at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798)
! at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421)
! at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)
! at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528)
! at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1393)
! at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1249)
! at com.aktana.dse2020.data.service.S3Service.put(S3Service.java:107)
! at com.aktana.api.resource.DSEConfiguratorResource.getConfigTransferExport(DSEConfiguratorResource.java:1278)
! at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
! at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
! at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
! at java.lang.reflect.Method.invoke(Method.java:498)
! at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
! at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethoddispatcher$1.run(AbstractJavaResourceMethoddispatcher.java:144)
! at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethoddispatcher.invoke(AbstractJavaResourceMethoddispatcher.java:161)
! at org.glassfish.jersey.server.model.internal.JavaResourceMethoddispatcherProvider$TypeOutInvoker.dodispatch(JavaResourceMethoddispatcherProvider.java:205)
! at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethoddispatcher.dispatch(AbstractJavaResourceMethoddispatcher.java:99)
! at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
! at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
! at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
! at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
......

我在网上搜索了一下,建议将签名设置为版本 4,我已经这样做了。有什么想法吗?

请注意,我的 aws jdk 已经过时了,因为由于其他一些库冲突,我无法升级它。

解决方法

将 AWS SDK 客户端配置设置为 V4 签名

Java:

ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setSignerOverride("AWSS3V4SignerType");
AmazonS3 AmazonS3 = 
 AmazonS3ClientBuilder.standard().withClientConfiguration(clientConfig)
            .build();

NodeJ:

new S3({ signatureVersion: 'v4' })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。