我们最近从 AWS SDK 1.x 迁移到 Java 2.x 并且 AWS S3 的 put 操作没有发生。S3 存储桶已启用加密(使用 AWS KMS 密钥)。
下面是我尝试使用的代码,但我收到下面提到的错误
使用 AWS KMS 托管密钥进行服务器端加密需要 HTTP 标头 x-amz-server-side-encryption:aws:kms(服务:S3,状态代码:400,请求 ID:xxx,扩展请求 ID:xxx/rY9ydIzxi3NROPiM=)
更新:我自己想通了。因此,任何想要受益于使用 KMS 密钥和 AWS SDK 2.x for Java 连接到 AWS S3 存储桶的人都可以使用下面的代码,它应该可以工作
Map<String, String> metadata = new HashMap<>();
metadata.put("x-amz-server-side-encryption", "aws:kms");
PutObjectRequest request = PutObjectRequest.builder()
//.bucketKeyEnabled(true)
.bucket(bucketName)
.key(Key)
.metadata(metadata)
.serverSideEncryption(ServerSideEncryption.AWS_KMS)
.ssekmsKeyId("arn:aws:kms:xxxxx")
.build();
File outputFile = new File("filename");
try (PrintWriter pw = new PrintWriter(outputFile)) {
data.stream()
.forEach(pw::println);
}
awsS3Client.putObject(request, RequestBody.fromBytes(String.join(System.lineSeparator(),
data).getBytes(StandardCharsets.UTF_8)));