步骤 2:生成或导入私有密钥和 SSL/TLS 证书 - AWS CloudHSM

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

步骤 2:生成或导入私有密钥和 SSL/TLS 证书

要启用 HTTPS,您的 Web 服务器应用程序(NGINX 或 Apache)需要一个私有密钥和相应的 SSL/TLS 证书。要将 Web 服务器 SSL/TLS 卸载与一起使用 AWS CloudHSM,必须将私钥存储在集群的 HSM 中。 AWS CloudHSM 您可以通过下列方式之一来完成此操作:

  • 如果您没有私有密钥及相应的证书,则可以在 HSM 中生成私有密钥。使用私有密钥创建证书签名请求(CSR),并用它来创建 SSL/TLS 证书。

  • 如果您已经有私有密钥及相应的证书,则可以将私有密钥导入到 HSM。

无论您选择上述哪种方法,您都可以从 HSM 中导出一个假 PEM 私有密钥,该私有密钥是 PEM 格式的私有密钥文件,其中包含对存储在 HSM 上的私有密钥的引用(它不是真正的私有密钥)。在 SSL/TLS 分载期间,您的 Web 服务器使用伪造的 PEM 私有密钥文件来识别 HSM 上的私有密钥。

生成私有密钥和证书

生成私有密钥

本节将介绍如何使用客户端软件开发工具包 3 中的密钥管理实用程序(KMU) 生成密钥对。在 HSM 中生成密钥对后,即可将其导出为伪造 PEM 文件,并生成相应的证书。

使用密钥管理实用程序(KMU)生成的私有密钥可以与客户端软件开发工具包 3 和客户端软件开发工具包 5 一起使用。

安装和配置密钥管理实用程序(KMU)
  1. 连接到您的客户端实例。

  2. 安装和配置客户端软件开发工具包 3。

  3. 运行以下命令启动 AWS CloudHSM 客户端。

    Amazon Linux
    $ sudo start cloudhsm-client
    Amazon Linux 2
    $ sudo service cloudhsm-client start
    CentOS 7
    $ sudo service cloudhsm-client start
    CentOS 8
    $ sudo service cloudhsm-client start
    RHEL 7
    $ sudo service cloudhsm-client start
    RHEL 8
    $ sudo service cloudhsm-client start
    Ubuntu 16.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 18.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 20.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 22.04 LTS

    尚不支持 OpenSSL 动态引擎。

  4. 运行命令以启动 key_mgmt_util 命令行工具。

    $ /opt/cloudhsm/bin/key_mgmt_util
  5. 运行以下命令登录 HSM。将 <user name><password> 替换为加密用户 (CU) 的用户名和密码。

    Command: loginHSM -u CU -s <user name> -p <password>>

生成私有密钥

根据您的使用案例,您可以生成 RSA 或 EC 密钥对。请执行以下操作之一:

  • 在 HSM 上生成 RSA 私有密钥

    使用 genRSAKeyPair 命令生成 RSA 密钥对。此示例生成一个模数为 2048、公有指数为 65537、标签为 tls_rsa_keypair 的 RSA 密钥对。

    Command: genRSAKeyPair -m 2048 -e 65537 -l tls_rsa_keypair

    如果命令成功,则您应该看到以下表明您已成功生成了 RSA 密钥对的输出。

    Cfm3GenerateKeyPair returned: 0x00 : HSM Return: SUCCESS Cfm3GenerateKeyPair: public key handle: 7 private key handle: 8 Cluster Status: Node id 1 status: 0x00000000 : HSM Return: SUCCESS
  • 在 HSM 上生成 EC 私有密钥

    使用 genECCKeyPair 命令生成 EC 密钥对。此示例生成一个曲线 ID 为 2(对应 NID_X9_62_prime256v1 曲线)且标签为 tls_ec_keypair 的 EC 密钥对。

    Command: genECCKeyPair -i 2 -l tls_ec_keypair

    如果命令成功,则您应该看到以下表明您已成功生成了 EC 密钥对的输出。

    Cfm3GenerateKeyPair returned: 0x00 : HSM Return: SUCCESS Cfm3GenerateKeyPair: public key handle: 7 private key handle: 8 Cluster Status: Node id 1 status: 0x00000000 : HSM Return: SUCCESS

