View a markdown version of this page

AWS CloudHSM SSL/TLS 使用带有 OpenSSL 提供商的 NGINX 或 HAProxy 在 Linux 上卸载 - AWS CloudHSM

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

AWS CloudHSM SSL/TLS 使用带有 OpenSSL 提供商的 NGINX 或 HAProxy 在 Linux 上卸载

本主题提供了使用 NGINX 或 HAProxy 和 OpenSSL 提供商在 Linux Web 服务器 AWS CloudHSM 上设置 SSL/TLS 服务器身份卸载的分步说明。

概述

在 Linux 上,NGINX HAProxy Web 服务器软件与 OpenSSL 集成以支持 HTTP S。AWS CloudHSM OpenSSL 提供商提供的接口使 Web 服务器软件能够使用集群中的 HSM 进行加密卸载和密钥存储。OpenSSL 提供商是将 Web 服务器连接到您的 AWS CloudHSM 集群的桥梁。

要完成本教程,您将配置 NGINX 或 HAProxy 以使用 OpenSSL 提供商。 AWS CloudHSM 本教程向您展示了如何执行以下操作:

  • 在 Amazon EC2 实例上安装 Web 服务器软件。

  • 使用存储在您的 AWS CloudHSM 集群中的私有密钥将 Web 服务器软件配置为支持 HTTPS。

  • (可选)使用 Amazon EC2 创建第二个 Web 服务器实例,并使用 Elastic Load Balancing 创建负载均衡器。使用负载均衡器可以在多台服务器中分配负载,从而提高性能。它还能在一台或多台服务器发生故障的情况下提供冗余和更高的可用性。

在您准备好开始使用后,请转到 步骤 1:设置先决条件

步骤 1:设置先决条件

不同的平台需要不同的先决条件。请使用以下与您的平台匹配的先决条件部分。

的先决条件 AWS CloudHSM OpenSSL 提供商

要使用适用于客户端 SDK 5 的 AWS CloudHSM OpenSSL 提供商设置 Web SSL/TLS 服务器身份卸载,您需要满足以下条件:

  • 具有至少两个硬件安全模块 (HSM) 的活动 AWS CloudHSM 集群

    注意

    您可以使用单个 HSM 集群,但您必须首先禁用客户端密钥持久性。有关更多信息,请参阅管理客户端密钥持久性设置客户端软件开发工具包 5 配置工具

  • 一个运行已安装以下软件的 Linux 操作系统的 Amazon EC2 实例:

    • Web 服务器(NGINX 或 HAProxy)

    • 客户端 SDK AWS CloudHSM 5 的 OpenSSL 提供商

  • 一个加密用户(CU),该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。

在 HSM 上设置 Linux Web 服务器实例并创建 CU
注意

此过程中的许多命令都需要更高的权限。根据您的系统配置,您可能需要使用sudo或以 root 用户身份运行命令。

  1. 为客户端 SDK 5 安装和配置 AWS CloudHSM OpenSSL 提供商。有关安装 OpenSSL 提供商的更多信息,请参阅客户端 SDK AWS CloudHSM 5 的 OpenSSL 提供商。

  2. 在可以访问您的集群的 EC2 Linux 实例上,安装 NGINX 或 HAProxy Web 服务器:

    Amazon Linux 2023
    • NGINX

      $ yum install nginx
    • HAProxy

      $ yum install haproxy
    RHEL 9 (9.2+)
    • NGINX

      $ yum install nginx
    • HAProxy

      $ yum install haproxy
    RHEL 10 (10.0+)
    • NGINX

      $ yum install nginx
    • HAProxy

      $ yum install haproxy
    Ubuntu 26.04 LTS
    • NGINX

      $ apt install nginx
    • HAProxy

      $ apt install haproxy
  3. 使用 CloudHSM CLI 创建加密用户。有关管理 HSM 用户的更多信息,请参阅使用 CloudHSM CLI 管理 HSM 用户

    提示

    跟踪 CU 用户名和密码。您稍后为 Web 服务器生成或导入 HTTPS 私有密钥和证书时需要它们。

完成这些步骤后,请转到 第 2 步:生成或导入私钥并获取证书

注意

  • 要使用 Security-Enhanced Linux (SELinux) 和 Web 服务器,必须允许在端口 2223 上进行出站 TCP 连接,这是客户端 SDK 5 用于与 HSM 通信的端口。

  • 要创建和激活集群并授予 EC2 实例访问该集群的权限,请完成入门 AWS CloudHSM的步骤。该入门提供了使用一个 HSM 和一个 Amazon EC2 客户端实例创建活动集群的分步说明。您可使用此客户端实例作为您的 Web 服务器。

  • 为避免禁用客户端密钥持久性,请向集群添加多个 HSM。有关更多信息,请参阅 将 HSM 添加到 AWS CloudHSM cluster

  • 要连接到客户端实例,可以使用 SSH 或 PuTTY。有关更多信息,请参阅 Amazon EC2 文档中的使用 SSH 连接到您的 Linux 实例使用 PuTTY 从 Windows 连接到您的 Linux 实例

