OpenSSL を使用して、暗号化されたキーマテリアルを AWS Key Management Service (AWS KMS) にインポートしました。しかし、リクエストが失敗し、「InvalidCiphertext」エラーが表示されました。
簡単な説明
デフォルトでは、OpenSSL は SHA-1 ハッシュ関数 (RSAES_OAEP_SHA_256 アルゴリズム) を使用します。
RSAES_OAEP_SHA_256 アルゴリズムを使用する場合のインポートエラーを回避するには、OpenSSL を使用してキーマテリアルを暗号化してください。openssl pkeyutl コマンドを実行し、-pkeyopt rsa_padding_mode:oaep と -pkeyopt rsa_oaep_md:sha256 のパラメータを指定します。
解決策
AWS KMS キーを作成するためのキーマテリアルのオリジンに「外部」を使用する
AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「Troubleshoot AWS CLI errors」を参照してください。また、必ず AWS CLI の最新バージョンを使用してください。
AWS CLI の create-key コマンドと create-alias コマンドを実行して、外部キーマテリアル用の AWS KMS を作成します。
export REGION=example-region-1export KEY_ALIAS=kms_key_with_externalmaterial
export KEY_ID=`aws kms create-key --region $REGION --origin EXTERNAL --description $KEY_ALIAS --query KeyMetadata.KeyId --output text`
aws kms --region $REGION create-alias --alias-name alias/$KEY_ALIAS --target-key-id $KEY_ID
注: example-region-1 と kms_key_with_externalmaterial をキーの値に置き換えてください。
キーマテリアルをインポートするまで、AWS KMS キーのステータスは [インポート保留中] のままです。次のコマンドを実行してキーのステータスを表示します。
aws kms --region $REGION describe-key --key-id $KEY_ID
ラッピング公開鍵とインポートトークンをダウンロードする
AWS CLI の get-parameters-for-import コマンドを実行して、PublicKey と ImportToken の値を取得します。
export KEY_PARAMETERS=`aws kms --region $REGION get-parameters-for-import --key-id $KEY_ID --wrapping-algorithm RSAES_OAEP_SHA_256 --wrapping-key-spec RSA_2048`echo $KEY_PARAMETERS | awk '{print $7}' | tr -d '",' | base64 --decode > PublicKey.bin
echo $KEY_PARAMETERS | awk '{print $5}' | tr -d '",' | base64 --decode > ImportToken.bin
base64 を使用して両方の値をデコードし、これらの値を別々のファイルに保存します。
ラッピング公開鍵は PublicKey.bin に保存され、インポートトークンは ** ImportToken.bin** に保存されます。
256 ビットの対称キーを生成する
キーマテリアルは 256 ビット (32 バイト) の対称キーである必要があります。以下のコマンドのいずれかを実行してキーを生成します。
OpenSSL
openssl rand -out PlaintextKeyMaterial.bin 32
または
dd
dd if=/dev/urandom of=PlaintextKeyMaterial.bin bs=32 count=1
使用する OpenSSL のバージョンが openssl pkeyutl をサポートしていることを確認してください
重要: pkeyutl コマンドは OpenSSL バージョン 1.0.2 以降のバージョンでのみ使用できます。
Amazon Linux Amazon マシンイメージ (AMI) で起動されたインスタンスなど、Red Hat Enterprise Linux (RHEL) ベースの Linux コンピュータを使用している場合は、以下の手順を実行してください。
-
次のコマンドを実行して OpenSSL のバージョンを確認します。
openssl version
-
OpenSSL を更新するには、次のコマンドを実行します。
sudo yum -y update openssl
macOS を使用している場合は、次の手順を実行します。
-
次の Homebrew コマンドを実行します。
brew updatebrew upgrade openssl
brew info openssl
注: info openssl コマンドを実行すると、OpenSSL が /usr/local/opt/openssl/bin/ にインストールされていることがわかります。
-
次のコマンドを実行して OpenSSL のバージョンを確認します。
/usr/local/opt/openssl/bin/openssl version
-
常に最新の OpenSSL バージョンを使用するには、~/.bash_profile の末尾に次の行を追加します。
export PATH="/usr/local/opt/openssl/bin:$PATH"
-
以下のコマンドを実行します。
source ~/.bash_profile
-
macOS 環境の変更を確認するには、次のコマンドを実行します。
echo $PATHopenssl version
ラッピング公開鍵でキーマテリアルを暗号化する
最新バージョンの OpenSSL とラッピング公開鍵を使用してキーマテリアルを暗号化するには、openssl pkeyutl コマンドを実行します。
openssl pkeyutl -in PlaintextKeyMaterial.bin -out EncryptedKeyMaterial.bin -inkey PublicKey.bin -keyform DER \ -pubin -encrypt -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
このコマンドにより EncryptedKeyMaterial.bin が生成されます。この値を暗号化されたキーマテリアルとして AWS KMS キーにインポートします。
注: ラッピング公開鍵は PublicKey.bin に保存されます。
暗号化されたキーマテリアルをインポートする
次の手順を実行します。
-
AWS CLI の import-key-material コマンドを実行して、暗号化されたキーマテリアルを AWS KMS キーにインポートします。
aws kms --region $REGION import-key-material --key-id $KEY_ID --encrypted-key-material fileb://EncryptedKeyMaterial.bin --import-token fileb://ImportToken.bin --expiration-model KEY_MATERIAL_DOES_NOT_EXPIRE
注: インポートが完了すると、キーのステータスが [有効] に変わります。
-
AWS CLI の describe-key コマンドを実行して、キーのステータスを確認します。
aws kms --region $REGION describe-key --key-id $KEY_ID