跳至内容

如何使用 OpenSSL 和 CloudHSM 命令行工具将我的密钥安全地传输到 CloudHSM?

4 分钟阅读
0

我想使用 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-filekey unwrap 命令的筛选条件。或者,您可以使用不同的筛选条件来唯一识别密钥。有关密钥筛选条件的详细信息,请参阅使用 CloudHSM CLI 筛选密钥

为 CloudHSM CLI 设置 crypto-user 凭证

运行以下命令:

export CLOUDHSM_ROLE="crypto-user"
export CLOUDHSM_PIN="YOUR_CRYPTO_USER_NAME:YOUR_CRYPTO_USER_PASSWORD"

导入 AES 有效载荷

要创建、加密和导入本地密钥,请完成下面的步骤:

  1. 要创建有效载荷 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

    **注意:**要跟踪您的文件,请在它们自己的目录中创建这些密钥。

  2. 要将临时 AES 密钥的原始十六进制值输出到变量中,请运行以下命令:

    EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)

    **注意:**确保您已安装 hexdump 实用程序。如果未安装 hexdump,则上述命令会返回错误。有关如何安装 hexdump 实用程序的说明,请参阅操作系统 (OS) 文档。

  3. 要使用临时 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 密钥封装算法

  4. 使用 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
  5. 在本地计算机上,将加密的有效载荷密钥和临时 AES 密钥加入到一个名为 rsa_aes_wrapped 的文件中:

    cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped
  6. 要使用带有 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 有效载荷

完成以下步骤:

  1. 要将 RSA 私钥解包到 CloudHSM 中,请运行以下命令来将有效载荷密钥更改为 RSA 私钥:

    openssl genrsa -out payload_rsa.pem 2048
    openssl rand -out ephemeral_aes 32
  2. 使用纯文本编辑器检查 RSA 密钥的格式:

    PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    注意: RSA 密钥采用 PKCS #1 格式。但是,CloudHSM CLI 假设私钥采用 PKCS #8 DER 格式。

  3. 要将 payload_rsa.pem 密钥转换为 PKCS #8 格式并进行 DER 编码,请运行以下命令:

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt
  4. 完成导入 AES 有效载荷部分中的步骤 2-5。将 payload_aes 替换为 payload_rsa_pkcs8.der

  5. 要将有效载荷 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 有效载荷

要导入有效载荷,请完成下面的步骤:

  1. 要将 EC 私有密钥解压缩到 HSM 中,请运行以下命令来将有效载荷密钥更改为 EC 私有密钥:

    openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32
  2. 使用纯文本编辑器检查 EC 密钥的格式:

    PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    注意: EC 密钥采用 PKCS #1 格式。但是,CloudHSM CLI 假设私钥采用 PKCS #8 DER 格式。

  3. 要将 payload_ec.pem 密钥转换为 PKCS #8 格式并进行 DER 编码,请运行以下命令:

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt
  4. 完成导入 AES 有效载荷部分中的步骤 2-5。将 payload_aes 替换为 payload_ec_pkcs8.der

  5. 要将有效载荷 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 来分配密钥属性。

相关信息

适用于 AWS CloudHSM 客户端 SDK 5 的 PKCS #11 库的支持机制

AWS 官方已更新 9 个月前