导入密钥材料步骤 3:加密密钥材料 - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

导入密钥材料步骤 3:加密密钥材料

下载公钥和导入令牌后,使用您下载的公钥和指定的封装算法对密钥材料进行加密。如果您需要替换公钥或导入令牌,或者更改封装算法,则必须下载新的公钥并导入令牌。有关Amazon KMS支持的公钥和封装算法的信息,请参阅选择包装公钥规范选择包装算法

密钥材料必须采用二进制格式。有关详细信息,请参阅对进口关键材料的要求

注意

对于非对称密钥对,仅加密和导入私钥。 Amazon KMS从私钥派生公钥。

不支持以下组合:ECC_NIST_P521 密钥材料、RSA_2048 公共包装密钥规范和 RSAES_OAEP_SHA_* 封装算法。

你不能直接用 RSA_2048 公共包装密钥包装 ECC_NIST_P521 密钥材料。使用更大的包装密钥或 RSA_AES_KEY_WRAP_SHA_* 封装算法。

通常,您可以在将密钥材料从硬件安全模块 (HSM) 或密钥管理系统导出时对其进行加密。有关如何以二进制格式导出密钥材料的信息,请参阅有关 HSM 或密钥管理系统的文档。您还可以参阅以下部分,该部分使用 OpenSSL 提供了概念验证演示。

加密密钥材料时,请使用您在下载公钥和导入令牌时指定的相同封装算法。要查找您指定的打包算法,请参阅相关GetParametersForImport请求CloudTrail的日志事件。

生成用于测试的关键材料

以下 OpenSSL 命令生成每种支持类型的密钥材料以供测试。这些示例仅用于测试和proof-of-concept演示。对于生产系统,使用更安全的方法来生成密钥材料,例如硬件安全模块或密钥管理系统。

要将非对称密钥对的私钥转换为 DER 编码格式,请将密钥材料生成命令传送到以下openssl pkcs8命令。该topk8参数指示 OpenSSL 将私钥作为输入并返回 PKCS #8 格式的密钥。(默认行为恰恰相反。)

openssl pkcs8 -topk8 -outform der -nocrypt

以下命令为每种支持的密钥类型生成测试密钥材料。

  • 对称加密密钥(32 字节)

    此命令生成 256 位对称密钥(32 字节的随机字符串)并将其保存在文件中。PlaintextKeyMaterial.bin您无需对此密钥材料进行编码。

    openssl rand -out PlaintextKeyMaterial.bin 32

    仅在中国区域,您必须生成 128 位对称密钥(16 字节随机字符串)。

    openssl rand -out PlaintextKeyMaterial.bin 16
  • HMAC 密钥

    此命令生成指定大小的随机字节字符串。您无需对此密钥材料进行编码。

    HMAC 密钥的长度必须与 KMS 密钥的密钥规格定义的长度相匹配。例如,如果 KMS 密钥是 HMAC_384,则必须导入 384 位(48 字节)密钥。

    openssl rand -out HMAC_224_PlaintextKey.bin 28 openssl rand -out HMAC_256_PlaintextKey.bin 32 openssl rand -out HMAC_384_PlaintextKey.bin 48 openssl rand -out HMAC_512_PlaintextKey.bin 64
  • RSA 私钥

    openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_2048_PrivateKey.der openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:3072 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_3072_PrivateKey.der openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 | openssl pkcs8 -topk8 -outform der -nocrypt > RSA_4096_PrivateKey.der
  • ECC 私钥

    openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-256 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P256_PrivateKey.der openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-384 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P384_PrivateKey.der openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:P-521 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_NIST_P521_PrivateKey.der openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:secp256k1 | openssl pkcs8 -topk8 -outform der -nocrypt > ECC_SECG_P256K1_PrivateKey.der

使用 OpenSSL 加密密钥材料的示例

以下示例说明如何使用 OpenSSL 使用您下载的公钥对您的密钥材料进行加密。

重要

这些示例仅是概念验证演示。对于生产系统,请使用更安全的方法 (如商业 HSM 或密钥管理系统) 来生成和存储您的密钥材料。

不支持以下组合:ECC_NIST_P521 密钥材料、RSA_2048 公共包装密钥规范和 RSAES_OAEP_SHA_* 封装算法。

你不能直接用 RSA_2048 公共包装密钥包装 ECC_NIST_P521 密钥材料。使用更大的包装密钥或 RSA_AES_KEY_WRAP_SHA_* 封装算法。

RSAES_OAEP_SHA_1

Amazon KMS支持对称加密密钥 (SYMMETRIC_DEFAULT)、椭圆曲线 (ECC) 私钥和 HMAC 密钥的 RSAES_OAEP_SHA_1。

