Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 OpenSSL 和 CloudHSM 命令行工具将我的密钥安全地传输到 CloudHSM?
我想使用 CloudHSM 命令行工具 (CloudHSM CLI) 运行“key unwrap”子命令将本地密钥导入到 AWS CloudHSM。
简短描述
首先,使用临时高级加密标准 (AES) 密钥来加密您的有效载荷密钥。然后,使用密钥对中的公钥加密临时 AES 密钥。最后,将加密的有效载荷密钥和加密的临时密钥加入到单个文件中。该文件以加密格式发送到 CloudHSM,私有密钥会从密钥对中解密该文件。AES_KEY_WRAP 机制解密临时 AES 密钥,并使用该密钥来解密有效载荷密钥。
**注意:**在运行 Linux 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上完成以下步骤。最佳做法是使用包含所需 OpenSSL 版本和实用程序的 Amazon Linux 2023 亚马逊机器映像 (AMI)。
创建下面的密钥:
- 您导入并与 CloudHSM 一起使用的有效载荷 AES、RSA 或 EC 密钥。
- AES_KEY_WRAP 加密有效载荷所需的临时 AES 密钥。最佳做法是使用 AES,因为可加密的内容没有大小限制。
- RSA 密钥对,用于将密钥安全地封装和解包到 CloudHSM 中。
要使用信封封装,您必须拥有 OpenSSL 版本 3.x。
要确定您拥有的 OpenSSL 版本,请运行以下命令:
openssl version
输出示例:
OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)
解决方法
**注意:**在前面的命令中,请将以下值替换为您的值:
- YOUR_CRYPTO_USER_NAME 替换为您的加密用户名
- YOUR_CRYPTO_USER_PASSWORD 替换为您的密码
- YOUR_WRAPPING_KEY_LABEL 替换为已分配用于封装您的 RSA 公钥的密钥标签
- YOUR_UNWRAPPING_KEY_LABEL 替换为已分配用于解包您的 RSA 私钥的密钥标签
- YOUR_IMPORTED_KEY_LABEL 替换为已分配到导入的有效载荷密钥的密钥标签
您的封装和解包密钥标签必须是唯一的,因为密钥标签是 key generate-file 和 key unwrap 命令的筛选条件。或者,您可以使用不同的筛选条件来唯一识别密钥。有关密钥筛选条件的详细信息,请参阅使用 CloudHSM CLI 筛选密钥。
为 CloudHSM CLI 设置 crypto-user 凭证
运行以下命令:
export CLOUDHSM_ROLE="crypto-user" export CLOUDHSM_PIN="YOUR_CRYPTO_USER_NAME:YOUR_CRYPTO_USER_PASSWORD"
导入 AES 有效载荷
要创建、加密和导入本地密钥,请完成下面的步骤:
-
要创建有效载荷 AES、临时 AES 和 RSA 密钥,请运行以下命令:
openssl rand -out payload_aes 32 openssl rand -out ephemeral_aes 32 /opt/cloudhsm/bin/cloudhsm-cli key generate-asymmetric-pair rsa --public-label YOUR_WRAPPING_KEY_LABEL --private-label YOUR_UNWRAPPING_KEY_LABEL --modulus-size-bits 4096 --public-exponent 65537 --private-attributes unwrap=true /opt/cloudhsm/bin/cloudhsm-cli key generate-file --encoding pem --path public.pem --filter attr.label=YOUR_WRAPPING_KEY_LABEL**注意:**要跟踪您的文件,请在它们自己的目录中创建这些密钥。
-
要将临时 AES 密钥的原始十六进制值输出到变量中,请运行以下命令:
EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)**注意:**确保您已安装 hexdump 实用程序。如果未安装 hexdump,则上述命令会返回错误。有关如何安装 hexdump 实用程序的说明,请参阅操作系统 (OS) 文档。
-
要使用临时 AES 密钥封装有效载荷,请运行 OpenSSL enc 命令:
openssl enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped注意: -id-aes256-wrap-pad 密码是符合 RFC 3394 的封装机制,与 CKM_RSA_AES_KEY_WRAP 共存。RFC 3394 扩展 RFC 5649 设置 -iv 值。有关详细信息,请参阅 IETF 网站上的带填充算法的 AES 密钥封装算法和 AES 密钥封装算法。
-
使用 RSA 密钥对中的公钥加密 AES 密钥:
openssl pkeyutl -encrypt -in ephemeral_aes -out ephemeral_wrapped -pubin -inkey public.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 -pkeyopt rsa_mgf1_md:sha1 -
在本地计算机上,将加密的有效载荷密钥和临时 AES 密钥加入到一个名为 rsa_aes_wrapped 的文件中:
cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped -
要使用带有 key unwrap rsa-aes 的 RSA 私钥来将加入的有效载荷密钥解包到 CloudHSM 中,请运行以下命令:
/opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class aes --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true encrypt=true**注意:**必须使用 --key-type-class aes 来解包 AES 密钥。根据密钥使用情况,使用 --attributes 来分配密钥属性。有关选项和密钥属性的详细信息,请参阅 CloudHSM CLI 的密钥属性和如何使用 key unwrap rsa-aes 命令的示例。
您将导入有效载荷 AES 密钥,其类似于以下输出:
{ "error_code": 0, "data": { "key": { "key-reference": "0x000000000068031a", "key-info": { "key-owners": [ { "username": "YOUR_CRYPTO_USER_NAME", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "full" }, "attributes": { "key-type": "aes", "label": "YOUR_IMPORTED_KEY_LABEL", "id": "0x", "check-value": "0xb31c2a", "class": "secret-key", "encrypt": true, "decrypt": true, "token": true, "always-sensitive": false, "derive": false, "destroyable": true, "extractable": true, "local": false, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": false, "verify": true, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 32 } } } }
导入 RSA 有效载荷
完成以下步骤:
-
要将 RSA 私钥解包到 CloudHSM 中,请运行以下命令来将有效载荷密钥更改为 RSA 私钥:
openssl genrsa -out payload_rsa.pem 2048 openssl rand -out ephemeral_aes 32 -
使用纯文本编辑器检查 RSA 密钥的格式:
PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----注意: RSA 密钥采用 PKCS #1 格式。但是,CloudHSM CLI 假设私钥采用 PKCS #8 DER 格式。
-
要将 payload_rsa.pem 密钥转换为 PKCS #8 格式并进行 DER 编码,请运行以下命令:
openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt -
完成导入 AES 有效载荷部分中的步骤 2-5。将 payload_aes 替换为 payload_rsa_pkcs8.der。
-
要将有效载荷 RSA 私钥解包到 CloudHSM 中,请运行以下命令:
/opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class rsa-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true**注意:**您必须使用 --key-type-class rsa-private 来解包 RSA 密钥。根据密钥使用情况,使用 --attributes 来分配密钥属性。
导入 EC 有效载荷
要导入有效载荷,请完成下面的步骤:
-
要将 EC 私有密钥解压缩到 HSM 中,请运行以下命令来将有效载荷密钥更改为 EC 私有密钥:
openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32 -
使用纯文本编辑器检查 EC 密钥的格式:
PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----注意: EC 密钥采用 PKCS #1 格式。但是,CloudHSM CLI 假设私钥采用 PKCS #8 DER 格式。
-
要将 payload_ec.pem 密钥转换为 PKCS #8 格式并进行 DER 编码,请运行以下命令:
openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt -
完成导入 AES 有效载荷部分中的步骤 2-5。将 payload_aes 替换为 payload_ec_pkcs8.der。
-
要将有效载荷 EC 私钥解包到 CloudHSM 中,请运行以下命令:
/opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class ec-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true**注意:**您必须使用 --key-type-class ec-private 来解包 EC 密钥。根据密钥使用情况,使用 --attributes 来分配密钥属性。
相关信息
- 语言
- 中文 (简体)
