ablog

不器用で落着きのない技術者のメモ

KMSで別のキーマテリアルを CMK にインポートすることはできない

CMK を作成してインポートする
  • CMK を作成する。
$ aws kms create-key --origin EXTERNAL --description byok_key_test1
{
    "KeyMetadata": {
        "Origin": "EXTERNAL",
        "KeyId": "02c66c29-81b3-404b-beba-35355b4a56cc",
        "Description": "byok_key_test1",
        "KeyManager": "CUSTOMER",
        "Enabled": false,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "PendingImport",
        "CreationDate": 1540823706.373,
        "Arn": "arn:aws:kms:ap-northeast-1:123456789012:key/02c66c29-81b3-404b-beba-35355b4a56cc",
        "AWSAccountId": "123456789012"
    }
}
$ aws kms create-alias --alias-name alias/byok-key-test1 --target-key-id 02c66c29-81b3-404b-beba-35355b4a56cc
  • PublicKey と ImportToken をダウンロードする。
$ aws kms get-parameters-for-import \
--key-id 02c66c29-81b3-404b-beba-35355b4a56cc \
--wrapping-algorithm RSAES_PKCS1_V1_5 \
--wrapping-key-spec RSA_2048
  • 上記のPublicKey を PublicKey.b64、ImportToken を ImportToken.b64 というファイル名で保存する。
  • PublicKey と ImportToken をそれぞれbase64デコードして、新しいファイルで保存する。
$ openssl enc -d -a -A -in PublicKey.b64 -out PublicKey.bin
$ openssl enc -d -a -A -in ImportToken.b64 -out ImportToken.bin
  • KMS にインポートする CMK を作成する
$ openssl rand -out PlaintextKeyMaterial.bin 32
  • 生成した CMK を、デコードした PublicKey を使って暗号化する。
$ openssl rsautl -encrypt \
-in PlaintextKeyMaterial.bin \
-pkcs \
-inkey PublicKey.bin \
-keyform DER \
-pubin \
-out EncryptedKeyMaterial.bin
  • CMK を KMS にインポートする。
$ aws kms import-key-material --key-id 02c66c29-81b3-404b-beba-35355b4a56cc \
--encrypted-key-material fileb://EncryptedKeyMaterial.bin \
--import-token fileb://ImportToken.bin \
--expiration-model KEY_MATERIAL_EXPIRES \
--valid-to 2018-11-01T00:00:00-00:00
  • キーの定義を確認する
$ aws kms describe-key --key-id 02c66c29-81b3-404b-beba-35355b4a56cc
{
    "KeyMetadata": {
        "Origin": "EXTERNAL",
        "KeyId": "02c66c29-81b3-404b-beba-35355b4a56cc",
        "Description": "byok_key_test1",
        "KeyManager": "CUSTOMER",
        "ExpirationModel": "KEY_MATERIAL_EXPIRES",
        "ValidTo": 1541030400.0,
        "Enabled": true,
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "Enabled",
        "CreationDate": 1540823706.373,
        "Arn": "arn:aws:kms:ap-northeast-1:123456789012:key/02c66c29-81b3-404b-beba-35355b4a56cc",
        "AWSAccountId": "123456789012"
    }
}
CMK を削除して再インポートする
  • キーマテリアルを削除する
$ aws kms delete-imported-key-material --key-id 02c66c29-81b3-404b-beba-35355b4a56cc
  • キーの定義を確認する
$ aws kms describe-key --key-id 02c66c29-81b3-404b-beba-35355b4a56cc
{
    "KeyMetadata": {
        "Origin": "EXTERNAL",
        "KeyId": "02c66c29-81b3-404b-beba-35355b4a56cc",
        "Description": "byok_key_test1",
        "KeyManager": "CUSTOMER",
        "Enabled": false, ★
        "KeyUsage": "ENCRYPT_DECRYPT",
        "KeyState": "PendingImport", ★
        "CreationDate": 1540823706.373,
        "Arn": "arn:aws:kms:ap-northeast-1:123456789012:key/02c66c29-81b3-404b-beba-35355b4a56cc",
        "AWSAccountId": "123456789012"
    }
}
  • PublicKey と ImportToken をダウンロードする。
aws kms get-parameters-for-import \
--key-id 02c66c29-81b3-404b-beba-35355b4a56cc \
--wrapping-algorithm RSAES_PKCS1_V1_5 \
--wrapping-key-spec RSA_2048
  • 上記のPublicKey を PublicKey.b64、ImportToken を ImportToken.b64 というファイル名で保存する。
  • PublicKey と ImportToken をそれぞれbase64デコードして、新しいファイルで保存する。
$ openssl enc -d -a -A -in PublicKey.b64 -out PublicKey.bin
$ openssl enc -d -a -A -in ImportToken.b64 -out ImportToken.bin
  • KMS にインポートする CMK を作成する
$ openssl rand -out PlaintextKeyMaterial.bin 32
  • 生成した CMK を、デコードした PublicKey を使って暗号化する。
$ openssl rsautl -encrypt \
-in PlaintextKeyMaterial.bin \
-pkcs \
-inkey PublicKey.bin \
-keyform DER \
-pubin \
-out EncryptedKeyMaterial.bin
  • CMK を KMS にインポートする。
$ aws kms import-key-material --key-id 02c66c29-81b3-404b-beba-35355b4a56cc \
--encrypted-key-material fileb://EncryptedKeyMaterial.bin \
--import-token fileb://ImportToken.bin \
--expiration-model KEY_MATERIAL_EXPIRES \
--valid-to 2018-11-01T00:00:00-00:00

An error occurred (IncorrectKeyMaterialException) when calling the ImportKeyMaterial operation: ★同じキーマテリアルでないため失敗する