第 2 步:生成或导入私钥并获取证书

要启用 HTTPS,您的 Web 服务器应用程序(NGINX 或 HAProxy)需要私钥和相应的证书。 SSL/TLS 要使用 Web SSL/TLS 服务器身份卸载 AWS CloudHSM,必须将私钥存储在集群的 AWS CloudHSM HSM 中。首先,创建私有密钥,然后使用该密钥创建证书签名请求(CSR)。然后,从 HSM 中导出一个伪造 PEM 私有密钥,该私有密钥是 PEM 格式的私有密钥文件,其中包含对存储在 HSM 上的私有密钥的引用(它不是真正的私有密钥)。在服务器身份卸载期间 SSL/TLS ,您的 Web 服务器使用虚假的 PEM 私钥文件来识别 HSM 上的私钥。

生成私有密钥

本节显示了如何使用 CloudHSM CLI 生成密钥对。在 HSM 中生成密钥对后,即可将其导出为伪造 PEM 文件,并生成相应的证书。

安装和配置 CloudHSM CLI
  1. 安装和配置 CloudHSM CLI。

  2. 使用以下命令启动 CloudHSM CLI。

    $ /opt/cloudhsm/bin/cloudhsm-cli interactive
  3. 运行以下命令登录 HSM。<user name>替换为您的加密用户的用户名

    aws-cloudhsm>login --username <user name> --role crypto-user

生成私有密钥

