我在使用 OpenSSL 将我的密钥导入 AWS KMS 时收到“InvalidCiphertext”错误。如何解决此问题?

上次更新时间:2020 年 4 月 8 日

我在 AWS Key Management Service (AWS KMS) 中创建了一个客户主密钥 (CMK)。我指定了 CMK 密钥材料来源作为外部来源,选择了 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. 使用“外部”作为密钥材料来源来创建 CMK。
  2. 下载包装(公有)密钥和导入令牌。
  3. 生成 256 位对称密钥。
  4. 验证您的 OpenSSL 版本是否支持 openssl pkeyutl
  5. 使用包装密钥加密您的密钥材料。
  6. 导入加密的密钥材料。

注意:如果您要对包装密钥使用 RSAES_OAEP_SHA_1 加密算法,请参阅如何导入密钥材料

解决方法

使用“外部”作为密钥材料来源来创建 CMK

运行以下 AWS 命令行界面 (AWS CLI) 命令来为外部密钥材料创建 CMK。

注意:请务必将 export REGIONexport KEY_ALIAS 、值替换为您的密钥的详细信息。

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

您新创建的 CMK 将处于等待导入状态,直到您导入密钥材料为止。运行以下命令以查看密钥的状态。

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

下载包装(公有)密钥和导入令牌

运行以下 AWS CLI 命令以获取 PublicKey(包装密钥)和 ImportToken 值,使用 base64 解码这两个值,然后将这些值存储在单独的文件中。请注意,get-parameters-for-import 命令中已指定 RSAES_OAEP_SHA_256 包装算法。

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.    上一条命令指明 /usr/local/opt/openssl/bin/ 中已安装 OpenSSL。通过运行此命令来确认 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。您将此值作为已加密的密钥材料导入 CMK。

导入您的已加密的密钥材料

运行以下 AWS CLI 命令,将已加密的密钥材料导入 CMK。

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

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?