本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
步骤 3:加密密钥材料
下载公有密钥和导入令牌后,使用您下载的公有密钥和指定的包装算法对密钥材料进行加密。如果您需要替换公有密钥或导入令牌,或者更改包装算法,则必须下载新的公有密钥和导入令牌。有关 AWS KMS 支持的公有密钥和包装算法的信息,请参阅 选择包装公有密钥规范 和 选择包装算法。
密钥材料必须采用二进制格式。有关详细信息,请参阅导入密钥材料的要求。
对于非对称密钥对,仅加密和导入私有密钥。AWS KMS 从私有密钥派生公有密钥。
不支持以下组合:ECC_NIST_P521 密钥材料、RSA_2048 公有包装密钥规范和 RSAES_OAEP_SHA_* 包装算法。
您不能使用 RSA_2048 公有包装密钥直接包装 ECC_NIST_P521 密钥材料。使用更大的包装密钥或 RSA_AES_KEY_WRAP_SHA_* 包装算法。
中国区域不支持 RSA_AES_KEY_WRAP_SHA_256 和 RSA_AES_KEY_WRAP_SHA_1 包装算法。
通常,您可以在将密钥材料从硬件安全模块 (HSM) 或密钥管理系统导出时对其进行加密。有关如何以二进制格式导出密钥材料的信息,请参阅有关 HSM 或密钥管理系统的文档。您还可以参阅以下部分,该部分使用 OpenSSL 提供了概念验证演示。
加密密钥材料时,请使用与您在下载公有密钥和导入令牌时指定的相同的包装算法。要查找您指定的包装算法,请参阅相关的 GetParametersForImport 请求的 CloudTrail 日志事件。
生成用于测试的密钥材料
以下 OpenSSL 命令生成每种支持类型的密钥材料以供测试。这些示例仅用于测试和概念验证演示。对于生产系统,请使用更安全的方法来生成您的密钥材料,例如硬件安全模块或密钥管理系统。
要将非对称密钥对的私有密钥转换为 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
-
SM2 私有密钥(仅限中国区域)
openssl genpkey -algorithm ec -pkeyopt ec_paramgen_curve:sm2 | openssl pkcs8 -topk8 -outform der -nocrypt > SM2_PrivateKey.der
使用 OpenSSL 加密密钥材料的示例
以下示例说明如何使用 OpenSSL 通过您下载的公有密钥对密钥材料进行加密。要使用 SM2 公有密钥加密密钥材料(仅限中国区域),请使用 SM2OfflineOperationHelper 类。有关每种包装算法支持的密钥材料类型的更多信息,请参阅 选择包装算法。
这些示例仅为概念验证演示。对于生产系统,请使用更安全的方法 (如商业 HSM 或密钥管理系统) 来生成和存储您的密钥材料。
不支持以下组合:ECC_NIST_P521 密钥材料、RSA_2048 公有包装密钥规范和 RSAES_OAEP_SHA_* 包装算法。
您不能使用 RSA_2048 公有包装密钥直接包装 ECC_NIST_P521 密钥材料。使用更大的包装密钥或 RSA_AES_KEY_WRAP_SHA_* 包装算法。
- RSAES_OAEP_SHA_1
-
AWS KMS 支持面向对称加密密钥(SYMMETRIC_DEFAULT)、椭圆曲线(ECC)私有密钥、SM2 私有密钥和 HMAC 密钥的 RSAES_OAEP_SHA_1。
RSAES_OAEP_SHA_1 不支持 RSA 私有密钥。此外,您不能使用采用任何 RSAES_OAEP_SHA_* 包装算法的 RSA_2048 公有包装密钥来包装 ECC_NIST_P521(secp521r1)私有密钥。您必须使用更大的公有包装密钥或 RSA_AES_KEY_WRAP 包装算法。
以下示例使用您下载的公有密钥和 RSAES_OAEP_SHA_1 包装算法对密钥材料进行加密,并将其保存在 EncryptedKeyMaterial.bin
文件中。
在本示例中:
$
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 支持面向对称加密密钥(SYMMETRIC_DEFAULT)、椭圆曲线(ECC)私有密钥、SM2 私有密钥和 HMAC 密钥的 RSAES_OAEP_SHA_256。
RSAES_OAEP_SHA_256 不支持 RSA 私有密钥。此外,您不能使用采用任何 RSAES_OAEP_SHA_* 包装算法的 RSA_2048 公有包装密钥来包装 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.bin
、HMAC_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 包装算法涉及两个加密操作。
-
使用您生成的 AES 对称密钥和 AES 对称加密算法对密钥材料进行加密。
-
使用您下载的公有密钥和 RSAES_OAEP_SHA_1 包装算法加密您使用的 AES 对称密钥。
RSA_AES_KEY_WRAP_SHA_1 包装算法需要 OpenSSL 版本 3.x 或更高版本。
-
生成 256 位 AES 对称加密密钥
此命令生成由 256 个随机位组成的 AES 对称加密密钥,并将其保存在 aes-key.bin
文件中
# Generate a 32-byte AES symmetric encryption key
$
openssl rand -out aes-key.bin 32
-
使用 AES 对称加密密钥加密您的密钥材料
此命令使用 AES 对称加密密钥对您的密钥材料进行加密,并将加密的密钥材料保存在 key-material-wrapped.bin
文件中。
在此示例命令中:
# 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
-
使用公有密钥加密您的 AES 对称加密密钥
此命令使用您下载的公有密钥和 RSAES_OAEP_SHA_1 包装算法对您的 AES 对称加密密钥进行加密,对其进行 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
-
生成要导入的文件
将文件与加密的密钥材料连接起来,并将文件与加密的 AES 密钥连接起来。将它们保存在 EncryptedKeyMaterial.bin
文件中,也就是您要在 步骤 4:导入密钥材料 中导入的文件。
在此示例命令中:
# 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 包装算法涉及两个加密操作。
-
使用您生成的 AES 对称密钥和 AES 对称加密算法对密钥材料进行加密。
-
使用您下载的公有密钥和 RSAES_OAEP_SHA_256 包装算法加密您使用的 AES 对称密钥。
RSA_AES_KEY_WRAP_SHA_256 包装算法需要 OpenSSL 版本 3.x 或更高版本。
-
生成 256 位 AES 对称加密密钥
此命令生成由 256 个随机位组成的 AES 对称加密密钥,并将其保存在 aes-key.bin
文件中
# Generate a 32-byte AES symmetric encryption key
$
openssl rand -out aes-key.bin 32
-
使用 AES 对称加密密钥加密您的密钥材料
此命令使用 AES 对称加密密钥对您的密钥材料进行加密,并将加密的密钥材料保存在 key-material-wrapped.bin
文件中。
在此示例命令中:
# 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
-
使用公有密钥加密您的 AES 对称加密密钥
此命令使用您下载的公有密钥和 RSAES_OAEP_SHA_256 包装算法对您的 AES 对称加密密钥进行加密,对其进行 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
-
生成要导入的文件
将文件与加密的密钥材料连接起来,并将文件与加密的 AES 密钥连接起来。将它们保存在 EncryptedKeyMaterial.bin
文件中,也就是您要在 步骤 4:导入密钥材料 中导入的文件。
在此示例命令中:
# Combine the encrypted AES key and encrypted key material in a file
$
cat aes-key-wrapped.bin
key-material-wrapped.bin
> EncryptedKeyMaterial.bin
继续执行步骤 4:导入密钥材料。