根据您的使用案例,您可以生成 RSA 或 EC 密钥对。您还可以生成 Ed25519 或 ML-DSA 密钥对,用于 TLS 1.3。请执行以下操作之一:

  • 在 HSM 上生成 RSA 私有密钥

    使用 key generate-asymmetric-pair rsa 命令生成 RSA 密钥对。此示例生成 RSA 密钥对,其模数为 2048,公有指数为 65537,公钥标签为,私钥标签为。tls_rsa_pub tls_rsa_private

    aws-cloudhsm > key generate-asymmetric-pair rsa \ --public-exponent 65537 \ --modulus-size-bits 2048 \ --public-label tls_rsa_pub \ --private-label tls_rsa_private \ --private-attributes sign=true { "error_code": 0, "data": { "public_key": { "key-reference": "0x0000000000280cc8", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "full" }, "attributes": { "key-type": "rsa", "label": "tls_rsa_pub", "id": "", "check-value": "0x01fe6e", "class": "public-key", "encrypt": true, "decrypt": false, "token": true, "always-sensitive": false, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": false, "sign": false, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 512, "public-exponent": "0x010001", "modulus": "0xb1d27e857a876f4e9fd5de748a763c539b359f937eb4b4260e30d1435485a732c878cdad9c72538e2215351b1d41358c9bf80b599c73a80fdb457aa7b20cd61e486c326e2cfd5e124a7f6a996437437812b542e3caf85928aa866f0298580f7967ee6aa01440297d7308fdd9b76b70d1b67f12634df6e6296d6c116d5744c6d60d14d3bf3cb978fe6b75ac67b7089bafd50d8687213b31abc7dc1bad422780d29c851d5102b56f932551eaf52a9591fd8c43d81ecc133022653225bd129f8491101725e9ea33e1ded83fb57af35f847e532eb30cd7e726f23910d2671c6364092e834697ec3cef72cc23615a1ba7c5e100156ae0acac3160f0ca9725d38318b7", "modulus-size-bits": 2048 } }, "private_key": { "key-reference": "0x0000000000280cc7", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "full" }, "attributes": { "key-type": "rsa", "label": "tls_rsa_private", "id": "", "check-value": "0x01fe6e", "class": "private-key", "encrypt": false, "decrypt": true, "token": true, "always-sensitive": true, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 1217, "public-exponent": "0x010001", "modulus": "0xb1d27e857a876f4e9fd5de748a763c539b359f937eb4b4260e30d1435485a732c878cdad9c72538e2215351b1d41358c9bf80b599c73a80fdb457aa7b20cd61e486c326e2cfd5e124a7f6a996437437812b542e3caf85928aa866f0298580f7967ee6aa01440297d7308fdd9b76b70d1b67f12634df6e6296d6c116d5744c6d60d14d3bf3cb978fe6b75ac67b7089bafd50d8687213b31abc7dc1bad422780d29c851d5102b56f932551eaf52a9591fd8c43d81ecc133022653225bd129f8491101725e9ea33e1ded83fb57af35f847e532eb30cd7e726f23910d2671c6364092e834697ec3cef72cc23615a1ba7c5e100156ae0acac3160f0ca9725d38318b7", "modulus-size-bits": 2048 } } } }
  • 在 HSM 上生成 EC 私有密钥

    使用 key generate-asymmetric-pair ec 命令生成 EC 密钥对。此示例生成 EC 密钥对,其prime256v1曲线为(对应于NID_X9_62_prime256v1曲线),公钥标签为tls_ec_pub,私钥标签为tls_ec_private

    aws-cloudhsm > key generate-asymmetric-pair ec \ --curve prime256v1 \ --public-label tls_ec_pub \ --private-label tls_ec_private \ --private-attributes sign=true { "error_code": 0, "data": { "public_key": { "key-reference": "0x000000000012000b", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "session" }, "attributes": { "key-type": "ec", "label": "tls_ec_pub", "id": "", "check-value": "0xd7c1a7", "class": "public-key", "encrypt": false, "decrypt": false, "token": false, "always-sensitive": false, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": false, "sign": false, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 57, "ec-point": "0x047096513df542250a6b228fd9cb67fd0c903abc93488467681974d6f371083fce1d79da8ad1e9ede745fb9f38ac8622a1b3ebe9270556000c", "curve": "secp224r1" } }, "private_key": { "key-reference": "0x000000000012000c", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "session" }, "attributes": { "key-type": "ec", "label": "tls_ec_private", "id": "", "check-value": "0xd7c1a7", "class": "private-key", "encrypt": false, "decrypt": false, "token": false, "always-sensitive": true, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 122, "ec-point": "0x047096513df542250a6b228fd9cb67fd0c903abc93488467681974d6f371083fce1d79da8ad1e9ede745fb9f38ac8622a1b3ebe9270556000c", "curve": "secp224r1" } } } }
  • 在 HSM 上生成 Ed25519 私钥

    Ed25519 可用性

    Ed25519 仅适用于非 FIPS 集群。Ed25519 仅支持 TLS 1.3。

    使用该key generate-asymmetric-pair ec命令生成 Ed25519 密钥对。此示例生成一个 Ed25519 密钥对,其公钥标签为tls_ed25519_pub,私钥标签为。tls_ed25519_private

    aws-cloudhsm > key generate-asymmetric-pair ec \ --curve ed25519 \ --public-label tls_ed25519_pub \ --private-label tls_ed25519_private \ --private-attributes sign=true \ --public-attributes verify=true { "error_code": 0, "data": { "public_key": { "key-reference": "0x0000000000383931", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "key-quorum-values": { "manage-key-quorum-value": 0, "use-key-quorum-value": 0 }, "cluster-coverage": "full" }, "attributes": { "key-type": "ec", "label": "tls_ed25519_pub", "id": "0x", "check-value": "0x4cb1b1", "class": "public-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": false, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": false, "sign": false, "trusted": false, "unwrap": false, "verify": true, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 32, "ec-point": "0x302a300506032b6570032100c31f8a3695f571dda1658bc98e0591ab088c1a657b3199dd50c3956046ebbe75", "curve": "ed25519" } }, "private_key": { "key-reference": "0x0000000000382e60", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "key-quorum-values": { "manage-key-quorum-value": 0, "use-key-quorum-value": 0 }, "cluster-coverage": "full" }, "attributes": { "key-type": "ec", "label": "tls_ed25519_private", "id": "0x", "check-value": "0x4cb1b1", "class": "private-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": true, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 48, "ec-point": "0x302a300506032b6570032100c31f8a3695f571dda1658bc98e0591ab088c1a657b3199dd50c3956046ebbe75", "curve": "ed25519" } } } }
  • 在 HSM 上生成 ML-DSA 私钥

    ML-DSA 可用性和要求

    ML-DSA 仅在非 FIPS 集群上可用,并且需要 OpenSSL 3.5 或更高版本才能创建 CSR、证书创建和 TLS 卸载。 ML-DSA 仅支持 TLS 1.3。

    要在亚马逊 ML-DSA Linux 2023 和 RHEL 平台上卸载 TLS,您可能需要启用后量子 (PQ) 加密子策略。有关更多信息,请参阅 问题:在 “没有共享签名算法” 的 Amazon Linux 2023 和 RHEL 上, ML-DSA TLS 握手失败

    使用key generate-asymmetric-pair ml-dsa命令生成密 ML-DSA 钥对。此示例生成一个公 ML-DSA-44 钥标签为tls_mldsa44_pub、私钥标签为的密钥对tls_mldsa44_private。您也可以使用ML-DSA-65或来ML-DSA-87获得更高的安全级别。

    aws-cloudhsm > key generate-asymmetric-pair ml-dsa \ --mldsa-algorithm ML-DSA-44 \ --public-label tls_mldsa44_pub \ --private-label tls_mldsa44_private \ --private-attributes sign=true \ --public-attributes verify=true { "error_code": 0, "data": { "public_key": { "key-reference": "0x0000000000280cd2", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "full" }, "attributes": { "key-type": "ml-dsa", "label": "tls_mldsa44_pub", "id": "", "check-value": "0xd4e5f6", "class": "public-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": false, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": false, "sign": false, "trusted": false, "unwrap": false, "verify": true, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 1312, "mldsa-algorithm": "ML-DSA-44" } }, "private_key": { "key-reference": "0x0000000000280cd3", "key-info": { "key-owners": [ { "username": "cu1", "key-coverage": "full" } ], "shared-users": [], "cluster-coverage": "full" }, "attributes": { "key-type": "ml-dsa", "label": "tls_mldsa44_private", "id": "", "check-value": "0xd4e5f6", "class": "private-key", "encrypt": false, "decrypt": false, "token": true, "always-sensitive": true, "derive": false, "destroyable": true, "extractable": true, "local": true, "modifiable": true, "never-extractable": false, "private": true, "sensitive": true, "sign": true, "trusted": false, "unwrap": false, "verify": false, "wrap": false, "wrap-with-trusted": false, "key-length-bytes": 2560, "mldsa-algorithm": "ML-DSA-44" } } } }

导出假 PEM 私有密钥文件

在 HSM 上拥有私有密钥后,您必须导出一个假 PEM 私有密钥文件。该文件不包含实际的密钥数据,但它允许 OpenSSL 提供者识别 HSM 上的私钥。然后,您可以使用私钥创建证书签名请求 (CSR) 并签署 CSR 以创建证书。

使用 key generate-file 命令以伪造 PEM 格式导出私有密钥并将其保存到文件。将以下值替换为您自己的值。

  • <private_key_label>— 您在上一步中生成的私钥的标签。

  • <web_server_fake_pem.key>— 您的虚假 PEM 密钥将被写入的文件名。

用于 RSA 和 EC 密钥

使用编reference-pem码:

aws-cloudhsm > key generate-file --encoding reference-pem --path <web_server_fake_pem.key> --filter attr.label=<private_key_label> { "error_code": 0, "data": { "message": "Successfully generated key file" } }
用于 Ed25519 和钥匙 ML-DSA

使用编cloudhsm-reference-pem码:

aws-cloudhsm > key generate-file --encoding cloudhsm-reference-pem --path <web_server_fake_pem.key> --filter attr.label=<private_key_label> { "error_code": 0, "data": { "message": "Successfully generated key file" } }

退出 CloudHSM CLI

运行以下命令停止 CloudHSM CLI。

aws-cloudhsm > quit

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

生成自签名证书

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

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

除了使用 CA 之外,您还可以使用 AWS CloudHSM OpenSSL 提供商来创建自签名证书。 Self-signed 证书不受浏览器信任,不应在生产环境中使用。它们可在测试环境中使用。

警告

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

安装和配置 OpenSSL 提供商
  1. 连接到您的客户端实例。

  2. 安装用于 OpenSSL 提供商 AWS CloudHSM 客户端软件开发工具包 5

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

  2. 创建 CSR

    运行以下命令以使用 AWS CloudHSM OpenSSL 提供商创建证书签名请求 (CSR)。<web_server_fake_pem.key>替换为包含您的虚假 PEM 私钥的文件名。<web_server.csr>替换为包含您的 CSR 的文件名。

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

    ML-DSA OpenSSL 版本要求

    ML-DSA 需要 OpenSSL 3.5 或更高版本。在使用旧系统 OpenSSL 的平台上,必须使用定制的 OpenSSL 3.5+ 二进制文件。

    RSA 和 EC 密钥所需的摘要算法

    对于 RSA 和 EC 密钥,必须指定摘要算法(例如,-sha256)。Ed25519 并且 ML-DSA 不需要摘要标志。

    $ openssl req -provider cloudhsm -provider default -new -sha256 -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 -provider cloudhsm -provider default -req -sha256 -days 365 -in <web_server.csr> -signkey <web_server_fake_pem.key> -out <web_server.crt>

获得私钥和证书后,转到步骤 3:配置 Web 服务器

步骤 3:配置 Web 服务器

更新您的网络服务器软件的配置以使用 HTTPS 证书以及在上一步中创建的相应伪造 PEM 私有密钥。切记在开始前备份您现有的证书。这将完成对用于卸载服务器身份的 Linux Web SSL/TLS 服务器软件的 AWS CloudHSM设置。

完成下述步骤之一。

配置 NGINX网络服务器

使用此部分使用 OpenSSL 提供商配置 NGINX。

为 OpenSSL 提供商配置 NGINX
  1. 连接到您的客户端实例。

  2. 运行以下命令以创建网络服务器证书和伪造 PEM 私有密钥所需的目录。

    $ mkdir -p /etc/pki/nginx/private
  3. 运行以下命令以将您的网络服务器证书复制到所需位置。<web_server.crt>替换为您的 Web 服务器证书的名称。

    $ cp <web_server.crt> /etc/pki/nginx/server.crt
  4. 运行以下命令以将您的伪造 PEM 私有密钥复制到所需位置。<web_server_fake_pem.key>替换为包含您的虚假 PEM 私钥的文件名。

    $ cp <web_server_fake_pem.key> /etc/pki/nginx/private/server.key
  5. 运行以下命令更改文件所有权,以便名为 nginx 的用户可读取它们。

    $ chown nginx /etc/pki/nginx/server.crt /etc/pki/nginx/private/server.key
  6. 配置 OpenSSL 以使用 AWS CloudHSM 提供商。有关配置 OpenSSL 提供商的更多信息,请参阅客户端 SDK AWS CloudHSM 5 的 OpenSSL 提供商。

    1. 找到你的 OpenSSL 配置文件:

      $ openssl version -d

      您应该可以看到类似于以下的输出内容:

      OPENSSLDIR: "/etc/pki/tls"

      配置文件在此openssl.cnf目录中。

    2. 注意

      不要直接修改系统的默认 openssl.cnf 文件。这样可以防止系统范围的 OpenSSL 操作(SSH、TLS 连接和其他服务)无意中通过 CloudHSM 提供商进行路由。

      使用单独的配置文件允许您将 CloudHSM Provider 的使用范围限定为仅需要 HSM-backed 加密操作的特定应用程序。

      使用以下内容创建新的 OpenSSL 配置文件:

      $ cat > <example-cloudhsm-openssl.cnf> << 'EOF' ## NOTE: This should point to the system default openssl config file. # Replace /etc/pki/tls with the path to your OpenSSL configuration directory .include </etc/pki/tls>/openssl.cnf # Override the existing provider_section to include AWS CloudHSM OpenSSL Provider as a 3rd party OpenSSL provider [provider_sect] default = default_sect # Include AWS CloudHSM CloudHSM OpenSSL provider cloudhsm = cloudhsm_sect [default_sect] activate = 1 [cloudhsm_sect] activate = 1 EOF
    3. 确保使用您的加密用户 (CU) 凭据设置CLOUDHSM_PIN环境变量:

      $ export CLOUDHSM_PIN=<username>:<password>
    4. OPENSSL_CONF环境变量设置为指向更新后的配置文件并验证提供程序是否已加载:

      $ OPENSSL_CONF=/path/to/example-cloudhsm-openssl.cnf openssl list -providers

      您应该会看到默认提供商和 CloudHSM 提供商都列出了:

      OPENSSL_CONF=/path/to/example-cloudhsm-openssl.cnf openssl list -providers Providers: default name: OpenSSL Default Provider version: 3.2.2 status: active cloudhsm name: AWS CloudHSM OpenSSL Provider version: 5.17.0 status: active
  7. 运行以下命令可备份 /etc/nginx/nginx.conf 文件。

    $ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
  8. 更新 NGINX 的配置。

    注意

    每个集群最多可在所有 NGINX 网络服务器上支持 1000 NGINX 工作进程。

    Amazon Linux 2023

    使用文本编辑器编辑 /etc/nginx/nginx.conf 文件。这可能需要 Linux 根权限。在文件顶部,添加以下行:

    env CLOUDHSM_PIN; env OPENSSL_CONF;

    然后将以下内容添加至文件的 TLS 部分:

    # Settings for a TLS enabled server. server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /usr/share/nginx/html; ssl_certificate "/etc/pki/nginx/server.crt"; ssl_certificate_key "/etc/pki/nginx/private/server.key"; # It is *strongly* recommended to generate unique DH parameters for DHE ciphers # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 # ssl_dhparam "/etc/pki/nginx/dhparams.pem"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"; ssl_prefer_server_ciphers off; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
    RHEL 9 (9.2+)

    使用文本编辑器编辑 /etc/nginx/nginx.conf 文件。这可能需要 Linux 根权限。在文件顶部,添加以下行:

    env CLOUDHSM_PIN; env OPENSSL_CONF;

    然后将以下内容添加至文件的 TLS 部分:

    # Settings for a TLS enabled server. server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /usr/share/nginx/html; ssl_certificate "/etc/pki/nginx/server.crt"; ssl_certificate_key "/etc/pki/nginx/private/server.key"; # It is *strongly* recommended to generate unique DH parameters for DHE ciphers # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 # ssl_dhparam "/etc/pki/nginx/dhparams.pem"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"; ssl_prefer_server_ciphers off; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
    RHEL 10 (10.0+)

    使用文本编辑器编辑 /etc/nginx/nginx.conf 文件。这可能需要 Linux 根权限。在文件顶部,添加以下行:

    env CLOUDHSM_PIN; env OPENSSL_CONF;

    然后将以下内容添加至文件的 TLS 部分:

    # Settings for a TLS enabled server. server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /usr/share/nginx/html; ssl_certificate "/etc/pki/nginx/server.crt"; ssl_certificate_key "/etc/pki/nginx/private/server.key"; # It is *strongly* recommended to generate unique DH parameters for DHE ciphers # Generate them with: openssl dhparam -out /etc/pki/nginx/dhparams.pem 2048 # ssl_dhparam "/etc/pki/nginx/dhparams.pem"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"; ssl_prefer_server_ciphers off; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
    Ubuntu 26.04 LTS

    使用文本编辑器编辑 /etc/nginx/nginx.conf 文件。这可能需要 Linux 根权限。在文件顶部,添加以下行:

    env CLOUDHSM_PIN; env OPENSSL_CONF;

    然后将以下内容添加至文件的 TLS 部分:

    # Settings for a TLS enabled server. server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /var/www/html; ssl_certificate "/etc/ssl/certs/server.crt"; ssl_certificate_key "/etc/ssl/private/server.key"; # It is *strongly* recommended to generate unique DH parameters for DHE ciphers # Generate them with: openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048 # ssl_dhparam "/etc/ssl/certs/dhparams.pem"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"; ssl_prefer_server_ciphers off; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }

    保存该文件。

  9. 备份 systemd 配置文件,然后设置 EnvironmentFile 路径。

    Amazon Linux 2023
    1. 备份nginx.service文件:

      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
    2. 在文本编辑器中打开 /lib/systemd/system/nginx.service。在 [服务] 部分下,添加:

      EnvironmentFile=/etc/sysconfig/nginx
    RHEL 9 (9.2+)
    1. 备份nginx.service文件:

      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
    2. 在文本编辑器中打开 /lib/systemd/system/nginx.service。在 [服务] 部分下,添加:

      EnvironmentFile=/etc/sysconfig/nginx
    RHEL 10 (10.0+)
    1. 备份nginx.service文件:

      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
    2. 在文本编辑器中打开 /lib/systemd/system/nginx.service。在 [服务] 部分下,添加:

      EnvironmentFile=/etc/sysconfig/nginx
    Ubuntu 26.04 LTS
    1. 备份nginx.service文件:

      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
    2. 在文本编辑器中打开 /lib/systemd/system/nginx.service。在 [服务] 部分下,添加:

      EnvironmentFile=/etc/sysconfig/nginx
  10. 检查 /etc/sysconfig/nginx 文件是否存在,然后执行下列操作之一:

    • 如果文件存在,请通过运行以下命令备份文件:

      $ cp /etc/sysconfig/nginx /etc/sysconfig/nginx.backup
    • 如果文件不存在,请打开文本编辑器,然后在 /etc/sysconfig/ 文件夹中创建名为 nginx 的文件。

  11. 配置 NGINX 环境。

    Amazon Linux 2023

    以 Linux 根用户身份,在文本编辑器中打开 /etc/sysconfig/nginx 文件。例如,

    vi /etc/sysconfig/nginx

    添加加密用户 (CU) 凭据和 OpenSSL 配置文件的路径:

    CLOUDHSM_PIN=<CU user name>:<password> OPENSSL_CONF=<path to example-cloudhsm-openssl.cnf>

    <CU user name><password>替换为 CU 证书。<path to example-cloudhsm-openssl.cnf>替换为您在中创建的配置文件的完整路径为 OpenSSL 提供商配置 NGINX

    保存该文件。

    RHEL 9 (9.2+)

    在文本编辑器中打开 /etc/sysconfig/nginx 文件。这可能需要 Linux 根权限。添加加密用户 (CU) 凭据和 OpenSSL 配置文件的路径:

    CLOUDHSM_PIN=<CU user name>:<password> OPENSSL_CONF=<path to example-cloudhsm-openssl.cnf>

    <CU user name><password>替换为 CU 证书。<path to example-cloudhsm-openssl.cnf>替换为您在中创建的配置文件的完整路径为 OpenSSL 提供商配置 NGINX

    保存该文件。

    RHEL 10 (10.0+)

    在文本编辑器中打开 /etc/sysconfig/nginx 文件。这可能需要 Linux 根权限。添加加密用户 (CU) 凭据和 OpenSSL 配置文件的路径:

    CLOUDHSM_PIN=<CU user name>:<password> OPENSSL_CONF=<path to example-cloudhsm-openssl.cnf>

    <CU user name><password>替换为 CU 证书。<path to example-cloudhsm-openssl.cnf>替换为您在中创建的配置文件的完整路径为 OpenSSL 提供商配置 NGINX

    保存该文件。

    Ubuntu 26.04 LTS

    在文本编辑器中打开 /etc/sysconfig/nginx 文件。这可能需要 Linux 根权限。添加加密用户 (CU) 凭据和 OpenSSL 配置文件的路径:

    CLOUDHSM_PIN=<CU user name>:<password> OPENSSL_CONF=<path to example-cloudhsm-openssl.cnf>

    <CU user name><password>替换为 CU 证书。<path to example-cloudhsm-openssl.cnf>替换为您在中创建的配置文件的完整路径为 OpenSSL 提供商配置 NGINX

    保存该文件。

  12. 启动 NGINX网络服务器。

    Amazon Linux 2023

    停止所有 NGINX 进程

    $ systemctl stop nginx

    重新加载 systemd 配置以获取最新更改

    $ systemctl daemon-reload

    启动 NGINX

    $ systemctl start nginx
    RHEL 9 (9.2+)

    停止任何运行中的 NGINX 进程

    $ systemctl stop nginx

    重新加载 systemd 配置以获取最新更改

    $ systemctl daemon-reload

    启动 NGINX 进程

    $ systemctl start nginx
    RHEL 10 (10.0+)

    停止任何运行中的 NGINX 进程

    $ systemctl stop nginx

    重新加载 systemd 配置以获取最新更改

    $ systemctl daemon-reload

    启动 NGINX 进程

    $ systemctl start nginx
    Ubuntu 26.04 LTS

    停止任何运行中的 NGINX 进程

    $ systemctl stop nginx

    重新加载 systemd 配置以获取最新更改

    $ systemctl daemon-reload

    启动 NGINX 进程

    $ systemctl start nginx

配置 NGINX 后,转到。验证 HTTPS 使用的是您已配置的证书

配置 HAProxy Web 服务器

使用此部分使用 OpenSSL 提供商配置 HAProxy。以下示例显示如何使用您的 CloudHSM 证书和密钥设置 HAProxy。

为 OpenSSL 提供商配置 HAProxy
  1. 备份现有的组合证书文件(如果存在):

    $ cp server-combined.pem server-combined.pem.backup
  2. 使用您的证书和 CloudHSM 虚假 PEM 密钥为 HAProxy 创建组合证书文件:

    $ cat server.crt server.key > server-combined.pem
  3. 备份现有的 HAProxy 配置:

    $ cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
  4. 在以下位置创建新的 CloudHSM TLS 卸载配置:/etc/haproxy/haproxy.cfg

    global daemon ssl-provider cloudhsm # It is *strongly* recommended to generate unique DH parameters # Generate them with: openssl dhparam -out /etc/haproxy/dhparams.pem 2048 # ssl-dh-param-file /etc/haproxy/dhparams.pem ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend haproxy_frontend bind *:443 ssl crt /path/to/server-combined.pem default_backend web_servers backend web_servers server web1 127.0.0.1:8080 check

    更新证书路径以匹配您的文件位置。

  5. 将 systemd 配置为使用 HAProxy 的环境文件。位置取决于你的 Linux 发行版。

    Amazon Linux and RHEL

    备份和修改 HAProxy 服务文件:

    $ cp /lib/systemd/system/haproxy.service /lib/systemd/system/haproxy.service.backup

    在 [服务] 部分下编辑/lib/systemd/system/haproxy.service并添加以下行:

    EnvironmentFile=/etc/sysconfig/haproxy
    Ubuntu

    备份和修改 HAProxy 服务文件:

    $ cp /lib/systemd/system/haproxy.service /lib/systemd/system/haproxy.service.backup

    在 [服务] 部分下编辑/lib/systemd/system/haproxy.service并添加以下行:

    EnvironmentFile=/etc/default/haproxy
  6. 在系统的相应位置创建环境文件。

    Amazon Linux and RHEL

    如果 HAProxy 环境文件存在,请对其进行备份:

    $ cp /etc/sysconfig/haproxy /etc/sysconfig/haproxy.backup

    创建/etc/sysconfig/haproxy包含以下内容的 HAProxy 环境文件:

    CLOUDHSM_PIN=<CU user name>:<password>
    Ubuntu

    如果 HAProxy 环境文件存在,请对其进行备份:

    $ cp /etc/default/haproxy /etc/default/haproxy.backup

    创建/etc/default/haproxy包含以下内容的 HAProxy 环境文件:

    CLOUDHSM_PIN=<CU user name>:<password>

    <CU user name><password>替换为您的 CU 证书。

  7. 重新加载 systemd 配置:

    $ systemctl daemon-reload
  8. 使用 CloudHSM TLS 卸载配置启动 HAProxy:

    $ systemctl start haproxy

    你也可以使用自定义配置文件直接运行 HAProxy:

    $ haproxy -f /path/to/haproxy-cloudhsm.cfg

配置 HAProxy 后,转到。验证 HTTPS 使用的是您已配置的证书

步骤 4:启用 HTTPS 流量并验证证书

将 Web 服务器配置为使用 SSL/TLS 卸载后 AWS CloudHSM,将您的 Web 服务器实例添加到允许入站 HTTPS 流量的安全组中。Web 浏览器等客户端可通过 Web 服务器创建 HTTPS 连接。然后与您的 Web 服务器建立 HTTPS 连接,并确认它使用的是您为 SSL/TLS 卸载配置的证书。 AWS CloudHSM

启用入站 HTTPS 连接

要从客户端 (如 Web 浏览器) 连接到您的 Web 服务器,请创建一个允许入站 HTTPS 连接的安全组。具体来说,它应允许端口 443 上的入站 TCP 连接。将此安全组分配给您的网络服务器。

为 HTTPS 创建安全组并将其分配给您的网络服务器
  1. 打开位于 https://console.aws.amazon.com/ec2/ 的 Amazon EC2 控制台。

  2. 在导航窗格中,选择安全组

  3. 选择创建安全组

  4. 对于创建安全组,执行以下操作:

    1. 对于安全组名称,键入您要创建的安全组的名称。

    2. (可选) 键入对您要创建的安全组的描述。

    3. 对于 VPC,选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。

    4. 选择添加规则

    5. 对于类型,从下拉窗口中选择 HTTPS

    6. 对于来源,输入来源位置。

    7. 选择创建安全组

  5. 在导航窗格中,选择实例

  6. 选中您的 Web 服务器实例旁边的复选框。

  7. 在页面顶部选择操作下拉菜单。选择安全,然后选择更改安全组

  8. 对于关联安全组,请选择搜索框,然后选择您为 HTTPS 创建的安全组。然后选择添加安全组

  9. 选择保存

验证 HTTPS 使用的是您已配置的证书

将 Web 服务器添加到安全组后,您可以验证 SSL/TLS 卸载是否使用您的自签名证书。您可以使用网络浏览器或使用工具 (如 OpenSSL s_client) 执行此操作。

使用 Web 浏览器验证 SSL/TLS 卸载
  1. 使用 Web 浏览器连接到采用服务器的公共 DNS 名称或 IP 地址的 Web 服务器。确保地址栏中的 URL 以开头,https://.例如,https://ec2-52-14-212-67.us-east-2.compute.amazonaws.com/

    提示

    您可以使用诸如 Amazon Route 53 之类的 DNS 服务将您网站的域名(例如https://www.example.com/)路由到您的网络服务器。有关更多信息,请参阅 《Amazon Route 53 开发人员指南》或 DNS 服务文档中的将流量路由到 Amazon EC2 实例

  2. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息,请参阅下列内容:

    • 对于 Mozilla Firefox,请参阅 Mozilla Support 网站上的查看证书

    • 关于 Google Chrome 浏览器,请参阅 Google Tools for Web Developers 网站上的了解安全问题

    其他网络浏览器可能具有相似的功能,可使用这些功能来查看网络服务器证书。

  3. 确保该 SSL/TLS 证书是您配置 Web 服务器时使用的证书。

使用 OpenSS SSL/TLS L 验证卸载 s_client
  1. 运行以下 OpenSSL 命令以通过 HTTPS 连接到您的 Web 服务器。<server name>替换为您的 Web 服务器的公有 DNS 名称或 IP 地址。

    openssl s_client -connect <server name>:443
    提示

    您可以使用诸如 Amazon Route 53 之类的 DNS 服务将您网站的域名(例如https://www.example.com/)路由到您的网络服务器。有关更多信息,请参阅 《Amazon Route 53 开发人员指南》或 DNS 服务文档中的将流量路由到 Amazon EC2 实例

  2. 确保该 SSL/TLS 证书是您配置 Web 服务器时使用的证书。

您现在有一个通过 HTTPS 保护的网站。Web 服务器的私钥存储在 AWS CloudHSM 集群的 HSM 中。

若要添加负载均衡器,请参阅 使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM(可选)