在 Amazon S3 中使用 KMS 密钥解密文件时出错

2024-03-16

我正在尝试使用Amazon S3作为带有加密的文件系统。

我成功地使用 AWS S3 服务器实现了上传文件KMS加密密钥(服务器端加密)。请找到下面的工作代码:

对于加密:

private static final String AWS_KMS_KEY = "---KMS Key---"
private static final String BUCKET_NAME = "---bucket name---"
private static final String keyName = "---display key name---"
private static final String filePath = "---File Path---"
private static final String ACCESS_KEY_ID = "---aws accesskey---"
private static final String SECRET_ACCESS_KEY = "---aws secret key---"

AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY_ID, SECRET_ACCESS_KEY);
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
    .withRegion(Regions.US_WEST_2).withForceGlobalBucketAccessEnabled(true).build();

FileInputStream stream = new FileInputStream(filePath);

ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setSSEAlgorithm(SSEAlgorithm.KMS.getAlgorithm());

PutObjectRequest putObjectRequest = new PutObjectRequest(amazonFileUploadLocationOriginal, keyName, stream, objectMetadata);
putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);
putObjectRequest.withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(AWS_KMS_KEY));

PutObjectResult result = s3Client.putObject(putObjectRequest);

我在使用服务器端解密检索文件时遇到问题。我想直接访问 aws url 以检索该文件并解密。请找到以下不起作用的代码:

对于对象读取:

没有 KMS 密钥的对象读取:

GetObjectRequest request = new GetObjectRequest(existingBucketName, amazonFileUploadLocationOriginal);
s3Client.getUrl(BUCKET_NAME, keyName); 

上面的代码用于读取没有 km​​s 加密密钥的对象,显示以下错误。

代码:无效参数

消息:使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4。


使用 KMS 密钥读取对象:

GeneratePresignedUrlRequest genreq = new GeneratePresignedUrlRequest(BUCKET_NAME, keyName, HttpMethod.GET)
            .withSSEAlgorithm(SSEAlgorithm.KMS)
            .withKmsCmkId(AWS_KMS_KEY);

URL puturl = s3Client.generatePresignedUrl(genreq);

上面的代码用于使用 kms 加密密钥预签名 URL 读取对象,显示以下错误。

代码:签名不匹配

消息:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。

这是正确的做法吗?有什么建议吗?请帮忙。


如果签名不匹配请使用以下代码手动添加 以供参考

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

我们可以使用下面的代码来获取主持的URL get

GeneratePresignedUrlRequest genreq = new GeneratePresignedUrlRequest(BUCKET_NAME, keyName, HttpMethod.GET)
 .withExpiration(expiration);

URL puturl = s3Client.generatePresignedUrl(genreq);

该 URL 将包含到期时间和签名,如下所示

output

https://mybucket.s3.amazonaws.com/abc_count.png?AWSAccessKeyId=AKIAJXXXXXXXXXXXXXXX&Expires=1503602631&Signature=ibOGfAovnhIF13DALdAgsdtg2s%3D

希望有人能帮助这个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Amazon S3 中使用 KMS 密钥解密文件时出错 的相关文章

随机推荐