我正在使用 OpenSSL 將我的金鑰匯入 AWS KMS,但出現「InvalidCiphertext」錯誤。我該如何解決此問題?

3 分的閱讀內容
0

我在 AWS Key Management Service (AWS KMS) 中建立了 AWS KMS key。我將 KMS 金鑰材料來源指定為外部,選擇 RSAES_OAEP_SHA_256 作為包裝金鑰的演算法,然後使用 OpenSSL 利用包裝金鑰來加密金鑰材料。但是,當我匯入加密的密鑰材料時,請求失敗,並且收到有關「InvalidCiphertext」的錯誤消息。我該如何避免這種匯入錯誤?

簡短說明

依預設,OpenSSL 會使用 SHA-1 雜湊函數。

在使用 RSAES_OAEP_SHA_256 演算法 (SHA-256 雜湊函數) 時,為了避免匯入錯誤,請使用 openssl pkeyutl 命令透過 OpenSSL 來加密金鑰材料,並指定參數 –pkeyopt rsa_padding_mode:oaep–pkeyopt rsa_oaep_md:sha256

使用 OpenSSL 和 RSAES_OAEP_SHA_256 將金鑰材料匯入 AWS KMS 的完整程序如下:

1、    使用外部作為金鑰材料來源以建立 KMS 金鑰。

2、    下載包裝 (公有) 金鑰和匯入字符。

3、    產生 256 位元對稱金鑰。

4、    驗證 OpenSSL 版本是否支援 openssl pkeyutl

5、    使用包裝金鑰加密金鑰材料。

6、    匯入加密的金鑰材料。

**注意:**如果您的包裝金鑰使用的是 SAES_OAEP_SHA_1 加密演算法,請參閱如何匯入金鑰材料

解決方法

使用外部作為金鑰材料來源以建立 KMS 金鑰

執行下列 AWS Command Line Interface (AWS CLI) 命令,為外部金鑰材料建立 KMS。

注意:

export REGION=us-east-1
export 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

新建立的 KMS 金鑰狀態為待匯入,直到您匯入金鑰資料為止。執行下列命令以檢視金鑰的狀態。

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

下載包裝 (公有) 金鑰和匯入字符

執行下列 AWS CLI 命令以取得 PublicKey (包裝金鑰) 和 ImportToken 值,使用 base64 解碼這兩個值,然後將這些值儲存至不同的檔案。請注意,RSAES_OAEP_SHA_256 包裝演算法是在 get-parameters-for-import 命令中指定。

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

這些命令會將包裝金鑰儲存在 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

若要以 RSAES_OAEP_SHA_256 作為包裝演算法來加密金鑰材料,請使用 openssl pkeyutl 命令。

**重要事項:**此命令僅適用於 OpenSSL 1.0.2 及更新版本。

如果您使用的是 RHEL 型 Linux 電腦,例如使用 Amazon Linux AMI 啟動的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體,請遵循下列步驟。

1、    執行下列命令以檢查您的 OpenSSL 版本。

openssl version

2、    若要更新 OpenSSL,請執行下列命令。

sudo yum –y update openssl

如果您使用的是 macOS,請遵循下列步驟。

1、    執行以下 Homebrew 命令。

brew update
brew upgrade openssl
brew info openssl

2、    最後一個命令會向您顯示 OpenSSL 安裝在 /usr/local/opt/openssl/bin/ 中。執行此命令以確認 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 $PATH
openssl version

使用包裝金鑰加密金鑰材料

執行下列命令,以使用最新版本的 OpenSSL 和先前下載的包裝金鑰來加密金鑰材料。

**注意:**包裝金鑰儲存在 PublicKey.bin 中。

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。您可以將此值作為加密金鑰材料匯入 KMS。

匯入您的加密金鑰材料

執行下列 AWS CLI 命令,將加密金鑰材料匯入 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 kms --region $REGION describe-key --key-id $KEY_ID

相關資訊

關於匯入的金鑰材料

AWS 官方
AWS 官方已更新 3 年前