如何使用别名获取KMS KeyId?

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 实现此目的的示例。

Tob*_*oby 5

为了能够从 KMS 检索 KMS 密钥 ID,您需要使用KmsClientsseKmsKeyId将不接受别名,因为它无法使用别名找出密钥 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。

希望有帮助。