我正在尝试将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加密密钥的读取对象,显示以下错误。
代码:InvalidArgument
消息:使用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的读取对象,其显示以下错误。
代码:SignatureDoesNotMatch
消息:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
这是正确的方法吗?有什么建议吗?请帮忙。
答案 0 :(得分:1)
如果签名不匹配请使用以下代码手动添加 供参考AWS java SDK manually set signature version
System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");
我们可以使用下面的代码来获取主持的网址
GeneratePresignedUrlRequest genreq = new GeneratePresignedUrlRequest(BUCKET_NAME, keyName, HttpMethod.GET)
.withExpiration(expiration);
URL puturl = s3Client.generatePresignedUrl(genreq);
此 URL 将包含时间和签名的到期时间,如下所示
输出
https://mybucket.s3.amazonaws.com/abc_count.png?AWSAccessKeyId=AKIAJXXXXXXXXXXXXXXX&Expires=1503602631&Signature=ibOGfAovnhIF13DALdAgsdtg2s%3D
希望有人对此有所帮助