导入密钥材料步骤 3:加密密钥材料 - AWS Key Management Service

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

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

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

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

注意

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

NOT支持以下组合:ECC_ NIST _P521 密钥材料、RSA _2048 公共封装密钥规范和 RSAES _ OAEP _* 包装算法。SHA

您不能使用 NIST _ RSA 2048 ECC 公共包装密钥直接封装 _ _P521 密钥材料。使用更大的包装密钥或 RSA _ _ _ AES KEY WRAP _ SHA _* 包装算法。

中国区域不支持 RSA AES KEY WRAP _ _ _ RSA AES _ SHA _256 和 KEY WRAP _ _ _ _ SHA _1 包装算法。

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

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

生成用于测试的密钥材料

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

要将非对称密钥对的私钥转换为 DER-编码格式,请将密钥材料生成命令通过管道传递到以下命令。openssl pkcs8topk8参数指示 Open SSL 将私钥作为输入并返回 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
  • SM2私钥(仅限中国区域)

    openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:sm2 | openssl pkcs8 -topk8 -outform der -nocrypt > SM2_PrivateKey.der

使用 Open 加密密钥材料的示例 SSL

以下示例说明如何使用 Open SSL 使用您下载的公钥对密钥材料进行加密。要使用SM2公钥加密密钥材料(仅限中国区域),请使用该SM2OfflineOperationHelper类。有关每种包装算法支持的密钥材料类型的更多信息,请参阅选择包装算法

重要

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

NOT支持以下组合:ECC_ NIST _P521 密钥材料、RSA _2048 公共封装密钥规范和 RSAES _ OAEP _* 包装算法。SHA

您不能使用 NIST _ RSA 2048 ECC 公共包装密钥直接封装 _ _P521 密钥材料。使用更大的包装密钥或 RSA _ _ _ AES KEY WRAP _ SHA _* 包装算法。

RSAES_OAEP_SHA_1

AWS KMS 支持 RSAES OAEP _ SHA _1 表示对称加密密钥 (SYMMETRIC_DEFAULT)、椭圆曲线 (ECC) 私钥、SM2私钥和密钥。HMAC

RSAESRSA私钥不支持 OAEP _ _ SHA _1。此外,你不能使用带有任何 RSAES _ _ RSA _ SHA * 包装算法的 _2048 公共封装密钥来封装 OAEP _ _P521 (sec NIST p521r1) 私钥。ECC必须使用更大的公共封装密钥或 RSA _ AES KEY _ WRAP 封装算法。

以下示例使用您下载的公钥和 RSAES _ OAEP _ SHA _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

AWS KMS 支持对称加密密钥 (RSAESOAEPSHASYMMETRIC_DEFAULT)、椭圆曲线 (ECC) 私钥、私钥和密钥的 _ _256。SM2 HMAC

RSAESRSA私钥不支持 OAEP _ _ SHA _256。此外,你不能使用带有任何 RSAES _ _ RSA _ SHA * 包装算法的 _2048 公共封装密钥来封装 OAEP _ _P521 (sec NIST p521r1) 私钥。ECC必须使用更大的公钥或 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. 加密您与下载的AES公钥和 RSAES _ OAEP _ SHA _1 包装算法一起使用的对称密钥。

RSA_ _ _ AES KEY WRAP _ SHA _1 包装算法需要 Open SSL 版本 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对称加密密钥

    此命令使用您下载的AES公钥和 RSAES _ OAEP _ SHA _1 包装算法对您的对称加密密钥进行加密,对其进行 DER-编码,然后将其保存在文件中。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. 加密您与下载的AES公钥和 RSAES _ OAEP _ SHA _256 包装算法一起使用的对称密钥。

RSA_ _ _ AES KEY WRAP _ SHA _256 包装算法需要 Open SSL 版本 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对称加密密钥

    此命令使用您下载的AES公钥和 RSAES _ OAEP _ SHA _256 包装算法对您的对称加密密钥进行加密,对其进行 DER-编码,然后将其保存在文件中。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:导入密钥材料