RSA 私钥不支持 RSAES_OAEP_SHA_1。此外,你不能将 RSA_2048 公有包装密钥与任何 RSAES_OAEP_SHA_* 封装算法一起封装 ECC_NIST_P521 (secp521r1) 私钥。必须使用更大的公共包装密钥或 RSA_AES_KEY_WRAP 包装算法。

以下示例使用您下载的公钥和 RSAES_OAEP_1 封装算法对您的密钥材料进行加密,并将其保存在文件中。EncryptedKeyMaterial.bin

在这个例子中:

  • WrappingPublicKey.bin是包含下载的包装公钥的文件。

  • PlaintextKeyMaterial.bin是包含您正在加密的密钥材料的文件,例如PlaintextKeyMaterial.binHMAC_384_PlaintextKey.binECC_NIST_P521_PrivateKey.der

$ openssl pkeyutl \ -encrypt \ -in PlaintextKeyMaterial.bin \ -out EncryptedKeyMaterial.bin \ -inkey WrappingPublicKey.bin \ -keyform DER \ -pubin \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha1
RSAES_OAEP_SHA_256

Amazon KMS支持对称加密密钥 (SYMMETRIC_DEFAULT)、椭圆曲线 (ECC) 私钥和 HMAC 密钥的 RSAES_OAEP_SHA_256。

RSA 私钥不支持 RSAES_OAEP_SHA_256。此外,你不能将 RSA_2048 公有包装密钥与任何 RSAES_OAEP_SHA_* 封装算法一起封装 ECC_NIST_P521 (secp521r1) 私钥。必须使用更大的公钥或 RSA_AES_KEY_WRAP 封装算法。

以下示例使用您下载的公钥和 RSAES_OAEP_SHA_256 封装算法对密钥材料进行加密,并将其保存在文件中。EncryptedKeyMaterial.bin

在这个例子中:

  • WrappingPublicKey.bin是包含下载的公共包装密钥的文件。如果您从控制台下载了公钥,则此文件名为wrappingKey_KMS key_key_ID_timestamp(例如,wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909)。

  • PlaintextKeyMaterial.bin是包含您正在加密的密钥材料的文件,例如PlaintextKeyMaterial.binHMAC_384_PlaintextKey.bin、或ECC_NIST_P521_PrivateKey.der

$ openssl pkeyutl \ -encrypt \ -in PlaintextKeyMaterial.bin \ -out EncryptedKeyMaterial.bin \ -inkey WrappingPublicKey.bin \ -keyform DER \ -pubin \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256
RSA_AES_KEY_WRAP_SHA_1

RSA_AES_KEY_WRAP_SHA_1 包装算法涉及两个加密操作。

  1. 使用您生成的 AES 对称密钥和 AES 对称加密算法加密您的密钥材料。

  2. 使用下载的公钥和 RSAES_OAEP_SHA_1 封装算法加密您使用的 AES 对称密钥。

Amazon KMS支持所有支持的导入密钥材料类型和所有支持的公钥规格的 RSA_AES_KEY_WRAP_SHA_* 封装算法。RSA_AES_KEY_WRAP_SHA_* 算法是唯一支持封装 RSA 密钥材料的包装算法。