导出假 PEM 私有密钥文件

在 HSM 上拥有私有密钥后,您必须导出一个假 PEM 私有密钥文件。此文件不包含真密钥数据,但它允许 OpenSSL 动态引擎识别 HSM 上的私有密钥。您随后可以使用私有密钥创建证书签名请求(CSR),并签署 CSR 以创建证书。

注意

使用密钥管理实用程序(KMU)生成的伪造 PEM 文件可以与客户端软件开发工具包 3 和客户端软件开发工具包 5 一起使用。

识别与您要导出为假 PEM 的密钥对应的密钥句柄,然后运行以下命令以假 PEM 格式导出私有密钥并将其保存到文件中。将以下值替换为您自己的值。

  • <private_key_handle> – 生成的私有密钥的句柄。此句柄由上一步的密钥生成命令之一生成。在上一示例中,私有密钥的句柄为 8。

  • <web_server_fake_PEM.key> –写入假 PEM 密钥的文件名称。

Command: getCaviumPrivKey -k <private_key_handle> -out <web_server_fake_PEM.key>

Exit

运行以下命令停止 key_mgmt_util。

Command: exit

现在,您的系统上应该有一个新文件,该文件位于前述命令中<web_server_fake_PEM.key>所指定的路径。此文件是假 PEM 私有密钥文件。

生成自签名证书

生成伪造 PEM 私有密钥文件后,即可使用此文件生成证书签名请求(CSR)和证书。

在生产环境中,您通常使用证书颁发机构 (CA) 通过 CSR 创建证书。测试环境无需 CA。如果您使用 CA,则请将 CSR 文件发送给他们,然后使用他们在您的适用于 HTTPS的 Web 服务器中为您提供的签名 SSL/TLS 证书。

除了使用 CA 之外,您还可以使用 AWS CloudHSM OpenSSL 动态引擎创建自签名证书。自签名证书不受浏览器的信任,不应在生产环境中使用。它们可在测试环境中使用。

警告

自签名证书只应在测试环境中使用。对于生产环境,请使用更安全的方法 (如证书颁发机构) 来创建证书。

安装和配置 OpenSSL 动态引擎
  1. 连接到您的客户端实例。

  2. 要安装和配置,请执行以下操作之一:

生成证书
  1. 获取前面步骤中生成的伪造 PEM 文件的副本。

  2. 创建 CSR

    运行以下命令使用 AWS CloudHSM OpenSSL 动态引擎创建证书签名请求 (CSR)。将 <web_server_fake_PEM.key> 替换为包含您的伪造 PEM 私有密钥的文件的名称。将 <web_server.csr> 替换为包含您的 CSR 的文件的名称。

    req 命令是交互式的。响应每个字段。字段信息将复制到您的 SSL/TLS 证书中。

    $ openssl req -engine cloudhsm -new -key <web_server_fake_PEM.key> -out <web_server.csr>
  3. 创建自签名证书

    运行以下命令,使用 AWS CloudHSM OpenSSL 动态引擎在 HSM 上使用私钥签署您的 CSR。这会创建自签名证书。将命令中的以下值替换为您自己的值。

    • <web_server.csr> – 包含 CSR 的文件的名称。

    • <web_server_fake_PEM.key> – 包含伪造 PEM 私有密钥的文件的名称。

    • <web_server.crt> – 将包含您的 Web 服务器证书的文件的名称。

    $ openssl x509 -engine cloudhsm -req -days 365 -in <web_server.csr> -signkey <web_server_fake_PEM.key> -out <web_server.crt>

完成这些步骤后,请转到 步骤 3:配置 Web 服务器

导入现有私有密钥和证书

