AWS CloudHSM Linux 上使用 NGINX 或 HAProxy 搭配 OpenSSL 提供者的 SSL/TLS 卸載 - AWS CloudHSM

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS CloudHSM Linux 上使用 NGINX 或 HAProxy 搭配 OpenSSL 提供者的 SSL/TLS 卸載

本主題提供step-by-step說明。 AWS CloudHSM HAProxy OpenSSL

概觀

在 Linux 上,NGINXHAProxy Web 伺服器軟體與 OpenSSL 整合以支援 HTTPS。AWS CloudHSM OpenSSL 提供者提供的界面可讓 Web 伺服器軟體使用叢集中的 HSMs 進行密碼編譯卸載和金鑰儲存。OpenSSL 提供者是將 Web 伺服器連接到 AWS CloudHSM 叢集的橋接器。

若要完成本教學課程,您將設定 NGINX 或 HAProxy 使用 AWS CloudHSM OpenSSL 提供者。本教學課程說明如何執行下列動作:

  • 在 Amazon EC2 執行個體上安裝 Web 伺服器軟體。

  • 將 Web 伺服器軟體設定為使用儲存在 AWS CloudHSM 叢集中的私有金鑰來支援 HTTPS。

  • (選用) 使用 Amazon EC2 建立第二個 Web 伺服器執行個體,并使用 Elastic Load Balancing 建立負載平衡器。使用負載平衡器可將負載分散到多部伺服器,進而提升效能。它也可以在一或多個伺服器失敗時提供備援和高可用性。

當您準備好開始時,請移至步驟 1:設定先決條件

步驟 1:設定先決條件

不同平台需要不同的先決條件。請使用下方符合您平台的先決條件區段。

AWS CloudHSM OpenSSL 提供者的先決條件

若要使用適用於用戶端 SDK 5 的 AWS CloudHSM OpenSSL 供應商設定 Web 伺服器 SSL/TLS 伺服器身分卸載,您需要下列項目:

  • 具有至少兩個硬體安全模組 (HSM) 的作用中 AWS CloudHSM 叢集

    注意

    您可以使用單一 HSM 叢集,但必須先停用用戶端金鑰耐久性。如需詳細資訊,請參閱管理用戶端金鑰耐久性設定用戶端 SDK 5 設定工具

  • 執行 Linux 作業系統的 Amazon EC2 執行個體,其中已安裝下列軟體:

    • Web 伺服器 (NGINX 或 HAProxy)

    • 用戶端 SDK 5 的 AWS CloudHSM OpenSSL 提供者

  • 加密使用者 (CU),擁有及管理 HSM 上 Web 伺服器的私有金鑰。

設定 Linux Web 伺服器執行個體,並在 HSM 上建立 CU
注意

此程序中的許多命令都需要更高的權限。視您的系統組態而定,您可能需要以 sudo或 做為根使用者來執行命令。

  1. 安裝和設定適用於用戶端 SDK 5 的 AWS CloudHSM OpenSSL 提供者。如需安裝 OpenSSL 提供者的詳細資訊,請參閱適用於AWS CloudHSM 用戶端 SDK 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 24.04
    • 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 叢集

  • 要連接到用戶端執行個體,可以使用 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> 取代為您的 crypto-user 的使用者名稱

    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 伺服器中為您提供 HTTPS 的簽名 SSL/TLS 憑證。

除了使用 CA 之外,您也可以使用 AWS CloudHSM OpenSSL 動態引擎來建立自我簽署憑證。自簽憑證不受瀏覽器所信任,請勿用於生產環境。可以用於測試環境。

警告

自簽憑證應該只用於測試環境。若為生產環境,請使用更安全的方法 (例如憑證授權單位) 來建立憑證。

安裝和設定 OpenSSL 動態引擎
  1. 連接至您的用戶端執行個體。

  2. 安裝適用於 AWS CloudHSM 用戶端 SDK 5 的 OpenSSL 動態引擎

產生憑證
  1. 取得先前步驟中產生的仿造的 PEM 檔案副本。

  2. 建立 CSR

    執行下列命令,使用 AWS CloudHSM OpenSSL 動態引擎來建立憑證簽署請求 (CSR)。以包含您仿造 PEM 私有金鑰的檔案名稱取代 <web_server_fake_pem.key>。以包含 CSR 的檔案名稱取代 <web_server.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 伺服器

更新 Web 伺服器軟體組態,以使用 HTTPS 憑證以及您在 上一個步驟中建立的對應仿造 PEM 私有金鑰。請記得在開始之前備份現有的憑證和金鑰。這將完成設定 Linux Web 伺服器軟體以進行 SSL/TLS 伺服器身分卸載 AWS CloudHSM。

