【发布时间】:2021-05-11 14:02:13
【问题描述】:
我正在尝试将Amazon S3 用作具有加密功能的文件系统。
我能够使用KMS加密密钥(服务器端加密)成功实现在AWS S3服务器上上传文件。请在下面找到工作代码:
对于加密:
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);
以上代码用于读取没有kms加密密钥的对象,显示以下错误。
代码:无效参数
消息:使用 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加密的key presign URL读取对象,显示如下错误。
代码:SignatureDoesNotMatch
消息:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
这是正确的做法吗?有什么建议吗?请帮忙。
【问题讨论】:
-
我相信你需要force Signature Version 4...但是在生成
GETURL 时不要使用withSSEAlgorithm(SSEAlgorithm.KMS)。这可能会导致 SDK 对您将使用签名 URL 发出的实际请求的内容做出错误的假设。 -
谢谢@Michael-sqlbot 它正在工作......
-
现在我得到了自动下载 pdf/图像文件的正确工作 URL,但我想在浏览器查看器支持中显示而不是自动下载。还有什么办法吗?或任何配置?
-
如果您在 S3 控制台中检查对象元数据,它们是否显示正确的
Content-Type? -
@JaiminDarji ,我正在尝试和你做同样的事情但没有成功,可以把你的新代码放在这里吗?
标签: java amazon-web-services encryption amazon-s3 aws-kms