OpenSSL を使用してキーを AWS KMS にインポートしようとしたときの「InvalidCiphertext」エラーを解決する方法を教えてください。

所要時間2分
0

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-1kms_key_with_externalmaterial をキーの値に置き換えてください。

キーマテリアルをインポートするまで、AWS KMS キーのステータスは [インポート保留中] のままです。次のコマンドを実行してキーのステータスを表示します。

aws kms --region $REGION describe-key --key-id $KEY_ID

ラッピング公開鍵とインポートトークンをダウンロードする

AWS CLI の get-parameters-for-import コマンドを実行して、PublicKeyImportToken の値を取得します。

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 コンピュータを使用している場合は、以下の手順を実行してください。

  1. 次のコマンドを実行して OpenSSL のバージョンを確認します。

    openssl version
    
  2. OpenSSL を更新するには、次のコマンドを実行します。

    sudo yum -y update openssl
    

macOS を使用している場合は、次の手順を実行します。

  1. 次の Homebrew コマンドを実行します。

    brew updatebrew upgrade openssl
    brew info openssl
    

    注: info openssl コマンドを実行すると、OpenSSL が /usr/local/opt/openssl/bin/ にインストールされていることがわかります。

  2. 次のコマンドを実行して OpenSSL のバージョンを確認します。

    /usr/local/opt/openssl/bin/openssl version
    
  3. 常に最新の OpenSSL バージョンを使用するには、~/.bash_profile の末尾に次の行を追加します。

    export PATH="/usr/local/opt/openssl/bin:$PATH"
    
  4. 以下のコマンドを実行します。

    source ~/.bash_profile
    
  5. 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 に保存されます。

暗号化されたキーマテリアルをインポートする

次の手順を実行します。

  1. 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
    

    注: インポートが完了すると、キーのステータスが [有効] に変わります。

  2. AWS CLI の describe-key コマンドを実行して、キーのステータスを確認します。

    aws kms --region $REGION describe-key --key-id $KEY_ID
コメントはありません