AWS CloudHSM 使用 NGINX 或 OpenSSL 提供程序在 Linux 上卸载 SSL/TLS HAProxy - AWS CloudHSM

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

AWS CloudHSM 使用 NGINX 或 OpenSSL 提供程序在 Linux 上卸载 SSL/TLS HAProxy

本主题提供 step-by-step有关使用 NGINX 在 Linux Web SSL/TLS 服务器 AWS CloudHSM 上或使用 OpenSSL 提供程序设置服务器身份卸载 HAProxy 的说明。

概述

在 Linux 上,NGINXHAProxyWeb 服务器软件与 Op enSS L 集成以支持 HTTPS。AWS CloudHSM OpenSSL 提供程序提供了一个接口,允许 Web 服务器软件使用集群 HSMs 中的进行加密卸载和密钥存储。OpenSSL 提供程序是将 Web 服务器连接到您的 AWS CloudHSM 集群的桥梁。

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

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

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

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

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

步骤 1:设置先决条件

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

AWS CloudHSM OpenSSL 提供程序的先决条件

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

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

    注意

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

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

    • 网络服务器(NGINX 或) HAProxy

    • 适用于客户端 SD AWS CloudHSM K 的 OpenSSL 提供商 5

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

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

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

  1. 安装和配置适用于客户端 SDK AWS CloudHSM 的 OpenSSL 提供程序 5。有关安装 OpenSSL 提供程序的更多信息,请参阅适用于客户端 SDK 的 Op AWS CloudHSM enSSL 提供程序 5。

  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 24.04
    • NGINX

      $ apt install nginx
    • HAProxy

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

    提示

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

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

注意

  • 要使用安全增强型 Linux (SELinux) 和 Web 服务器,必须允许端口 2223 上的出站 TCP 连接,该端口是 Client SDK 5 用来与 HSM 通信的端口。

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

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

  • 要连接到客户端实例,可以使用 SSH 或 PuTTY。有关更多信息,请参阅亚马逊 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 密钥对。请执行以下操作之一:

  • 在 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" } } } }

导出假 PEM 私有密钥文件

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

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

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

  • <web_server_fake_pem.key>— 您的假 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" } }

退出 CloudHSM CLI

运行以下命令停止 CloudHSM CLI。

aws-cloudhsm > quit

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

生成自签名证书

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

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

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

警告

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

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

  2. 安装适用于 AWS CloudHSM Client SDK 5 的 OpenSSL 动态引擎

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

  2. 创建 CSR

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

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

    注意

    OpenSSL 提供程序目前不支持创建 CSR。此步骤必须使用 OpenSSL 引擎,但是 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 服务器

步骤 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 的 Op AWS CloudHSM enSSL 提供程序 5。

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

      $ openssl version -d

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

      OPENSSLDIR: "/etc/pki/tls"

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

    2. 注意

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

      使用单独的配置文件可以将 CloudHSM 提供程序的使用范围仅限于需要 HSM 支持的加密操作的特定应用程序。

      创建一个包含以下内容的新 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 24.04

    使用文本编辑器编辑 /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 24.04
    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 凭证替换<CU user name><password><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 凭证替换<CU user name><password><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 凭证替换<CU user name><password><path to example-cloudhsm-openssl.cnf>替换为您在中创建的配置文件的完整路径为 OpenSSL 提供程序配置 NGINX

    保存该文件。

    Ubuntu 24.04

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

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

    用 CU 凭证替换<CU user name><password><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 24.04

    停止任何运行中的 NGINX 进程

    $ systemctl stop nginx

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

    $ systemctl daemon-reload

    启动 NGINX 进程

    $ systemctl start nginx

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

配置 HAProxy Web 服务器

使用此部分可以使用 OpenSSL HAProxy 提供程序进行配置。以下示例展示了如何 HAProxy 使用您的 CloudHSM 证书和密钥进行设置。

要为 Open HAProxy SSL 提供程序进行配置
  1. 备份现有的合并证书文件(如果存在):

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

    $ 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 凭证替换<CU user name><password>

  7. 重新加载系统配置:

    $ 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. 打开亚马逊 EC2 控制台,网址为https://console.aws.amazon.com/ec2/

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

  3. 选择创建安全组

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

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

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

    3. 对于 VPC,请选择包含您的网络服务器 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 R oute 53 开发者指南或您的 DNS 服务文档中的将流量路由到亚马逊 EC2实例

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

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

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

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

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

使用 OpenSSL s_client 验证 SSL/TLS 卸载
  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 R oute 53 开发者指南或您的 DNS 服务文档中的将流量路由到亚马逊 EC2实例

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

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

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