您可能已经有一个私有密钥和可用于 Web 服务器上的 HTTPS 的相应 SSL/TLS 证书。如果是,您可以按照本部分中的步骤将密钥导入 HSM。

注意

有关私有密钥导入和客户端软件开发工具包兼容性的一些说明:

  • 导入现有私有密钥需要客户端软件开发工具包 3。

  • 您可以结合使用客户端软件开发工具包 3 中的私有密钥与客户端软件开发工具包 5 中的私有密钥。

  • 适用于客户端软件开发工具包 3 的 OpenSSL 动态引擎不支持最新 Linux 平台,但适用于客户端软件开发工具包 5 的 OpenSSL 动态引擎的实现支持最新 Linux 平台。您可以使用客户端软件开发工具包 3 提供的密钥管理实用程序(KMU)导入现有私有密钥,然后使用该私有密钥和客户端软件开发工具包 5 的 OpenSSL 动态引擎实现来支持最新 Linux 平台上的 SSL/TLS 分载。

使用客户端软件开发工具包 3 将现有私有密钥导入到 HSM
  1. 连接到您的 Amazon EC2 客户端实例。如有必要,将您的现有私有密钥和证书复制到该实例。

  2. 安装和配置客户端软件开发工具包 3

  3. 运行以下命令启动 AWS CloudHSM 客户端。

    Amazon Linux
    $ sudo start cloudhsm-client
    Amazon Linux 2
    $ sudo service cloudhsm-client start
    CentOS 7
    $ sudo service cloudhsm-client start
    CentOS 8
    $ sudo service cloudhsm-client start
    RHEL 7
    $ sudo service cloudhsm-client start
    RHEL 8
    $ sudo service cloudhsm-client start
    Ubuntu 16.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 18.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 20.04 LTS
    $ sudo service cloudhsm-client start
    Ubuntu 22.04 LTS

    尚不支持 OpenSSL 动态引擎。

  4. 运行命令以启动 key_mgmt_util 命令行工具。

    $ /opt/cloudhsm/bin/key_mgmt_util
  5. 运行以下命令登录 HSM。将 <user name><password> 替换为加密用户 (CU) 的用户名和密码。

    Command: loginHSM -u CU -s <user name> -p <password>
  6. 运行以下命令以将您的私有密钥导入到 HSM。

    1. 运行以下命令以创建仅对当前会话有效的对称包装密钥。命令和输出如下所示。

      Command: genSymKey -t 31 -s 16 -sess -l wrapping_key_for_import Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS Symmetric Key Created. Key Handle: 6 Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS
    2. 运行以下命令以将您现有的私有密钥导入到 HSM。命令和输出如下所示。将以下值替换为您自己的值:

      • <web_server_existing.key> – 包含您的私有密钥的文件的名称。

      • <web_server_imported_key> – 您已导入私有密钥的标签。

      • <wrapping_key_handle> – 由上述命令生成的包装密钥句柄。在上一示例中,包装密钥句柄为 6。

      Command: importPrivateKey -f <web_server_existing.key> -l <web_server_imported_key> -w <wrapping_key_handle> BER encoded key length is 1219 Cfm3WrapHostKey returned: 0x00 : HSM Return: SUCCESS Cfm3CreateUnwrapTemplate returned: 0x00 : HSM Return: SUCCESS Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS Private Key Unwrapped. Key Handle: 8 Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS
  7. 运行以下命令以伪造 PEM 格式导出私有密钥并将其保存到文件。将以下值替换为您自己的值。

    • <private_key_handle> – 已导入私有密钥的句柄。此句柄由上一步骤中的第二个命令生成。在上一示例中,私有密钥的句柄为 8。

    • <web_server_fake_PEM.key> – 包含您已导出伪造 PEM 私有密钥的文件的名称。

    Command: getCaviumPrivKey -k <private_key_handle> -out <web_server_fake_PEM.key>
  8. 运行以下命令停止 key_mgmt_util。

    Command: exit

完成这些步骤后,请转到 步骤 3:配置 Web 服务器