完成以下其中一個區段中的步驟。

設定 NGINX Web 伺服器

使用本節以 OpenSSL 提供者設定 NGINX。

為 OpenSSL 提供者設定 NGINX
  1. 連接至您的用戶端執行個體。

  2. 執行以下命令,為 Web 伺服器憑證和仿造 PEM 私有金鑰建立所需的目錄。

    $ mkdir -p /etc/pki/nginx/private
  3. 執行以下命令,將您的 Web 伺服器憑證複製到所需的位置。以 Web 伺服器憑證的名稱取代 <web_server.crt>

    $ cp <web_server.crt> /etc/pki/nginx/server.crt
  4. 執行以下命令,將您的仿造 PEM 私有金鑰複製到所需的位置。以包含您仿造 PEM 私有金鑰的檔案名稱取代 <web_server_fake_pem.key>。

    $ 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 提供者的詳細資訊,請參閱適用於AWS CloudHSM 用戶端 SDK 5 的 OpenSSL 提供者

    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 Web 伺服器上支持最多 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 使用者名稱><密碼>。將 <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 使用者名稱><密碼>。將 <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 使用者名稱><密碼>。將 <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 使用者名稱><密碼>。將 <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。下列範例示範如何使用 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 登入資料取代 <CU 使用者名稱><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 連線。將此安全群組指派到您的 Web 伺服器。

建立 HTTPS 的安全群組並將其指派至您的 Web 伺服器
  1. 前往 https://console.aws.amazon.com/ec2/ 開啟 Amazon EC2 主控台。

  2. 在導覽窗格中選擇安全群組

  3. 選擇建立安全群組

  4. 對於 Create Security Group (建立安全群組),執行下列動作:

    1. 對於 Security group name (安全群組名稱),輸入您要建立之安全群組的名稱。

    2. (選用) 輸入您要建立之安全群組的描述。

    3. 對於 VPC,選擇包含 Web 伺服器 Amazon EC2 執行個體的 VPC。

    4. 選取 Add Rule (新增規則)

    5. 對於類型,從下拉式視窗中選取 HTTPS

    6. 對於來源,輸入來源位置。

    7. 選擇建立安全群組

  5. 在導覽窗格中,選擇執行個體

  6. 選取 Web 伺服器執行個體旁的核取方塊。

  7. 選取頁面頂端的動作下拉式選單。選取安全性,然後選取變更安全群組

  8. 對於關聯的安全群組,請選取搜尋方塊,然後選取您為 HTTPS 建立之安全群組。然後選擇新增安全群組

  9. 選取儲存

驗證 HTTPS 是否使用您已設定的憑證

將 Web 伺服器新增至安全群組後,您可以驗證 SSL/TLS 卸載是否使用您的自我簽署憑證。若要這樣做,您可以使用 Web 瀏覽器或使用 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/

    提示

    您可以使用 DNS 服務 (例如 Amazon Route 53),將網站的網域名稱 (例如,https://www.example.com/) 路由到 Web 伺服器。如需詳細資訊,請參閱《Amazon Route 53 開發人員指南》或 DNS 服務文件中的將流量路由到 Amazon EC2 執行個體

  2. 使用您的 Web 瀏覽器來檢視 Web 伺服器憑證。如需詳細資訊,請參閱下列內容:

    • 若為 Mozilla Firefox,請參閱 Mozilla 技術支援網站上的檢視憑證

    • 若為 Google Chrome,請參閱 Google Web 開發人員工具網站上的了解安全問題

    其他 Web 瀏覽器可能有類似的功能,可供您用來檢視 Web 伺服器憑證。

  3. 確保 SSL/TLS 憑證是您設定 Web 伺服器所要使用的憑證。

使用 OpenSSL s_client 來驗證 SSL/TLS 卸載
  1. 執行以下 OpenSSL 命令來使用 HTTPS 連接至 Web 伺服器。以 Web 伺服器的公有 DNS 名稱或 IP 地址來取代<伺服器名稱>

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

    您可以使用 DNS 服務 (例如 Amazon Route 53),將網站的網域名稱 (例如,https://www.example.com/) 路由到 Web 伺服器。如需詳細資訊,請參閱《Amazon Route 53 開發人員指南》或 DNS 服務文件中的將流量路由到 Amazon EC2 執行個體

  2. 確保 SSL/TLS 憑證是您設定 Web 伺服器所要使用的憑證。

您現在有透過 HTTPS 而受到保護的網站。Web 伺服器的私有金鑰會存放在 AWS CloudHSM 叢集的 HSM 中。

若要新增負載平衡器,請參閱 使用 Elastic Load Balancing for 新增負載平衡器 AWS CloudHSM(選用)