我如何解决在尝试使用 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 命令时遇到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI

运行 create-keycreate-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-1kms_key_with_externalmaterial 替换为您的密钥值。

在您导入密钥材料之前,AWS KMS 密钥状态一直是待导入。运行以下命令可查看密钥的状态:

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

下载包装公钥和导入令牌

运行 get-parameters-for-import AWS CLI 命令获取 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 及更高版本上可用。

如果您使用基于 Red Hat Enterprise Linux (RHEL) 的 Linux 计算机,如使用 Amazon Linux 亚马逊机器映像 (AMI) 启动的实例,请完成以下步骤:

  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. 运行 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
    

    注意:导入完成后,密钥的状态将变为启用

  2. 运行 describe-key AWS CLI 命令验证密钥的状态:

    aws kms --region $REGION describe-key --key-id $KEY_ID
AWS 官方
AWS 官方已更新 1 年前