px0*_*x06 5 java amazon-s3 amazon-web-services amazon-kms
我正在使用 awssdk v2: https: //sdk.amazonaws.com/java/api/latest/
我想使用客户管理的 KMS 密钥将对象放入 S3 中进行静态加密,我使用 sse-c 来实现此目的。然而,它似乎总是默认使用 AWS 托管密钥,而不是客户托管密钥。
以下是我的代码:
PutObjectRequest putObjectRequest =
PutObjectRequest.builder()
.bucket(bucket)
.key(key)
.serverSideEncryption(ServerSideEncryption.AWS_KMS)
.ssekmsKeyId(this.s3KmsKeyId) // my key alias
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromString(data)); // data = some string value
Run Code Online (Sandbox Code Playgroud)
我使用PutObjectRequest来配置我的请求,并使用 S3Client将其发送到 S3。
由于按键设置为旋转,因此我无法使用 arn 或其keyId
本身。我似乎也找不到如何使用此 sdk 实现此目的的示例。
为了能够从 KMS 检索 KMS 密钥 ID,您需要使用KmsClient。sseKmsKeyId
将不接受别名,因为它无法使用别名找出密钥 ID。
您可以执行以下操作:
KmsClient kmsClient = KmsClient.builder().build();
DescribeKeyRequest req = DescribeKeyRequest.builder().keyId("alias/your_kms_alias").build();
DescribeKeyResponse res = kmsClient.describeKey(req);
// See https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html
// For the response you will get back from DescribeKey
// Then create the request to S3
PutObjectRequest putObjectRequest =
PutObjectRequest.builder()
.bucket(bucket)
.key(key)
.serverSideEncryption(ServerSideEncryption.AWS_KMS)
.ssekmsKeyId(res.keyMetadata().keyId()) // the actual keyId from KMS CMK
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromString(data));
Run Code Online (Sandbox Code Playgroud)
另请参阅: https: //sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/kms/model/DescribeKeyRequest.html#keyId--
如果您指定预定义的 AWS 别名(没有密钥 ID 的 AWS 别名),KMS 会将该别名与 AWS 托管 CMK 关联,并在响应中返回其 KeyId 和 Arn。
希望有帮助。
归档时间: |
|
查看次数: |
9623 次 |
最近记录: |