我已使用 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 Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
執行 create-key 和 create-alias AWS CLI 命令,以針對外部金鑰材料建立 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
下載包裝公有金鑰和匯入字符
執行 get-parameters-for-import AWS CLI 命令以取得 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 版及更新版本。
如果您使用以 Red Hat Enterprise Linux (RHEL) 為基礎的 Linux 電腦,例如使用 Amazon Linux Amazon Machine Image (AMI) 啟動的執行個體,請完成下列步驟:
-
執行下列命令以檢查您的 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 中。
匯入您的加密金鑰材料
請完成下列步驟:
-
執行 import-key-material AWS CLI 命令,以將加密金鑰材料匯入 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
注意:匯入完成後,金鑰的狀態會變更為已啟用。
-
執行 describe-key AWS CLI 命令以驗證金鑰的狀態:
aws kms --region $REGION describe-key --key-id $KEY_ID