Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
步骤 3:加密密钥材料
下载公有密钥和导入令牌后,使用您下载的公有密钥和指定的包装算法对密钥材料进行加密。如果您需要替换公有密钥或导入令牌,或者更改包装算法,则必须下载新的公有密钥和导入令牌。有关 Amazon KMS 支持的公钥和封装算法的信息,请参阅选择包装公有密钥规范和选择包装算法。
密钥材料必须采用二进制格式。有关详细信息,请参阅导入密钥材料的要求。
对于非对称密钥对,仅加密和导入私钥。 Amazon 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 pkcs8
该topk8
参数指示 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
-
Amazon 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
。
在本示例中:
$
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 支持对称加密密钥 (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.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对密钥材料进行加密。
-
加密您与下载的AES公钥和 RSAES _ OAEP _ SHA _1 包装算法一起使用的对称密钥。
RSA_ _ _ AES KEY WRAP _ SHA _1 包装算法需要 Open SSL 版本 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对称加密密钥
此命令使用您下载的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
-
生成要导入的文件
将文件与加密密钥材料连接起来,将文件与加密密钥连接起来。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对密钥材料进行加密。
-
加密您与下载的AES公钥和 RSAES _ OAEP _ SHA _256 包装算法一起使用的对称密钥。
RSA_ _ _ AES KEY WRAP _ SHA _256 包装算法需要 Open SSL 版本 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对称加密密钥
此命令使用您下载的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
-
生成要导入的文件
将文件与加密密钥材料连接起来,将文件与加密密钥连接起来。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:导入密钥材料。