RSA_AES_KEY_WRAP_SHA_1 包装算法需要 OpenSSL 版本 3。 x 或更高版本。

  1. 生成 256 位 AES 对称加密密钥

    此命令生成包含 256 位随机位的 AES 对称加密密钥,并将其保存在文件中 aes-key.bin

    # Generate a 32-byte AES symmetric encryption key $ openssl rand -out aes-key.bin 32
  2. 使用 AES 对称加密密钥加密您的密钥材料

    此命令使用 AES 对称加密密钥对您的密钥材料进行加密,并将加密的密钥材料保存在文件中key-material-wrapped.bin

    在此示例命令中:

    • PlaintextKeyMaterial.bin是包含您要导入的密钥材料的文件,例如PlaintextKeyMaterial.binHMAC_384_PlaintextKey.binRSA_3072_PrivateKey.der、或ECC_NIST_P521_PrivateKey.der

    • aes-key.bin是包含您在上一个命令中生成的 256 位 AES 对称加密密钥的文件。

    # Encrypt your key material with the AES symmetric encryption key $ openssl enc -id-aes256-wrap-pad \ -K "$(xxd -p < aes-key.bin | tr -d '\n')" \ -iv A65959A6 \ -in PlaintextKeyMaterial.bin\ -out key-material-wrapped.bin
  3. 使用公钥加密您的 AES 对称加密密钥

    此命令使用您下载的公钥和 RSAES_OAEP_SHA_1 封装算法对您的 AES 对称加密密钥进行加密,对其进行解码,然后将其保存在文件中。aes-key-wrapped.bin

    在此示例命令中:

    • WrappingPublicKey.bin是包含下载的公共包装密钥的文件。如果您从控制台下载了公钥,则此文件名为wrappingKey_KMS key_key_ID_timestamp(例如,wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909

    • aes-key.bin是包含您在本示例序列的第一个命令中生成的 256 位 AES 对称加密密钥的文件。

    # Encrypt your AES symmetric encryption key with the downloaded public key $ openssl pkeyutl \ -encrypt \ -in aes-key.bin \ -out aes-key-wrapped.bin \ -inkey WrappingPublicKey.bin \ -keyform DER \ -pubin \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha1 \ -pkeyopt rsa_mgf1_md:sha1
  4. 生成要导入的文件

    将文件与加密的密钥材料连接起来,将文件与加密的 AES 密钥连接起来。将它们保存在EncryptedKeyMaterial.bin文件中,这是您要导入的文件步骤 4:导入密钥材料

    在此示例命令中:

    • key-material-wrapped.bin是包含您的加密密钥材料的文件。

    • aes-key-wrapped.bin是包含加密的 AES 加密密钥的文件。

    # Combine the encrypted AES key and encrypted key material in a file $ cat aes-key-wrapped.bin key-material-wrapped.bin > EncryptedKeyMaterial.bin
RSA_AES_KEY_WRAP_SHA_256

RSA_AES_KEY_WRAP_SHA_256 包装算法涉及两个加密操作。

  1. 使用您生成的 AES 对称密钥和 AES 对称加密算法加密您的密钥材料。

  2. 加密您使用下载的公钥和 RSAES_OAEP_SHA_256 封装算法使用的 AES 对称密钥。

Amazon KMS支持所有支持的导入密钥材料类型和所有支持的公钥规格的 RSA_AES_KEY_WRAP_SHA_* 封装算法。RSA_AES_KEY_WRAP_SHA_* 算法是唯一支持封装 RSA 密钥材料的包装算法。

RSA_AES_KEY_WRAP_SHA_256 包装算法需要 OpenSSL 版本 3。 x 或更高版本。

  1. 生成 256 位 AES 对称加密密钥

    此命令生成包含 256 位随机位的 AES 对称加密密钥,并将其保存在文件中 aes-key.bin

    # Generate a 32-byte AES symmetric encryption key $ openssl rand -out aes-key.bin 32
  2. 使用 AES 对称加密密钥加密您的密钥材料

    此命令使用 AES 对称加密密钥对您的密钥材料进行加密,并将加密的密钥材料保存在文件中key-material-wrapped.bin

    在此示例命令中:

    • PlaintextKeyMaterial.bin是包含您要导入的密钥材料的文件,例如PlaintextKeyMaterial.binHMAC_384_PlaintextKey.binRSA_3072_PrivateKey.der、或ECC_NIST_P521_PrivateKey.der

    • aes-key.bin是包含您在上一个命令中生成的 256 位 AES 对称加密密钥的文件。

    # Encrypt your key material with the AES symmetric encryption key $ openssl enc -id-aes256-wrap-pad \ -K "$(xxd -p < aes-key.bin | tr -d '\n')" \ -iv A65959A6 \ -in PlaintextKeyMaterial.bin\ -out key-material-wrapped.bin
  3. 使用公钥加密您的 AES 对称加密密钥

    此命令使用您下载的公钥和 RSAES_OAEP_SHA_256 封装算法对您的 AES 对称加密密钥进行加密,对其进行解码,然后将其保存在文件中。aes-key-wrapped.bin

    在此示例命令中:

    • WrappingPublicKey.bin是包含下载的公共包装密钥的文件。如果您从控制台下载了公钥,则此文件名为wrappingKey_KMS key_key_ID_timestamp(例如,wrappingKey_f44c4e20-f83c-48f4-adc6-a1ef38829760_0809092909

    • aes-key.bin是包含您在本示例序列的第一个命令中生成的 256 位 AES 对称加密密钥的文件。

    # Encrypt your AES symmetric encryption key with the downloaded public key $ openssl pkeyutl \ -encrypt \ -in aes-key.bin \ -out aes-key-wrapped.bin \ -inkey WrappingPublicKey.bin \ -keyform DER \ -pubin \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256
  4. 生成要导入的文件

    将文件与加密的密钥材料连接起来,将文件与加密的 AES 密钥连接起来。将它们保存在EncryptedKeyMaterial.bin文件中,这是您要导入的文件步骤 4:导入密钥材料

    在此示例命令中:

    • key-material-wrapped.bin是包含您的加密密钥材料的文件。

    • aes-key-wrapped.bin是包含加密的 AES 加密密钥的文件。

    # Combine the encrypted AES key and encrypted key material in a file $ cat aes-key-wrapped.bin key-material-wrapped.bin > EncryptedKeyMaterial.bin

继续执行步骤 4:导入密钥材料