

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

# 将第三方应用程序与 AWS CloudHSM
<a name="third-party-applications"></a>

的一些[用例](use-cases.md) AWS CloudHSM 涉及将第三方软件应用程序与集群中的 HSM AWS CloudHSM 集成。通过将第三方软件与集成 AWS CloudHSM，您可以实现各种与安全相关的目标。以下主题介绍如何实现其中一些目标。

**Topics**
+ [SSL/TLS 分载](ssl-offload.md)
+ [Windows Server CA](third-ca-toplevel.md)
+ [Oracle Database 加密](oracle-tde.md)
+ [微软 SignTool](third-signtool-toplevel.md)
+ [Java Keytool 和 Jarsigner](third_java-sdk_integration.md)
+ [Microsoft 清单生成和编辑工具](third-magetool.md)
+ [其他第三方供应商集成](other-integrations.md)

# 通过 SSL/TLS 卸载来提高 Web 服务器的安全性 AWS CloudHSM
<a name="ssl-offload"></a>

Web 服务器及其客户端（Web 浏览器）可以使用安全套接字层（SSL） 或传输层安全性协议（TLS）来确认 Web 服务器的身份，并通过互联网建立发送和接收网页或其他数据的安全连接。这通常被称为 HTTPS。Web 服务器使用公私密钥对和 SSL/TLS 公钥证书与每个客户端建立 HTTPS 会话。此过程涉及大量的 Web 服务器计算，但您可以将其中一些计算卸载到 AWS CloudHSM 集群，这被称为 SSL 加速。卸载减轻了 Web 服务器的计算负担，并通过将服务器的私钥存储在中来提供额外的安全性。 HSMs

以下主题概述了使用 SSL/TLS 卸载 AWS CloudHSM 的工作原理，以及在以下平台 AWS CloudHSM 上设置 SSL/TLS 卸载的教程。

对于 **Linux**，在 [NGINX](https://nginx.org/en/) 或 [Apache HTTP 服务器](https://httpd.apache.org/) Web 服务器软件上使用 OpenSSL 动态引擎

**Windows** 使用 [Internet Information Services (IIS) for Windows Server](https://www.iis.net/) Web 服务器软件

**Topics**
+ [SSL/TLS 卸载的工作原理 AWS CloudHSM](ssl-offload-overview.md)
+ [AWS CloudHSM 使用 NGINX 在 Linux 上卸载 SSL/TLS 或者带有 OpenSSL 的 Apache](third-offload-linux-openssl.md)
+ [AWS CloudHSM 使用 NGINX 或 OpenSSL 提供程序在 Linux 上卸载 SSL/TLS HAProxy](third-offload-linux-openssl-provider.md)
+ [AWS CloudHSM 使用带有 JSSE 的 Tomcat 在 Linux 上卸载 SSL/TLS](third-offload-linux-jsse.md)
+ [AWS CloudHSM 使用 IIS 和 KSP 在 Windows 上卸载 SSL/TLS](ssl-offload-windows.md)
+ [使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM（可选）](third-offload-add-lb.md)

# SSL/TLS 卸载的工作原理 AWS CloudHSM
<a name="ssl-offload-overview"></a>

要建立 HTTPS 连接，您的 Web 服务器将执行与客户端的握手过程。作为此过程的一部分，服务器会将一些加密处理卸载到 AWS CloudHSM 群集HSMs 中，如下图所示。下图解释了此过程的每个步骤。

**注意**  
下面的图和过程假定 RSA 用于服务器验证和密钥交换。当使用的是 Diffie–Hellman 而不是 RSA 时，此过程稍有不同。

![\[客户端与服务器之间的 TLS 握手流程（包括至 HSM 的加密分载）的插图。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/ssl-offload-handshake-process.png)


1. 客户端将 hello 消息发送给服务器。

1. 服务器响应 hello 消息并发送服务器的证书。

1. 客户端将执行以下操作：

   1. 验证 SSL/TLS 服务器证书是否由客户端信任的根证书签名。

   1. 从服务器证书中提取公有密钥。

   1. 生成预主密钥并使用服务器的公有密钥将其加密。

   1. 将加密的预主密钥发送给服务器。

1. 为解密客户端的预主密钥，服务器会将此密钥发送给 HSM。HSM 使用 HSM 中的私有密钥解密此预主密钥，然后将预主密钥发送给服务器。客户端和服务器将独立使用此预主密钥和 hello 消息中的一些信息来计算主密钥。

1. 握手过程结束。在余下的会话中，客户端和服务器之间发送的所有消息将使用主密钥的派生密钥进行加密。

要了解如何使用配置 SSL/TLS 卸载 AWS CloudHSM，请参阅以下主题之一：
+ [AWS CloudHSM 使用 NGINX 在 Linux 上卸载 SSL/TLS 或者带有 OpenSSL 的 Apache](third-offload-linux-openssl.md)
+ [AWS CloudHSM 使用带有 JSSE 的 Tomcat 在 Linux 上卸载 SSL/TLS](third-offload-linux-jsse.md)
+ [AWS CloudHSM 使用 IIS 和 KSP 在 Windows 上卸载 SSL/TLS](ssl-offload-windows.md)

# AWS CloudHSM 使用 NGINX 在 Linux 上卸载 SSL/TLS 或者带有 OpenSSL 的 Apache
<a name="third-offload-linux-openssl"></a>

本主题提供在 Linux Web 服务器 AWS CloudHSM 上使用设置 SSL/TLS 卸载的 step-by-step说明。

**Topics**
+ [概述](#ssl-offload-linux-openssl-overview)
+ [步骤 1：设置先决条件](#ssl-offload-prerequisites)
+ [步骤 2：生成私钥和 SSL/TLS 证书](#ssl-offload-import-or-generate-private-key-and-certificate)
+ [步骤 3：配置 Web 服务器](#ssl-offload-configure-web-server)
+ [步骤 4：启用 HTTPS 流量并验证证书](#ssl-offload-enable-traffic-and-verify-certificate)

## 概述
<a name="ssl-offload-linux-openssl-overview"></a>

在 Linux 上，[NGINX](https://nginx.org/en/) 和 [Apache HTTP Server](https://httpd.apache.org/) Web 服务器软件与 [OpenSSL](https://www.openssl.org/) 集成以支持 HTTPS。[OpenSSL 的AWS CloudHSM 动态引擎](openssl-library.md)提供了一个接口，允许 Web 服务器软件使用集群 HSMs 中的进行加密卸载和密钥存储。OpenSSL 引擎是连接 Web 服务器与您的 AWS CloudHSM 群集的桥梁。

要完成本教程，您必须先选择在 Linux 上使用 NGINX 还是 Apache Web 服务器软件。然后，本教程将介绍如何执行以下操作：
+ 在 Amazon EC2 实例上安装 Web 服务器软件。
+ 使用存储在您的 AWS CloudHSM 集群中的私有密钥将 Web 服务器软件配置为支持 HTTPS。
+ （可选）使用 Amazon EC2 创建第二个 Web 服务器实例，并使用 Elastic Load Balancing 创建负载均衡器。使用负载均衡器可以在多台服务器中分配负载，从而提高性能。它还能在一台或多台服务器发生故障的情况下提供冗余和更高的可用性。

在您准备好开始使用后，请转到 [步骤 1：设置先决条件](#ssl-offload-prerequisites)。

## 步骤 1：设置先决条件
<a name="ssl-offload-prerequisites"></a>

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

### 客户端软件开发工具包 5 的先决条件
<a name="new-versions"></a>

要使用客户端 SDK 5 设置 Web 服务器 SSL/TLS 卸载，您需要满足以下条件：
+ 具有至少两个硬件安全模块 (HSM) 的活动 AWS CloudHSM 集群
**注意**  
您可以使用单个 HSM 集群，但您必须首先禁用客户端密钥持久性。有关更多信息，请参阅[管理客户端密钥持久性设置](working-client-sync.md#client-sync-sdk8)和[客户端软件开发工具包 5 配置工具](configure-sdk-5.md)。
+ 一个运行已安装以下软件的 Linux 操作系统的 Amazon EC2 实例：
  + Web 服务器（NGINX 或 Apache）
  + 使用适用于客户端软件开发工具包 5 的 OpenSSL 动态引擎
+ 一个[加密用户](understanding-users.md#crypto-user-chsm-cli)（CU），该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。

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

1. 为安装和配置 OpenSSL 动态引擎。 AWS CloudHSM有关安装 OpenSSL 动态引擎的更多信息，请参阅[适用于客户端软件开发工具包 5 的 OpenSSL 动态引擎](openssl5-install.md)。

1. 在可以访问您的集群的 EC2 Linux 实例上，安装 NGINX 或 Apache Web 服务器：

------
#### [ Amazon Linux 2 ]
   + 有关如何在 Amazon Linux 2 上下载最新版本的 NGINX 的信息，请访问 [NGINX 网站](https://nginx.org/en/linux_packages.html)。

     适用于 Amazon Linux 2 最新版本的 NGINX 所使用的 OpenSSL 版本比 OpenSSL 的系统版本更新。安装 NGINX 后，你需要创建一个从 OpenSSL 动态引擎库到这个版本的 AWS CloudHSM OpenSSL 所期望的位置的符号链接 

     ```
     $ sudo ln -sf /opt/cloudhsm/lib/libcloudhsm_openssl_engine.so /usr/lib64/engines-1.1/cloudhsm.so
     ```
   + Apache

     ```
     $ sudo yum install httpd mod_ssl
     ```

------
#### [ Amazon Linux 2023 ]
   + NGINX

     ```
     $ sudo yum install nginx
     ```
   + Apache

     ```
     $ sudo yum install httpd mod_ssl
     ```

------
#### [ Red Hat 8 ]
   + NGINX

     ```
     $ sudo yum install nginx
     ```
   + Apache

     ```
     $ sudo yum install httpd mod_ssl
     ```

------
#### [ Red Hat 9 ]
   + NGINX

     ```
     $ sudo yum install nginx
     ```
   + Apache

     ```
     $ sudo yum install httpd mod_ssl
     ```

------
#### [ Ubuntu 22.04 ]
   + NGINX

     ```
     $ sudo apt install nginx
     ```
   + Apache

     ```
     $ sudo apt install apache2
     ```

------
#### [ Ubuntu 24.04 ]
   + NGINX

     ```
     $ sudo apt install nginx
     ```
   + Apache

     ```
     $ sudo apt install apache2
     ```

------

1. 使用 CloudHSM CLI 创建[加密用户](understanding-users.md#crypto-user-chsm-cli)。有关管理 HSM 用户的更多信息，请参阅[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)。
**提示**  
跟踪 CU 用户名和密码。您稍后为 Web 服务器生成或导入 HTTPS 私有密钥和证书时需要它们。

完成这些步骤后，请转到 [步骤 2：生成私钥和 SSL/TLS 证书](#ssl-offload-import-or-generate-private-key-and-certificate)。

#### 注意
<a name="note-ssl5-pre"></a>
+ 要使用安全增强型 Linux (SELinux) 和 Web 服务器，必须允许端口 2223 上的出站 TCP 连接，该端口是 Client SDK 5 用来与 HSM 通信的端口。
+ 要创建和激活集群并授予 EC2 实例访问该集群的权限，请完成[入门 AWS CloudHSM](getting-started.md)的步骤。入门 step-by-step指南提供了使用一个 HSM 和 Amazon EC2 客户端实例创建活动集群的说明。您可使用此客户端实例作为您的 Web 服务器。
+ 为避免禁用客户端密钥持久性，请向集群添加多个 HSM。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。
+ 要连接到客户端实例，可以使用 SSH 或 PuTTY。有关更多信息，请参阅 Amazon EC2 文档中的[使用 SSH 连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)或[使用 PuTTY 从 Windows 连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)。

## 步骤 2：生成私钥和 SSL/TLS 证书
<a name="ssl-offload-import-or-generate-private-key-and-certificate"></a>

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

### 生成私有密钥和证书
<a name="ssl-offload-generate-private-key-and-certificate"></a>

#### 生成私有密钥
<a name="ssl-offload-generate-private-key"></a>

本节显示了如何使用 [CloudHSM CLI](cloudhsm_cli.md) 生成密钥对。在 HSM 中生成密钥对后，即可将其导出为伪造 PEM 文件，并生成相应的证书。<a name="ssl-offload-generate-private-key-prerequisites"></a>

**安装和配置 CloudHSM CLI**

1. [安装和配置](cloudhsm_cli-getting-started.md) CloudHSM CLI。

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

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

1. 运行以下命令登录 HSM。*<user name>*替换为您的加密用户的用户名

   ```
   Command: login --username <user name> --role crypto-user
   ```

**生成私有密钥**

根据您的使用案例，您可以生成 RSA 或 EC 密钥对。请执行以下操作之一：
+ 在 HSM 上生成 RSA 私有密钥

  使用 [`key generate-asymmetric-pair rsa`](cloudhsm_cli-key-generate-asymmetric-pair-rsa.md) 命令生成 RSA 密钥对。此示例生成一个 RSA 密钥对，其模数为 2048，公钥指数为 65537，公钥标签为，私钥标签为。*tls\$1rsa\$1pub* *tls\$1rsa\$1private*

  ```
  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": "0xb1d27e857a876f4e9fd5de748a763c539b359f937eb4b4260e30d1435485a732c878cdad9c72538e2215351b1d41358c9bf80b599c
  73a80fdb457aa7b20cd61e486c326e2cfd5e124a7f6a996437437812b542e3caf85928aa866f0298580f7967ee6aa01440297d7308fdd9b76b70d1b67f12634d
  f6e6296d6c116d5744c6d60d14d3bf3cb978fe6b75ac67b7089bafd50d8687213b31abc7dc1bad422780d29c851d5102b56f932551eaf52a9591fd8c43d81ecc
  133022653225bd129f8491101725e9ea33e1ded83fb57af35f847e532eb30cd7e726f23910d2671c6364092e834697ec3cef72cc23615a1ba7c5e100156ae0ac
  ac3160f0ca9725d38318b7",
          "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`](cloudhsm_cli-key-generate-asymmetric-pair-ec.md) 命令生成 EC 密钥对。此示例生成一个 EC 密钥对，其`prime256v1`曲线为（对应于`NID_X9_62_prime256v1`曲线），公钥标签为*tls\$1ec\$1pub*，私钥标签为*tls\$1ec\$1private*。

  ```
  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`](cloudhsm_cli-key-generate-file.md) 命令以伪造 PEM 格式导出私有密钥并将其保存到文件。将以下值替换为您自己的值。
+ *<private\$1key\$1label>*— 您在上一步中生成的私钥的标签。
+ *<web\$1server\$1fake\$1pem.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\$1server\$1fake\$1pem.key>*中指定的路径上。此文件是假 PEM 私有密钥文件。

#### 生成自签名证书
<a name="ssl-offload-generate-certificate"></a>

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

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

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

**警告**  
自签名证书只应在测试环境中使用。对于生产环境，请使用更安全的方法 (如证书颁发机构) 来创建证书。<a name="ssl-offload-generate-certificate-prerequisites"></a>

**安装和配置 OpenSSL 动态引擎**

1. 连接到您的客户端实例。

1. [安装适用于 AWS CloudHSM 客户端 SDK 的 OpenSSL 动态引擎 5](openssl5-install.md)<a name="ssl-offload-generate-certificate-steps"></a>

**生成证书**

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

1. 创建 CSR

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

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

   ```
   $ openssl req -engine cloudhsm -new -key <web_server_fake_pem.key> -out <web_server.csr>
   ```

1. 创建自签名证书

   运行以下命令，使用 AWS CloudHSM OpenSSL 动态引擎在 HSM 上使用私钥签署您的 CSR。这会创建自签名证书。将命令中的以下值替换为您自己的值。
   + *<web\$1server.csr>*— 包含 CSR 的文件的名称。
   + *<web\$1server\$1fake\$1pem.key>*— 包含虚假 PEM 私钥的文件的名称。
   + *<web\$1server.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 服务器](#ssl-offload-configure-web-server)。

## 步骤 3：配置 Web 服务器
<a name="ssl-offload-configure-web-server"></a>

更新您的网络服务器软件的配置以使用 HTTPS 证书以及在[上一步](#ssl-offload-import-or-generate-private-key-and-certificate)中创建的相应伪造 PEM 私有密钥。切记在开始前备份您现有的证书。这将完成您的 Linux Web 服务器软件的设置以进行 SSL/TLS 卸载。 AWS CloudHSM

完成下述步骤之一。

**Topics**
+ [配置 NGINX网络服务器](#ssl-offload-nginx)
+ [配置 Apache 网络服务器](#ssl-offload-apache)

### 配置 NGINX网络服务器
<a name="ssl-offload-nginx"></a>

使用此部分在支持的平台上配置 NGINX。<a name="update-web-server-config-nginx"></a>

**更新 NGINX 的网络服务器配置**

1. 连接到您的客户端实例。

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

   ```
   $ sudo mkdir -p /etc/pki/nginx/private
   ```

1. 运行以下命令以将您的网络服务器证书复制到所需位置。*<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

   ```
   $ sudo cp <web_server.crt> /etc/pki/nginx/server.crt
   ```

1. 运行以下命令以将您的伪造 PEM 私有密钥复制到所需位置。*<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/pki/nginx/private/server.key
   ```

1. 运行以下命令更改文件所有权，以便名为 *nginx* 的用户可读取它们。

   ```
   $ sudo chown nginx /etc/pki/nginx/server.crt /etc/pki/nginx/private/server.key
   ```

1. 运行以下命令可备份 `/etc/nginx/nginx.conf` 文件。

   ```
   $ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
   ```

1. 更新 NGINX 的配置。
**注意**  
每个集群最多可在所有 NGINX 网络服务器上支持 1000 NGINX 工作进程。

------
#### [ Amazon Linux 2 ]

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

   ```
   ssl_engine cloudhsm;
   env CLOUDHSM_PIN;
   ```

   然后将以下内容添加至文件的 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
       # 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;
       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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA";
       ssl_prefer_server_ciphers on;
   
       # 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 {
       }
   }
   ```

------
#### [ Amazon Linux 2023 ]

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

   ```
   ssl_engine cloudhsm;
   env CLOUDHSM_PIN;
   ```

   然后将以下内容添加至文件的 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
       # 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;
       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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA";
       ssl_prefer_server_ciphers on;
   
       # 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 {
       }
   }
   ```

------
#### [ Red Hat 8 ]

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

   ```
   ssl_engine cloudhsm;
   env CLOUDHSM_PIN;
   ```

   然后将以下内容添加至文件的 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
       # 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA";
       ssl_prefer_server_ciphers on;
   
       # 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 {
       }
   }
   ```

------
#### [ Red Hat 9 ]

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

   ```
   ssl_engine cloudhsm;
   env CLOUDHSM_PIN;
   ```

   然后将以下内容添加至文件的 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
       # 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA";
       ssl_prefer_server_ciphers on;
   
       # 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 22.04 LTS ]

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

   ```
   ssl_engine cloudhsm;
   env CLOUDHSM_PIN;
   ```

   然后将以下内容添加至文件的 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
       # 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA";
       ssl_prefer_server_ciphers on;
   
       # 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 LTS ]

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

   ```
   ssl_engine cloudhsm;
   env CLOUDHSM_PIN;
   ```

   然后将以下内容添加至文件的 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
       # 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA";
       ssl_prefer_server_ciphers on;
   
       # 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 {
       }
   }
   ```

------

   保存该文件。

1. 备份 `systemd` 配置文件，然后设置 `EnvironmentFile` 路径。

------
#### [ Amazon Linux 2 ]

   1.  备份 `nginx.service` 文件。

      ```
      $ sudo cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1.  用文本编辑器打开 `/lib/systemd/system/nginx.service` 文件，然后在 [Service] 部分下添加下列路径：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ Amazon Linux 2023 ]

   1.  备份 `nginx.service` 文件。

      ```
      $ sudo cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1.  在文本编辑器中打开`/lib/systemd/system/nginx.service`文件。然后在 [服务] 部分下，添加以下路径：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ Red Hat 8 ]

   1.  备份 `nginx.service` 文件。

      ```
      $ sudo cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1.  用文本编辑器打开 `/lib/systemd/system/nginx.service` 文件，然后在 [Service] 部分下添加下列路径：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ Red Hat 9 ]

   1.  备份 `nginx.service` 文件。

      ```
      $ sudo cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1.  用文本编辑器打开 `/lib/systemd/system/nginx.service` 文件，然后在 [Service] 部分下添加下列路径：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ Ubuntu 22.04 LTS ]

   1.  备份 `nginx.service` 文件。

      ```
      $ sudo cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1.  用文本编辑器打开 `/lib/systemd/system/nginx.service` 文件，然后在 [Service] 部分下添加下列路径：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ Ubuntu 24.04 LTS ]

   1.  备份 `nginx.service` 文件。

      ```
      $ sudo cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1.  用文本编辑器打开 `/lib/systemd/system/nginx.service` 文件，然后在 [Service] 部分下添加下列路径：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------

1.  检查 `/etc/sysconfig/nginx` 文件是否存在，然后执行下列操作之一：
   + 如果文件存在，请通过运行以下命令备份文件：

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

1. 配置 NGINX 环境。
**注意**  
客户端软件开发工具包 5 引入了用于存储 CU 凭证的 `CLOUDHSM_PIN` 环境变量。

------
#### [ Amazon Linux 2 ]

   在文本编辑器中打开 `/etc/sysconfig/nginx` 文件。这需要 Linux 根权限。添加加密用户 (CU) 凭证：

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

    保存该文件。

------
#### [ Amazon Linux 2023 ]

   在文本编辑器中打开 `/etc/sysconfig/nginx` 文件。这需要 Linux 根权限。添加加密用户 (CU) 凭证：

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

    保存该文件。

------
#### [ Red Hat 8 ]

   在文本编辑器中打开 `/etc/sysconfig/nginx` 文件。这需要 Linux 根权限。添加加密用户 (CU) 凭证：

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

    保存该文件。

------
#### [ Red Hat 9 ]

   在文本编辑器中打开 `/etc/sysconfig/nginx` 文件。这需要 Linux 根权限。添加加密用户 (CU) 凭证：

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

    保存该文件。

------
#### [ Ubuntu 22.04 LTS ]

   在文本编辑器中打开 `/etc/sysconfig/nginx` 文件。这需要 Linux 根权限。添加加密用户 (CU) 凭证：

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

    保存该文件。

------
#### [ Ubuntu 24.04 LTS ]

   在文本编辑器中打开 `/etc/sysconfig/nginx` 文件。这需要 Linux 根权限。添加加密用户 (CU) 凭证：

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

    保存该文件。

------

1. 启动 NGINX网络服务器。

------
#### [ Amazon Linux 2 ]

   停止任何运行中的 NGINX 进程

   ```
   $ sudo systemctl stop nginx
   ```

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

   ```
   $ sudo systemctl daemon-reload
   ```

   启动 NGINX 进程

   ```
   $ sudo systemctl start nginx
   ```

------
#### [ Amazon Linux 2023 ]

   停止所有 NGINX 进程

   ```
   $ sudo systemctl stop nginx
   ```

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

   ```
   $ sudo systemctl daemon-reload
   ```

   启动 NGINX

   ```
   $ sudo systemctl start nginx
   ```

------
#### [ Red Hat 8 ]

   停止任何运行中的 NGINX 进程

   ```
   $ sudo systemctl stop nginx
   ```

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

   ```
   $ sudo systemctl daemon-reload
   ```

   启动 NGINX 进程

   ```
   $ sudo systemctl start nginx
   ```

------
#### [ Red Hat 9 ]

   停止任何运行中的 NGINX 进程

   ```
   $ sudo systemctl stop nginx
   ```

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

   ```
   $ sudo systemctl daemon-reload
   ```

   启动 NGINX 进程

   ```
   $ sudo systemctl start nginx
   ```

------
#### [ Ubuntu 22.04 LTS ]

   停止任何运行中的 NGINX 进程

   ```
   $ sudo systemctl stop nginx
   ```

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

   ```
   $ sudo systemctl daemon-reload
   ```

   启动 NGINX 进程

   ```
   $ sudo systemctl start nginx
   ```

------
#### [ Ubuntu 24.04 LTS ]

   停止任何运行中的 NGINX 进程

   ```
   $ sudo systemctl stop nginx
   ```

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

   ```
   $ sudo systemctl daemon-reload
   ```

   启动 NGINX 进程

   ```
   $ sudo systemctl start nginx
   ```

------

1. （可选）将您的平台配置为在开启时启动 NGINX。

------
#### [ Amazon Linux 2 ]

   ```
   $ sudo systemctl enable nginx
   ```

------
#### [ Amazon Linux 2023 ]

   ```
   $ sudo systemctl enable nginx
   ```

------
#### [ Red Hat 8 ]

   ```
   $ sudo systemctl enable nginx
   ```

------
#### [ Red Hat 9 ]

   ```
   $ sudo systemctl enable nginx
   ```

------
#### [ Ubuntu 22.04 LTS ]

   ```
   $ sudo systemctl enable nginx
   ```

------
#### [ Ubuntu 24.04 LTS ]

   ```
   $ sudo systemctl enable nginx
   ```

------

在更新您的网络服务器配置后，转到[步骤 4：启用 HTTPS 流量并验证证书](#ssl-offload-enable-traffic-and-verify-certificate)。

### 配置 Apache 网络服务器
<a name="ssl-offload-apache"></a>

 使用此部分在支持的平台上配置 Apache。<a name="update-web-server-config-apache"></a>

**更新 Apache 的网络服务器配置**

1. 连接到您的 Amazon EC2 客户端实例。

1. 为您的平台定义默认的凭证和私钥位置。

------
#### [ Amazon Linux 2 ]

   在 `/etc/httpd/conf.d/ssl.conf` 文件中，确保存在以下值：

   ```
   SSLCertificateFile      /etc/pki/tls/certs/localhost.crt
   SSLCertificateKeyFile   /etc/pki/tls/private/localhost.key
   ```

------
#### [ Amazon Linux 2023 ]

   在`/etc/httpd/conf.d/ssl.conf`文件中。确保这些值存在：

   ```
   SSLCertificateFile      /etc/pki/tls/certs/localhost.crt
   SSLCertificateKeyFile   /etc/pki/tls/private/localhost.key
   ```

------
#### [ Red Hat 8 ]

   在 `/etc/httpd/conf.d/ssl.conf` 文件中，确保存在以下值：

   ```
   SSLCertificateFile      /etc/pki/tls/certs/localhost.crt
   SSLCertificateKeyFile   /etc/pki/tls/private/localhost.key
   ```

------
#### [ Red Hat 9 ]

   在 `/etc/httpd/conf.d/ssl.conf` 文件中，确保存在以下值：

   ```
   SSLCertificateFile      /etc/pki/tls/certs/localhost.crt
   SSLCertificateKeyFile   /etc/pki/tls/private/localhost.key
   ```

------
#### [ Ubuntu 22.04 LTS ]

   在 `/etc/apache2/sites-available/default-ssl.conf` 文件中，确保存在以下值：

   ```
   SSLCertificateFile      /etc/ssl/certs/localhost.crt
   SSLCertificateKeyFile   /etc/ssl/private/localhost.key
   ```

------
#### [ Ubuntu 24.04 LTS ]

   在 `/etc/apache2/sites-available/default-ssl.conf` 文件中，确保存在以下值：

   ```
   SSLCertificateFile      /etc/ssl/certs/localhost.crt
   SSLCertificateKeyFile   /etc/ssl/private/localhost.key
   ```

------

1. 将您的网络服务器证书复制到平台所需位置。

------
#### [ Amazon Linux 2 ]

   ```
   $ sudo cp <web_server.crt> /etc/pki/tls/certs/localhost.crt
   ```

   *<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

------
#### [ Amazon Linux 2023 ]

   ```
   $ sudo cp <web_server.crt> /etc/pki/tls/certs/localhost.crt
   ```

   *<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

------
#### [ Red Hat 8 ]

   ```
   $ sudo cp <web_server.crt> /etc/pki/tls/certs/localhost.crt
   ```

   *<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

------
#### [ Red Hat 9 ]

   ```
   $ sudo cp <web_server.crt> /etc/pki/tls/certs/localhost.crt
   ```

   *<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

------
#### [ Ubuntu 22.04 LTS ]

   ```
   $ sudo cp <web_server.crt> /etc/ssl/certs/localhost.crt
   ```

   *<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

------
#### [ Ubuntu 24.04 LTS ]

   ```
   $ sudo cp <web_server.crt> /etc/ssl/certs/localhost.crt
   ```

   *<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

------

1. 将您的虚设 PEM 私钥复制到平台所需的位置。

------
#### [ Amazon Linux 2 ]

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/pki/tls/private/localhost.key
   ```

   *<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

------
#### [ Amazon Linux 2023 ]

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/pki/tls/private/localhost.key
   ```

   *<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

------
#### [ Red Hat 8 ]

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/pki/tls/private/localhost.key
   ```

   *<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

------
#### [ Red Hat 9 ]

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/pki/tls/private/localhost.key
   ```

   *<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

------
#### [ Ubuntu 22.04 LTS ]

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/ssl/private/localhost.key
   ```

   *<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

------
#### [ Ubuntu 24.04 LTS ]

   ```
   $ sudo cp <web_server_fake_pem.key> /etc/ssl/private/localhost.key
   ```

   *<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

------

1. 如果您的平台需要，可以更改该文件的所有权。

------
#### [ Amazon Linux 2 ]

   ```
   $ sudo chown apache /etc/pki/tls/certs/localhost.crt /etc/pki/tls/private/localhost.key
   ```

   为名为*apache* 的用户提供读取权限。

------
#### [ Amazon Linux 2023 ]

   ```
   $ sudo chown apache /etc/pki/tls/certs/localhost.crt /etc/pki/tls/private/localhost.key
   ```

   为名为*apache* 的用户提供读取权限。

------
#### [ Red Hat 8 ]

   ```
   $ sudo chown apache /etc/pki/tls/certs/localhost.crt /etc/pki/tls/private/localhost.key
   ```

   为名为*apache* 的用户提供读取权限。

------
#### [ Red Hat 9 ]

   ```
   $ sudo chown apache /etc/pki/tls/certs/localhost.crt /etc/pki/tls/private/localhost.key
   ```

   为名为*apache* 的用户提供读取权限。

------
#### [ Ubuntu 22.04 LTS ]

   无需操作。

------
#### [ Ubuntu 24.04 LTS ]

   无需操作。

------

1. 为您的平台配置 Apache 指令。

------
#### [ Amazon Linux 2 ]

   找到此平台的 SSL 文件：

   ```
   /etc/httpd/conf.d/ssl.conf
   ```

   此文件包含定义服务器运行方式的 Apache 指令。指令在左侧显示，后面跟值。使用文本编辑器编辑此文件。这需要 Linux 根权限。

   通过这些值更新或输入以下指令：

   ```
   SSLCryptoDevice cloudhsm
   SSLCipherSuite 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA
   ```

   保存该文件。

------
#### [ Amazon Linux 2023 ]

   找到此平台的 SSL 文件：

   ```
   /etc/httpd/conf.d/ssl.conf
   ```

   此文件包含定义服务器运行方式的 Apache 指令。指令在左侧显示，后面跟值。使用文本编辑器编辑此文件。这需要 Linux 根权限。

   通过这些值更新或输入以下指令：

   ```
   SSLCryptoDevice cloudhsm
   SSLCipherSuite 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA
   ```

   保存该文件。

------
#### [ Red Hat 8 ]

   找到此平台的 SSL 文件：

   ```
   /etc/httpd/conf.d/ssl.conf
   ```

   此文件包含定义服务器运行方式的 Apache 指令。指令在左侧显示，后面跟值。使用文本编辑器编辑此文件。这需要 Linux 根权限。

   通过这些值更新或输入以下指令：

   ```
   SSLCryptoDevice cloudhsm
   SSLProtocol TLSv1.2 TLSv1.3
   SSLCipherSuite 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA
   SSLProxyCipherSuite HIGH:!aNULL
   ```

   保存该文件。

------
#### [ Red Hat 9 ]

   找到此平台的 SSL 文件：

   ```
   /etc/httpd/conf.d/ssl.conf
   ```

   此文件包含定义服务器运行方式的 Apache 指令。指令在左侧显示，后面跟值。使用文本编辑器编辑此文件。这需要 Linux 根权限。

   通过这些值更新或输入以下指令：

   ```
   SSLCryptoDevice cloudhsm
   SSLProtocol TLSv1.2 TLSv1.3
   SSLCipherSuite 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA
   SSLProxyCipherSuite HIGH:!aNULL
   ```

   保存该文件。

------
#### [ Ubuntu 22.04 LTS ]

   找到此平台的 SSL 文件：

   ```
   /etc/apache2/mods-available/ssl.conf
   ```

   此文件包含定义服务器运行方式的 Apache 指令。指令在左侧显示，后面跟值。使用文本编辑器编辑此文件。这需要 Linux 根权限。

   通过这些值更新或输入以下指令：

   ```
   SSLCryptoDevice cloudhsm
   SSLCipherSuite 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA
   SSLProtocol TLSv1.2 TLSv1.3
   ```

   保存该文件。

   启用 SSL 模块以及默认 SSL 站点配置：

   ```
   $ sudo a2enmod ssl
   $ sudo a2ensite default-ssl
   ```

------
#### [ Ubuntu 24.04 LTS ]

   找到此平台的 SSL 文件：

   ```
   /etc/apache2/mods-available/ssl.conf
   ```

   此文件包含定义服务器运行方式的 Apache 指令。指令在左侧显示，后面跟值。使用文本编辑器编辑此文件。这需要 Linux 根权限。

   通过这些值更新或输入以下指令：

   ```
   SSLCryptoDevice cloudhsm
   SSLCipherSuite 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:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA
   SSLProtocol TLSv1.2 TLSv1.3
   ```

   保存该文件。

   启用 SSL 模块以及默认 SSL 站点配置：

   ```
   $ sudo a2enmod ssl
   $ sudo a2ensite default-ssl
   ```

------

1. 为您的平台配置环境值文件。

------
#### [ Amazon Linux 2 ]

    打开 httpd 服务文件：

   ```
   /lib/systemd/system/httpd.service
   ```

    在 `[Service]` 部分添加以下内容：

   ```
   EnvironmentFile=/etc/sysconfig/httpd
   ```

------
#### [ Amazon Linux 2023 ]

    打开 httpd 服务文件：

   ```
   /lib/systemd/system/httpd.service
   ```

    在 `[Service]` 部分添加以下内容：

   ```
   EnvironmentFile=/etc/sysconfig/httpd
   ```

------
#### [ Red Hat 8 ]

    打开 httpd 服务文件：

   ```
   /lib/systemd/system/httpd.service
   ```

    在 `[Service]` 部分添加以下内容：

   ```
   EnvironmentFile=/etc/sysconfig/httpd
   ```

------
#### [ Red Hat 9 ]

    打开 httpd 服务文件：

   ```
   /lib/systemd/system/httpd.service
   ```

    在 `[Service]` 部分添加以下内容：

   ```
   EnvironmentFile=/etc/sysconfig/httpd
   ```

------
#### [ Ubuntu 22.04 LTS ]

   无需操作。环境价值被纳入 `/etc/sysconfig/httpd`

------
#### [ Ubuntu 24.04 LTS ]

   无需操作。环境价值被纳入 `/etc/sysconfig/httpd`

------

1. 在存储平台环境变量的文件中，设置一个包含加密用户 (CU) 凭证的环境变量：

------
#### [ Amazon Linux 2 ]

   使用文本编辑器编辑 `/etc/sysconfig/httpd`。

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

------
#### [ Amazon Linux 2023 ]

   使用文本编辑器编辑 `/etc/sysconfig/httpd`。

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

------
#### [ Red Hat 8 ]

   使用文本编辑器编辑 `/etc/sysconfig/httpd`。

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

**注意**  
客户端软件开发工具包 5 引入了用于存储 CU 凭证的 `CLOUDHSM_PIN` 环境变量。

------
#### [ Red Hat 9 ]

   使用文本编辑器编辑 `/etc/sysconfig/httpd`。

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

   用 CU 凭证替换*<CU user name>*和*<password>*。

**注意**  
客户端软件开发工具包 5 引入了用于存储 CU 凭证的 `CLOUDHSM_PIN` 环境变量。

------
#### [ Ubuntu 22.04 LTS ]

   使用文本编辑器编辑 `/etc/apache2/envvars`。

   ```
   export CLOUDHSM_PIN=<CU user name>:<password>
   ```

   用 CU 凭证替换*<CU user name>*和*<password>*。

**注意**  
客户端软件开发工具包 5 引入了用于存储 CU 凭证的 `CLOUDHSM_PIN` 环境变量。在客户端软件开发工具包 3 中，您将 CU 凭据存储在 `n3fips_password` 环境变量中。客户端软件开发工具包 5 支持这两个环境变量，但我们建议使用 `CLOUDHSM_PIN`。

------
#### [ Ubuntu 24.04 LTS ]

   使用文本编辑器编辑 `/etc/apache2/envvars`。

   ```
   export CLOUDHSM_PIN=<CU user name>:<password>
   ```

   用 CU 凭证替换*<CU user name>*和*<password>*。

**注意**  
客户端软件开发工具包 5 引入了用于存储 CU 凭证的 `CLOUDHSM_PIN` 环境变量。在客户端软件开发工具包 3 中，您将 CU 凭据存储在 `n3fips_password` 环境变量中。客户端软件开发工具包 5 支持这两个环境变量，但我们建议使用 `CLOUDHSM_PIN`。

------

1. 启动 Apache网络服务器。

------
#### [ Amazon Linux 2 ]

   ```
   $ sudo systemctl daemon-reload
   $ sudo service httpd start
   ```

------
#### [ Amazon Linux 2023 ]

   ```
   $ sudo systemctl daemon-reload
   $ sudo service httpd start
   ```

------
#### [ Red Hat 8 ]

   ```
   $ sudo systemctl daemon-reload
   $ sudo service httpd start
   ```

------
#### [ Red Hat 9 ]

   ```
   $ sudo systemctl daemon-reload
   $ sudo service httpd start
   ```

------
#### [ Ubuntu 22.04 LTS ]

   ```
   $ sudo service apache2 start
   ```

------
#### [ Ubuntu 24.04 LTS ]

   ```
   $ sudo service apache2 start
   ```

------

1. （可选）将您的平台配置为在开启时启动 Apache。

------
#### [ Amazon Linux 2 ]

   ```
   $ sudo chkconfig httpd on
   ```

------
#### [ Amazon Linux 2023 ]

   ```
   $ sudo chkconfig httpd on
   ```

------
#### [ Red Hat 8 ]

   ```
   $ systemctl enable httpd
   ```

------
#### [ Red Hat 9 ]

   ```
   $ systemctl enable httpd
   ```

------
#### [ Ubuntu 22.04 LTS ]

   ```
   $ sudo systemctl enable apache2
   ```

------
#### [ Ubuntu 24.04 LTS ]

   ```
   $ sudo systemctl enable apache2
   ```

------

在更新您的网络服务器配置后，转到 [步骤 4：启用 HTTPS 流量并验证证书](#ssl-offload-enable-traffic-and-verify-certificate)。

## 步骤 4：启用 HTTPS 流量并验证证书
<a name="ssl-offload-enable-traffic-and-verify-certificate"></a>

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

**Topics**
+ [启用入站 HTTPS 连接](#ssl-offload-add-security-group-linux)
+ [验证 HTTPS 使用的是您已配置的证书](#ssl-offload-verify-https-connection-linux-enable)

### 启用入站 HTTPS 连接
<a name="ssl-offload-add-security-group-linux"></a>

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

**为 HTTPS 创建安全组并将其分配给您的网络服务器**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**安全组**。

1. 选择**创建安全组**。

1. 对于**创建安全组**，执行以下操作：

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

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

   1. 对于 **VPC**，选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。

   1. 选择**添加规则**。

   1. 对于**类型**，从下拉窗口中选择 **HTTPS**。

   1. 对于**来源**，输入来源位置。

   1. 选择**创建安全组**。

1. 在导航窗格中，选择**实例**。

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

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

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

1. 选择**保存**。

### 验证 HTTPS 使用的是您已配置的证书
<a name="ssl-offload-verify-https-connection-linux-enable"></a>

将 Web 服务器添加到安全组后，您可以验证 SSL/TLS 卸载是否使用您的自签名证书。您可以使用网络浏览器或使用工具 (如 [OpenSSL s\$1client](https://www.openssl.org/docs/manmaster/man1/s_client.html)) 执行此操作。

**使用 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 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

1. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息，请参阅下列内容：
   + 对于 Mozilla Firefox，请参阅 Mozilla Support 网站上的[查看证书](https://support.mozilla.org/en-US/kb/secure-website-certificate#w_view-a-certificate)。
   + 关于 Google Chrome 浏览器，请参阅 Google Tools for Web Developers 网站上的[了解安全问题](https://developers.google.com/web/tools/chrome-devtools/security)。

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

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

**使用 OpenSSL s\$1client 验证 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 Route 53 开发人员指南》*或 DNS 服务文档中的[将流量路由到 Amazon EC2 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

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

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

若要添加负载均衡器，请参阅 [使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM（可选）](third-offload-add-lb.md)。

# AWS CloudHSM 使用 NGINX 或 OpenSSL 提供程序在 Linux 上卸载 SSL/TLS HAProxy
<a name="third-offload-linux-openssl-provider"></a>

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

**Topics**
+ [概述](#ssl-offload-linux-openssl-provider-overview)
+ [步骤 1：设置先决条件](#ssl-offload-provider-prerequisites)
+ [第 2 步：生成或导入私钥并获取证书](#ssl-offload-provider-generate-key-and-certificate)
+ [步骤 3：配置 Web 服务器](#ssl-offload-provider-configure-web-server)
+ [步骤 4：启用 HTTPS 流量并验证证书](#ssl-offload-enable-traffic-and-verify-certificate-provider)

## 概述
<a name="ssl-offload-linux-openssl-provider-overview"></a>

在 Linux 上，[NGINX](https://nginx.org/en/) 和 [HAProxy](https://www.haproxy.org/)Web 服务器软件与 Op [enSS](https://www.openssl.org/) L 集成以支持 HTTPS。[AWS CloudHSM OpenSSL 提供程序](openssl-provider-library.md)提供了一个接口，允许 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：设置先决条件](#ssl-offload-provider-prerequisites)。

## 步骤 1：设置先决条件
<a name="ssl-offload-provider-prerequisites"></a>

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

### AWS CloudHSM OpenSSL 提供程序的先决条件
<a name="provider-new-versions"></a>

要使用适用于客户端 SDK 5 的 Open AWS CloudHSM SSL 提供程序设置 Web SSL/TLS 服务器身份卸载，您需要满足以下条件：
+ 具有至少两个硬件安全模块 (HSM) 的活动 AWS CloudHSM 集群
**注意**  
您可以使用单个 HSM 集群，但您必须首先禁用客户端密钥持久性。有关更多信息，请参阅[管理客户端密钥持久性设置](working-client-sync.md#client-sync-sdk8)和[客户端软件开发工具包 5 配置工具](configure-sdk-5.md)。
+ 一个运行已安装以下软件的 Linux 操作系统的 Amazon EC2 实例：
  + 网络服务器（NGINX 或） HAProxy
  + 适用于客户端 SD AWS CloudHSM K 的 OpenSSL 提供商 5
+ 一个[加密用户](understanding-users.md#crypto-user-chsm-cli)（CU），该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。

**在 HSM 上设置 Linux Web 服务器实例并创建 CU**
**注意**  
此过程中的许多命令都需要更高的权限。根据您的系统配置，您可能需要使用root用户`sudo`或以root用户身份运行命令。

1. 安装和配置适用于客户端 SDK AWS CloudHSM 的 OpenSSL 提供程序 5。有关安装 OpenSSL 提供程序的更多信息，请参阅适用于客户端 SDK 的 Op [AWS CloudHSM enSSL 提供程序 5。](openssl-provider-install.md)

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

------
#### [ Amazon Linux 2023 ]
   + NGINX

     ```
     $ yum install nginx
     ```
   + HAProxy

     ```
     $ yum install haproxy
     ```

------
#### [ RHEL 9 (9.2\$1) ]
   + NGINX

     ```
     $ yum install nginx
     ```
   + HAProxy

     ```
     $ yum install haproxy
     ```

------
#### [ RHEL 10 (10.0\$1) ]
   + NGINX

     ```
     $ yum install nginx
     ```
   + HAProxy

     ```
     $ yum install haproxy
     ```

------
#### [ Ubuntu 24.04 ]
   + NGINX

     ```
     $ apt install nginx
     ```
   + HAProxy

     ```
     $ apt install haproxy
     ```

------

1. 使用 CloudHSM CLI 创建[加密用户](understanding-users.md#crypto-user-chsm-cli)。有关管理 HSM 用户的更多信息，请参阅[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)。
**提示**  
跟踪 CU 用户名和密码。您稍后为 Web 服务器生成或导入 HTTPS 私有密钥和证书时需要它们。

完成这些步骤后，请转到 [第 2 步：生成或导入私钥并获取证书](#ssl-offload-provider-generate-key-and-certificate)。

#### 注意
<a name="note-ssl5-provider-pre"></a>
+ 要使用安全增强型 Linux (SELinux) 和 Web 服务器，必须允许端口 2223 上的出站 TCP 连接，该端口是 Client SDK 5 用来与 HSM 通信的端口。
+ 要创建和激活集群并授予 EC2 实例访问该集群的权限，请完成[入门 AWS CloudHSM](getting-started.md)的步骤。入门 step-by-step指南提供了使用一个 HSM 和 Amazon EC2 客户端实例创建活动集群的说明。您可使用此客户端实例作为您的 Web 服务器。
+ 为避免禁用客户端密钥持久性，请向集群添加多个 HSM。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。
+ 要连接到客户端实例，可以使用 SSH 或 PuTTY。有关更多信息，请参阅 Amazon EC2 文档中的[使用 SSH 连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)或[使用 PuTTY 从 Windows 连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)。

## 第 2 步：生成或导入私钥并获取证书
<a name="ssl-offload-provider-generate-key-and-certificate"></a>

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

### 生成私有密钥
<a name="ssl-offload-provider-generate-private-key"></a>

本节显示了如何使用 [CloudHSM CLI](cloudhsm_cli.md) 生成密钥对。在 HSM 中生成密钥对后，即可将其导出为伪造 PEM 文件，并生成相应的证书。<a name="ssl-offload-provider-generate-private-key-prerequisites"></a>

**安装和配置 CloudHSM CLI**

1. [安装和配置](cloudhsm_cli-getting-started.md) CloudHSM CLI。

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

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

1. 运行以下命令登录 HSM。*<user name>*替换为您的加密用户的用户名

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

**生成私有密钥**

根据您的使用案例，您可以生成 RSA 或 EC 密钥对。请执行以下操作之一：
+ 在 HSM 上生成 RSA 私有密钥

  使用 [`key generate-asymmetric-pair rsa`](cloudhsm_cli-key-generate-asymmetric-pair-rsa.md) 命令生成 RSA 密钥对。此示例生成一个 RSA 密钥对，其模数为 2048，公钥指数为 65537，公钥标签为，私钥标签为。*tls\$1rsa\$1pub* *tls\$1rsa\$1private*

  ```
  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`](cloudhsm_cli-key-generate-asymmetric-pair-ec.md) 命令生成 EC 密钥对。此示例生成一个 EC 密钥对，其`prime256v1`曲线为（对应于`NID_X9_62_prime256v1`曲线），公钥标签为*tls\$1ec\$1pub*，私钥标签为*tls\$1ec\$1private*。

  ```
  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`](cloudhsm_cli-key-generate-file.md) 命令以伪造 PEM 格式导出私有密钥并将其保存到文件。将以下值替换为您自己的值。
+ *<private\$1key\$1label>*— 您在上一步中生成的私钥的标签。
+ *<web\$1server\$1fake\$1pem.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\$1server\$1fake\$1pem.key>*中指定的路径上。此文件是假 PEM 私有密钥文件。

### 生成自签名证书
<a name="ssl-offload-provider-generate-certificate"></a>

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

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

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

**警告**  
自签名证书只应在测试环境中使用。对于生产环境，请使用更安全的方法 (如证书颁发机构) 来创建证书。<a name="ssl-offload-provider-generate-certificate-prerequisites"></a>

**安装和配置 OpenSSL 动态引擎**

1. 连接到您的客户端实例。

1. [安装适用于 AWS CloudHSM 客户端 SDK 的 OpenSSL 动态引擎 5](openssl5-install.md)<a name="ssl-offload-provider-generate-certificate-steps"></a>

**生成证书**

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

1. 创建 CSR

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

   `req` 命令是交互式的。响应每个字段。字段信息将复制到您的 SSL/TLS 证书中。
**注意**  
OpenSSL 提供程序目前不支持创建 CSR。此步骤必须使用 OpenSSL 引擎，但是 TLS 密码操作将适用于提供程序。

   ```
   $ openssl req -engine cloudhsm -new -key <web_server_fake_pem.key> -out <web_server.csr>
   ```

1. 创建自签名证书

   运行以下命令，使用 AWS CloudHSM OpenSSL 动态引擎在 HSM 上使用私钥签署您的 CSR。这会创建自签名证书。将命令中的以下值替换为您自己的值。
   + *<web\$1server.csr>*— 包含 CSR 的文件的名称。
   + *<web\$1server\$1fake\$1pem.key>*— 包含虚假 PEM 私钥的文件的名称。
   + *<web\$1server.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 服务器](#ssl-offload-provider-configure-web-server)。

## 步骤 3：配置 Web 服务器
<a name="ssl-offload-provider-configure-web-server"></a>

更新您的网络服务器软件的配置以使用 HTTPS 证书以及在[上一步](#ssl-offload-provider-generate-key-and-certificate)中创建的相应伪造 PEM 私有密钥。切记在开始前备份您现有的证书。这将完成您的 Linux Web 服务器软件的设置，以便卸载 SSL/TLS 服务器身份。 AWS CloudHSM

完成下述步骤之一。

**Topics**
+ [配置 NGINX网络服务器](#ssl-offload-provider-configure-nginx)
+ [配置 HAProxy Web 服务器](#ssl-offload-provider-configure-haproxy)

### 配置 NGINX网络服务器
<a name="ssl-offload-provider-configure-nginx"></a>

使用此部分使用 OpenSSL 提供程序配置 NGINX。<a name="configure-nginx-provider"></a>

**为 OpenSSL 提供程序配置 NGINX**

1. 连接到您的客户端实例。

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

   ```
   $ mkdir -p /etc/pki/nginx/private
   ```

1. 运行以下命令以将您的网络服务器证书复制到所需位置。*<web\$1server.crt>*替换为您的 Web 服务器证书的名称。

   ```
   $ cp <web_server.crt> /etc/pki/nginx/server.crt
   ```

1. 运行以下命令以将您的伪造 PEM 私有密钥复制到所需位置。*<web\$1server\$1fake\$1pem.key>*替换为包含您的虚假 PEM 私钥的文件名。

   ```
   $ cp <web_server_fake_pem.key> /etc/pki/nginx/private/server.key
   ```

1. 运行以下命令更改文件所有权，以便名为 *nginx* 的用户可读取它们。

   ```
   $ chown nginx /etc/pki/nginx/server.crt /etc/pki/nginx/private/server.key
   ```

1. 将 OpenSSL 配置为使用提供程序。 AWS CloudHSM 有关配置 OpenSSL 提供程序的更多信息，请参阅适用于客户端 SDK 的 Op [AWS CloudHSM enSSL 提供程序 5。](openssl-provider-install.md)

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

      ```
      $ openssl version -d
      ```

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

      ```
      OPENSSLDIR: "/etc/pki/tls"
      ```

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

   1. 
**注意**  
不要直接修改系统的默认 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
      ```

   1. 确保使用您的加密用户 (CU) 凭据设置`CLOUDHSM_PIN`环境变量：

      ```
      $ export CLOUDHSM_PIN=<username>:<password>
      ```

   1. 将`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
      ```

1. 运行以下命令可备份 `/etc/nginx/nginx.conf` 文件。

   ```
   $ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
   ```

1. 更新 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\$1) ]

   使用文本编辑器编辑 `/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\$1) ]

   使用文本编辑器编辑 `/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 {
       }
   }
   ```

------

   保存该文件。

1. 备份 `systemd` 配置文件，然后设置 `EnvironmentFile` 路径。

------
#### [ Amazon Linux 2023 ]

   1. 备份`nginx.service`文件：

      ```
      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1. 在文本编辑器中打开 `/lib/systemd/system/nginx.service`。在 [服务] 部分下，添加：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ RHEL 9 (9.2\$1) ]

   1. 备份`nginx.service`文件：

      ```
      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1. 在文本编辑器中打开 `/lib/systemd/system/nginx.service`。在 [服务] 部分下，添加：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------
#### [ RHEL 10 (10.0\$1) ]

   1. 备份`nginx.service`文件：

      ```
      $ cp /lib/systemd/system/nginx.service /lib/systemd/system/nginx.service.backup
      ```

   1. 在文本编辑器中打开 `/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
      ```

   1. 在文本编辑器中打开 `/lib/systemd/system/nginx.service`。在 [服务] 部分下，添加：

      ```
      EnvironmentFile=/etc/sysconfig/nginx
      ```

------

1.  检查 `/etc/sysconfig/nginx` 文件是否存在，然后执行下列操作之一：
   + 如果文件存在，请通过运行以下命令备份文件：

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

1. 配置 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](#configure-nginx-provider)。

    保存该文件。

------
#### [ RHEL 9 (9.2\$1) ]

   在文本编辑器中打开 `/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](#configure-nginx-provider)。

    保存该文件。

------
#### [ RHEL 10 (10.0\$1) ]

   在文本编辑器中打开 `/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](#configure-nginx-provider)。

    保存该文件。

------
#### [ 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](#configure-nginx-provider)。

    保存该文件。

------

1. 启动 NGINX网络服务器。

------
#### [ Amazon Linux 2023 ]

   停止所有 NGINX 进程

   ```
   $ systemctl stop nginx
   ```

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

   ```
   $ systemctl daemon-reload
   ```

   启动 NGINX

   ```
   $ systemctl start nginx
   ```

------
#### [ RHEL 9 (9.2\$1) ]

   停止任何运行中的 NGINX 进程

   ```
   $ systemctl stop nginx
   ```

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

   ```
   $ systemctl daemon-reload
   ```

   启动 NGINX 进程

   ```
   $ systemctl start nginx
   ```

------
#### [ RHEL 10 (10.0\$1) ]

   停止任何运行中的 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 使用的是您已配置的证书](#ssl-offload-verify-https-connection-linux)

### 配置 HAProxy Web 服务器
<a name="ssl-offload-provider-configure-haproxy"></a>

使用此部分可以使用 OpenSSL HAProxy 提供程序进行配置。以下示例展示了如何 HAProxy 使用您的 CloudHSM 证书和密钥进行设置。<a name="configure-haproxy-provider"></a>

**要为 Open HAProxy SSL 提供程序进行配置**

1. 备份现有的合并证书文件（如果存在）：

   ```
   $ cp server-combined.pem server-combined.pem.backup
   ```

1. 创建用于 HAProxy 使用您的证书和 CloudHSM 假 PEM 密钥的组合证书文件：

   ```
   $ cat server.crt server.key > server-combined.pem
   ```

1. 备份现有 HAProxy 配置：

   ```
   $ cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup
   ```

1. 在以下位置创建新的 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
   ```

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

1. 将 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
   ```

------

1. 在适合您系统的位置创建环境文件。

------
#### [ 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>*。

1. 重新加载系统配置：

   ```
   $ systemctl daemon-reload
   ```

1. 从 CloudHSM TLS 卸载配置开始 HAProxy ：

   ```
   $ systemctl start haproxy
   ```

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

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

配置完成后 HAProxy，请转至[验证 HTTPS 使用的是您已配置的证书](#ssl-offload-verify-https-connection-linux)。

## 步骤 4：启用 HTTPS 流量并验证证书
<a name="ssl-offload-enable-traffic-and-verify-certificate-provider"></a>

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

**Topics**
+ [启用入站 HTTPS 连接](#ssl-offload-add-security-group-linux)
+ [验证 HTTPS 使用的是您已配置的证书](#ssl-offload-verify-https-connection-linux)

### 启用入站 HTTPS 连接
<a name="ssl-offload-add-security-group-linux"></a>

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

**为 HTTPS 创建安全组并将其分配给您的网络服务器**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**安全组**。

1. 选择**创建安全组**。

1. 对于**创建安全组**，执行以下操作：

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

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

   1. 对于 **VPC**，选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。

   1. 选择**添加规则**。

   1. 对于**类型**，从下拉窗口中选择 **HTTPS**。

   1. 对于**来源**，输入来源位置。

   1. 选择**创建安全组**。

1. 在导航窗格中，选择**实例**。

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

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

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

1. 选择**保存**。

### 验证 HTTPS 使用的是您已配置的证书
<a name="ssl-offload-verify-https-connection-linux"></a>

将 Web 服务器添加到安全组后，您可以验证 SSL/TLS 卸载是否使用您的自签名证书。您可以使用网络浏览器或使用工具 (如 [OpenSSL s\$1client](https://www.openssl.org/docs/manmaster/man1/s_client.html)) 执行此操作。

**使用 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 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

1. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息，请参阅下列内容：
   + 对于 Mozilla Firefox，请参阅 Mozilla Support 网站上的[查看证书](https://support.mozilla.org/en-US/kb/secure-website-certificate#w_view-a-certificate)。
   + 关于 Google Chrome 浏览器，请参阅 Google Tools for Web Developers 网站上的[了解安全问题](https://developers.google.com/web/tools/chrome-devtools/security)。

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

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

**使用 OpenSSL s\$1client 验证 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 Route 53 开发人员指南》*或 DNS 服务文档中的[将流量路由到 Amazon EC2 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

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

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

若要添加负载均衡器，请参阅 [使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM（可选）](third-offload-add-lb.md)。

# AWS CloudHSM 使用带有 JSSE 的 Tomcat 在 Linux 上卸载 SSL/TLS
<a name="third-offload-linux-jsse"></a>

本主题提供使用 Java 安全套接字扩展 (JSSE) 和 AWS CloudHSM JCE SDK 设置 SSL/TLS 卸载的 step-by-step说明。

**Topics**
+ [概述](#third-offload-linux-jsse-overview)
+ [步骤 1：设置先决条件](#third-offload-linux-jsse-prereqs)
+ [步骤 2：生成或导入私钥和 SSL/TLS 证书](#third-offload-linux-jsse-gen)
+ [步骤 3：配置 Tomcat Web 服务器](#third-offload-linux-jsse-config)
+ [步骤 4：启用 HTTPS 流量并验证证书](#third-offload-linux-jsse-verify)

## 概述
<a name="third-offload-linux-jsse-overview"></a>

 在中 AWS CloudHSM，Tomcat 网络服务器在 Linux 上运行以支持 HTTPS。 AWS CloudHSM JCE SDK 提供了一个可与 JSSE（Java 安全套接字扩展）配合使用的接口，以便允许此类网络服务器使用。 HSMs AWS CloudHSM JCE 是将 JSSE 连接到您的 AWS CloudHSM 集群的桥梁。JSSE 是用于安全套接字层（SSL）/传输层安全性协议（TLS）的 Java API。

## 步骤 1：设置先决条件
<a name="third-offload-linux-jsse-prereqs"></a>

要在 Linux 上使用 Tomcat Web 服务器 AWS CloudHSM 进行 SSL/TLS 卸载，请遵循以下先决条件。必须满足这些先决条件才能使用客户端 SDK 5 和 Tomcat Web 服务器设置 Web 服务器 SSL/TLS 卸载。

**注意**  
不同的平台需要不同的先决条件。请始终按照适用于您的平台的正确安装步骤进行操作。

### 先决条件
<a name="new-versions-jsse"></a>
+ 运行安装了 tomcat Web 服务器的 Linux 操作系统的 Amazon EC2 实例。
+ 一个[加密用户](understanding-users.md#crypto-user-chsm-cli)（CU），该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。
+ 具有至少两个硬件安全模块 (HSMs) 的活动 AWS CloudHSM 集群，且安装并配置了 [JCE for Client SDK 5](java-library-install_5.md)。
**注意**  
您可以使用单个 HSM 集群，但您必须首先禁用客户端密钥持久性。有关更多信息，请参阅[管理客户端密钥持久性设置](working-client-sync.md#client-sync-sdk8)和[客户端软件开发工具包 5 配置工具](configure-sdk-5.md)。

#### 如何满足先决条件
<a name="jsse-prereqs-how-to"></a>

1. 在至少有两个硬件安全模块的活动 AWS CloudHSM 群集 AWS CloudHSM 上安装和配置 JCE（HSMs）。有关安装的更多信息，请参阅[适用于客户端软件开发工具包 5 的 JCE](java-library-install_5.md)。

1. 在可以访问您的 AWS CloudHSM 集群的 EC2 Linux 实例上，按照 [Apache Tomcat 的说明](https://tomcat.apache.org/download-90.cgi )下载并安装 Tomcat Web 服务器。

1. 使用 [CloudHSM CLI](cloudhsm_cli.md) 创建加密用户（CU）。有关管理 HSM 用户的更多信息，请参阅[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)。
**提示**  
跟踪 CU 用户名和密码。您稍后为 Web 服务器生成或导入 HTTPS 私有密钥和证书时需要它们。

1. 要使用 Java Keytool 设置 JCE，请按照 [使用客户端 SDK 5 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成](keystore-third-party-tools_5.md) 中的说明进行操作。

完成这些步骤后，请转到 [步骤 2：生成或导入私钥和 SSL/TLS 证书](#third-offload-linux-jsse-gen)。

#### 注意
<a name="jsse-prereqs-notes"></a>
+ 要使用安全增强型 Linux (SELinux) 和 Web 服务器，必须允许端口 2223 上的出站 TCP 连接，该端口是 Client SDK 5 用来与 HSM 通信的端口。
+ 要创建和激活集群并授予 EC2 实例访问该集群的权限，请完成[入门 AWS CloudHSM](getting-started.md)的步骤。本节提供 step-by-step有关创建包含一个 HSM 和一个 Amazon EC2 客户端实例的活动集群的说明。您可使用此客户端实例作为您的 Web 服务器。
+ 为避免禁用客户端密钥持久性，请向集群添加多个 HSM。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。
+ 要连接到客户端实例，可以使用 SSH 或 PuTTY。有关更多信息，请参阅 Amazon EC2 文档中的[使用 SSH 连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)或[使用 PuTTY 从 Windows 连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)。

## 步骤 2：生成或导入私钥和 SSL/TLS 证书
<a name="third-offload-linux-jsse-gen"></a>

要启用 HTTPS，您的 Tomcat Web 服务器应用程序需要私钥和相应的 SSL/TLS 证书。要将 Web 服务器 SSL/TLS 卸载与一起使用 AWS CloudHSM，必须将私钥存储在集群的 AWS CloudHSM HSM 中。

**注意**  
如果您没有私有密钥及相应的证书，则可以在 HSM 中生成私有密钥。您可以使用私钥创建证书签名请求 (CSR)，然后使用该请求来创建 SSL/TLS 证书。

您可以创建一个本地 AWS CloudHSM KeyStore 文件，其中包含对您在 HSM 上的私钥的引用和关联的证书。在 SSL/TLS 卸载期间，您的 Web 服务器使用该 AWS CloudHSM KeyStore 文件来识别 HSM 上的私钥。

**Topics**
+ [生成私有密钥](#jsse-ssl-offload-generate-private-key)
+ [生成自签名证书](#jsse-ssl-offload-generate-certificate)

### 生成私有密钥
<a name="jsse-ssl-offload-generate-private-key"></a>

本节介绍如何使用来 KeyTool 自 JDK 的生成密钥对。在 HSM 中生成密钥对后，可以将其导出为 KeyStore 文件，然后生成相应的证书。

根据您的使用案例，您可以生成 RSA 或 EC 密钥对。以下步骤将显示如何生成 RSA 密钥对。

**使用中的`genkeypair` KeyTool 命令生成 RSA key pair**

1. 用您的特定数据替换*<VARIABLES>*以下内容后，使用以下命令生成名为的密钥库文件`jsse_keystore.keystore`，该文件将引用您在 HSM 上的私钥。

   ```
   $ keytool -genkeypair -alias <UNIQUE ALIAS FOR KEYS> -keyalg <KEY ALGORITHM> -keysize <KEY SIZE> -sigalg <SIGN ALGORITHM> \
           -keystore <PATH>/<JSSE KEYSTORE NAME>.keystore -storetype CLOUDHSM \
           -dname CERT_DOMAIN_NAME \
           -J-classpath '-J'$JAVA_LIB'/*:/opt/cloudhsm/java/*:./*' \
           -provider "com.amazonaws.cloudhsm.jce.provider.CloudHsmProvider" \
           -providerpath "$CLOUDHSM_JCE_LOCATION" \
           -keypass <KEY PASSWORD> -storepass <KEYSTORE PASSWORD>
   ```
   + ***<PATH>***: 您要生成密钥库文件的路径。
   + ***<UNIQUE ALIAS FOR KEYS>***：这用于在 HSM 上唯一标识您的密钥。此别名将被设置为密钥的 LABEL 属性。
   + ***<KEY PASSWORD>***：我们将对您的密钥的引用存储在本地密钥库文件中，此密码可以保护该本地引用。
   + ***<KEYSTORE PASSWORD>***：这是您的本地密钥库文件的密码。
   + ***<JSSE KEYSTORE NAME>***：密钥库文件的名称。
   + ***<CERT DOMAIN NAME>***: X.500 可分辨名称。
   + ***<KEY ALGORITHM>***：生成密钥对的密钥算法（例如，RSA 和 EC）。
   + ***<KEY SIZE>***：生成密钥对的密钥大小（例如，2048、3072 和 4096）。
   + ***<SIGN ALGORITHM>***：生成密钥对的密钥大小（例如， SHA1withRSA、RSA、 SHA224with RSA、 SHA256with RSA SHA384with 和 RSA）。 SHA512with

1. 要确认命令是否成功，请输入以下命令并验证您是否成功生成了 RSA 密钥对。

   ```
   $ ls <PATH>/<JSSE KEYSTORE NAME>.keystore
   ```

### 生成自签名证书
<a name="jsse-ssl-offload-generate-certificate"></a>

生成私有密钥和密钥库文件后，即可使用此文件生成证书签名请求（CSR）和证书。

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

除了使用 CA 之外，您还可以使用创建自签名证书。 KeyTool 自签名证书不受浏览器的信任，不应在生产环境中使用。它们可在测试环境中使用。

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

**Topics**<a name="jsse-ssl-procedure-offload-generate-certificate"></a>

**生成证书**

1. 获取前面步骤中生成的密钥库文件的副本。

1. 运行以下命令以使用创建证书签名请求 (CSR)。 KeyTool 

   ```
   $ keytool -certreq -keyalg RSA -alias unique_alias_for_key -file certreq.csr \
           -keystore <JSSE KEYSTORE NAME>.keystore -storetype CLOUDHSM \
           -J-classpath '-J$JAVA_LIB/*:/opt/cloudhsm/java/*:./*' \
           -keypass <KEY PASSWORD> -storepass <KEYSTORE PASSWORD>
   ```
**注意**  
证书签名请求的输出文件是`certreq.csr`。<a name="jsse-ssl-procedure-offload-sign-certificate"></a>

**签署证书**
+ 将*<VARIABLES>*以下内容替换为您的特定数据后，运行以下命令，在 HSM 上使用私钥签署您的 CSR。这会创建自签名证书。

  ```
  $ keytool -gencert -infile certreq.csr -outfile certificate.crt \
      -alias <UNIQUE ALIAS FOR KEYS> -keypass <KEY_PASSWORD> -storepass <KEYSTORE_PASSWORD> -sigalg SIG_ALG \
      -storetype CLOUDHSM -J-classpath '-J$JAVA_LIB/*:/opt/cloudhsm/java/*:./*' \
      -keystore jsse_keystore.keystore
  ```
**注意**  
`certificate.crt`是使用别名私有密钥的已签名证书。<a name="jsse-ssl-procedure-offload-import-certificate"></a>

**在密钥库中导入证书**
+ 用您的特定数据替换*<VARIABLES>*以下内容后，运行以下命令将签名证书作为可信证书导入。此步骤会将证书存储在由别名标识的密钥库条目中。

  ```
  $ keytool -import -alias <UNIQUE ALIAS FOR KEYS> -keystore jsse_keystore.keystore \
      -file certificate.crt -storetype CLOUDHSM \
      -v -J-classpath '-J$JAVA_LIB/*:/opt/cloudhsm/java/*:./*' \
      -keypass <KEY PASSWORD> -storepass <KEYSTORE_PASSWORD>
  ```<a name="jsse-ssl-procedure-offload-convert-certificate"></a>

**将证书转换为 PEM**
+ 运行以下命令将签名的证书文件（`.crt`）转换为 PEM。PEM 文件将用于发送来自于 http 客户端的请求。

  ```
  $ openssl x509 -inform der -in certificate.crt -out certificate.pem
  ```

完成这些步骤后，转至[步骤 3：配置 Web 服务器](#third-offload-linux-jsse-config)。

## 步骤 3：配置 Tomcat Web 服务器
<a name="third-offload-linux-jsse-config"></a>

更新您的 Web 服务器软件的配置，以使用 HTTPS 证书和在上一步中创建的相应 PEM 文件。切记在开始前备份您现有的证书。这将完成您的 Linux Web 服务器软件的设置以进行 SSL/TLS 卸载。 AWS CloudHSM有关更多信息，请参考 [Apache Tomcat 9 配置参考](https://tomcat.apache.org/tomcat-9.0-doc/config/http.html)。<a name="jsse-config-stop-server"></a>

**停止服务器**
+ 用您的特定数据替换*<VARIABLES>*以下内容后，请在更新配置之前运行以下命令停止 Tomcat Server

  ```
  $ /<TOMCAT DIRECTORY>/bin/shutdown.sh
  ```
  + ***<TOMCAT DIRECTORY>***: 您的 Tomcat 安装目录。<a name="jsse-config-update-class-path"></a>

**更新 Tomcat 类路径**

1. 连接到您的客户端实例。

1. 找到 Tomcat 安装文件夹。

1. 用您的特定数据替换*<VARIABLES>*以下内容后，使用以下命令在 Tomcat 中添加 Java 库和 AWS CloudHSM Java 路径**classpath**，位于 Tomcat/bin/catalina .sh 文件中。

   ```
   $ sed -i 's@CLASSPATH="$CLASSPATH""$CATALINA_HOME"\/bin\/bootstrap.jar@CLASSPATH="$CLASSPATH""$CATALINA_HOME"\/bin\/bootstrap.jar:'"
           <JAVA LIBRARY>"'\/*:\/opt\/cloudhsm\/java\/*:.\/*@' <TOMCAT PATH> /bin/catalina.sh
   ```
   + ***<JAVA LIBRARY>***: Java JRE 库的位置。
   + ***<TOMCAT PATH>***: Tomcat 安装文件夹。<a name="jsse-config-add-https"></a>

**在服务器配置中添加 HTTPS 连接器。**

1. 前往 Tomcat 安装文件夹。

1. 用您的特定数据替换*<VARIABLES>*以下内容后，使用以下命令添加 HTTPS 连接器以使用先决条件中生成的证书：

   ```
   $ sed -i '/<Connector port="8080"/i <Connector port=\"443\" maxThreads=\"200\" scheme=\"https\" secure=\"true\" SSLEnabled=\"true\" keystoreType=\"CLOUDHSM\" keystoreFile=\"
           <CUSTOM DIRECTORY>/<JSSE KEYSTORE NAME>.keystore\" keystorePass=\"<KEYSTORE PASSWORD>\" keyPass=\"<KEY PASSWORD>
           \" keyAlias=\"<UNIQUE ALIAS FOR KEYS>" clientAuth=\"false\" sslProtocol=\"TLS\"/>' <TOMCAT PATH>/conf/server.xml
   ```
   + ***<CUSTOM DIRECTORY>***: 密钥库文件所在的目录。
   + ***<JSSE KEYSTORE NAME>***：密钥库文件的名称。
   + ***<KEYSTORE PASSWORD>***：这是您的本地密钥库文件的密码。
   + ***<KEY PASSWORD>***：我们将对您的密钥的引用存储在本地密钥库文件中，此密码可以保护该本地引用。
   + ***<UNIQUE ALIAS FOR KEYS>***：这用于在 HSM 上唯一标识您的密钥。此别名将被设置为密钥的 LABEL 属性。
   + ***<TOMCAT PATH>***: 您的 Tomcat 文件夹的路径。<a name="jsse-config-start-server"></a>

**启动服务器**
+ 用您的特定数据替换*<VARIABLES>*以下内容后，使用以下命令启动 Tomcat 服务器：

  ```
  $ /<TOMCAT DIRECTORY>/bin/startup.sh
  ```
**注意**  
***<TOMCAT DIRECTORY>***是您的 Tomcat 安装目录的名称。

在更新您的网络服务器配置后，转到 [步骤 4：启用 HTTPS 流量并验证证书](#third-offload-linux-jsse-verify)。

## 步骤 4：启用 HTTPS 流量并验证证书
<a name="third-offload-linux-jsse-verify"></a>

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

**Topics**
+ [启用入站 HTTPS 连接](#jsse-linux-add-security-group)
+ [验证 HTTPS 使用的是您已配置的证书](#jsse-linux-verify-https-connection)

### 启用入站 HTTPS 连接
<a name="jsse-linux-add-security-group"></a>

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

**为 HTTPS 创建安全组并将其分配给您的网络服务器**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**安全组**。

1. 选择**创建安全组**。

1. 对于**创建安全组**，执行以下操作：

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

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

   1. 对于 **VPC**，选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。

   1. 选择**添加规则**。

   1. 对于**类型**，从下拉窗口中选择 **HTTPS**。

   1. 对于**来源**，输入来源位置。

   1. 选择**创建安全组**。

1. 在导航窗格中，选择**实例**。

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

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

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

1. 选择**保存**。

### 验证 HTTPS 使用的是您已配置的证书
<a name="jsse-linux-verify-https-connection"></a>

将 Web 服务器添加到安全组后，您可以验证 SSL/TLS 卸载是否使用您的自签名证书。您可以使用网络浏览器或使用工具 (如 [OpenSSL s\$1client](https://www.openssl.org/docs/manmaster/man1/s_client.html)) 执行此操作。

**使用 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 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

1. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息，请参阅下列内容：
   + 对于 Mozilla Firefox，请参阅 Mozilla Support 网站上的[查看证书](https://support.mozilla.org/en-US/kb/secure-website-certificate#w_view-a-certificate)。
   + 关于 Google Chrome 浏览器，请参阅 Google Tools for Web Developers 网站上的[了解安全问题](https://developers.google.com/web/tools/chrome-devtools/security)。

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

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

**使用 OpenSSL s\$1client 验证 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 Route 53 开发人员指南》*或 DNS 服务文档中的[将流量路由到 Amazon EC2 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

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

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

若要添加负载均衡器，请参阅 [使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM（可选）](third-offload-add-lb.md)。

# AWS CloudHSM 使用 IIS 和 KSP 在 Windows 上卸载 SSL/TLS
<a name="ssl-offload-windows"></a>

本教程提供了在 Windows Web 服务器 AWS CloudHSM 上使用设置 SSL/TLS 卸载的 step-by-step说明。

**Topics**
+ [概述](#ssl-offload-windows-overview)
+ [步骤 1：设置先决条件](#ssl-offload-prerequisites-windows)
+ [步骤 2：创建证书签名请求 (CSR) 和证书](#ssl-offload-windows-create-csr-and-certificate)
+ [步骤 3：配置 Web 服务器](#ssl-offload-configure-web-server-windows)
+ [步骤 4：启用 HTTPS 流量并验证证书](#ssl-offload-enable-traffic-and-verify-certificate-windows)

## 概述
<a name="ssl-offload-windows-overview"></a>

在 Windows 上，[Internet Information Services (IIS) for Windows Server](https://www.iis.net/) Web 服务器应用程序本机支持 HTTPS。[Microsoft 加密学 API：下一代 (CNG) 的AWS CloudHSM 密钥存储提供程序 (KSP)](ksp-library.md) 提供了一个接口，允许 IIS 使用集群 HSMs 中的进行加密卸载和密钥存储。 AWS CloudHSM KSP 是将 IIS 连接到您的 AWS CloudHSM 集群的桥梁。

本教程介绍如何执行以下操作：
+ 在 Amazon EC2 实例上安装 Web 服务器软件。
+ 使用存储在您的 AWS CloudHSM 集群中的私有密钥将 Web 服务器软件配置为支持 HTTPS。
+ （可选）使用 Amazon EC2 创建第二个 Web 服务器实例，并使用 Elastic Load Balancing 创建负载均衡器。使用负载均衡器可以在多台服务器中分配负载，从而提高性能。它还能在一台或多台服务器发生故障的情况下提供冗余和更高的可用性。

在您准备好开始使用后，请转到 [步骤 1：设置先决条件](#ssl-offload-prerequisites-windows)。

## 步骤 1：设置先决条件
<a name="ssl-offload-prerequisites-windows"></a>

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

**Topics**
+ [客户端软件开发工具包 5 的先决条件](#ssl-offload-prerequisites-windows-sdk5)
+ [客户端软件开发工具包 3 的先决条件](#ssl-offload-prerequisites-windows-sdk3)

### 客户端软件开发工具包 5 的先决条件
<a name="ssl-offload-prerequisites-windows-sdk5"></a>

要使用设置 Web 服务器 SSL/TLS 卸载 AWS CloudHSM，您需要满足以下条件：
+ 至少有一个 HSM 的活动 AWS CloudHSM 集群。
+ 一个运行已安装以下软件的 Windows 操作系统的 Amazon EC2 实例：
  + 适用于 Windows 的 AWS CloudHSM 客户端软件。
  + Internet Information Services (IIS) for Windows Server。
+ 一个[加密用户](understanding-users.md#crypto-user-chsm-cli)（CU），该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。

**注意**  
本教程使用微软 Windows Server 2019。还支持 Microsoft Windows Server 2016 和 2022。

**在 HSM 上设置 Windows Server 实例并创建 CU**

1. 完成 [开始使用](getting-started.md) 中的步骤。启动 Amazon EC2 客户端时，选择 Windows Server 2019 AMI。完成这些步骤后，您有一个至少包含一个 HSM 的活动集群。你还有一个运行 Windows 服务器的 Amazon EC2 AWS CloudHSM 客户端实例，其中安装了 Windows 客户端软件。

1. （可选） HSMs 向您的集群添加更多内容。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。

1. 连接到您的 Windows Server。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 使用 CloudHSM CLI 创建加密用户（CU）。跟踪 CU 用户名和密码。您需要这些信息才能完成下一步。
**注意**  
有关创建用户的信息，请参阅[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)。

1. 使用您在上一步中创建的 CU 用户名和密码[设置 HSM 的登录凭证](ksp-library-authentication.md)。

1. 在步骤 5 中，如果您使用 Windows 凭据管理器设置 HSM 凭据，请[https://live.sysinternals.com/psexec.exe](https://live.sysinternals.com/psexec.exe)从下载并以 *NT Auth SysInternals ority\$1 SYST* EM 的身份运行以下命令：

   ```
   psexec.exe -s "C:\Program Files\Amazon\CloudHsm\tools\set_cloudhsm_credentials.exe" --username <USERNAME> --password <PASSWORD>
   ```

   用 HSM 凭证替换*<USERNAME>*和*<PASSWORD>*。

**在您的 Windows Server 上安装 IIS**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板中，选择**添加角色和功能**。

1. 阅读**开始之前**信息，然后选择**下一步**。

1. 对于**安装类型**，选择**基于角色或基于功能的安装**。然后选择**下一步**。

1. 对于**服务器选择**，选择**从服务器池中选择服务器**。然后选择**下一步**。

1. 对于**服务器角色**，请执行以下操作：

   1. 选择 **Web 服务器(IIS)**。

   1. 对于**添加 Web Server (IIS) 所需的功能**，选择**添加功能**。

   1. 选择**下一步**完成选择服务器角色。

1. 对于**功能**，接受默认值。然后选择**下一步**。

1. 阅读 **Web 服务器角色(IIS)** 信息。然后选择**下一步**。

1. 对于**选择角色服务**，接受默认值或根据偏好更改设置。然后选择**下一步**。

1. 对于**确认**，阅读确认信息。然后选择**安装**。

1. 安装完成后，选择**关闭**。

完成这些步骤后，请转到 [步骤 2：创建证书签名请求 (CSR) 和证书](#ssl-offload-windows-create-csr-and-certificate)。

### 客户端软件开发工具包 3 的先决条件
<a name="ssl-offload-prerequisites-windows-sdk3"></a>

要使用设置 Web 服务器 SSL/TLS 卸载 AWS CloudHSM，您需要满足以下条件：
+ 至少有一个 HSM 的活动 AWS CloudHSM 集群。
+ 一个运行已安装以下软件的 Windows 操作系统的 Amazon EC2 实例：
  + 适用于 Windows 的 AWS CloudHSM 客户端软件。
  + Internet Information Services (IIS) for Windows Server。
+ 一个[加密用户](understanding-users.md#crypto-user-chsm-cli)（CU），该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。

**注意**  
本教程使用的是 Microsoft Windows Server 2016。还支持 Microsoft Windows Server 2012，但不支持 Microsoft Windows Server 2012 R2。

**在 HSM 上设置 Windows Server 实例并创建 CU**

1. 完成 [开始使用](getting-started.md) 中的步骤。启动 Amazon EC2 客户端时，选择 Windows Server 2016 或 Windows Server 2012 AMI。完成这些步骤后，您有一个至少包含一个 HSM 的活动集群。你还有一个运行 Windows 服务器的 Amazon EC2 AWS CloudHSM 客户端实例，其中安装了 Windows 客户端软件。

1. （可选） HSMs 向您的集群添加更多内容。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。

1. 连接到您的 Windows Server。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 使用 CloudHSM CLI 创建加密用户（CU）。跟踪 CU 用户名和密码。您需要这些信息才能完成下一步。
**注意**  
有关创建用户的信息，请参阅[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)。

1. 使用您在上一步中创建的 CU 用户名和密码[设置 HSM 的登录凭证](ksp-library-prereq.md)。

1. 在步骤 5 中，如果您使用 Windows 凭据管理器设置 HSM 凭据，请[https://live.sysinternals.com/psexec.exe](https://live.sysinternals.com/psexec.exe)从下载并以 *NT Auth SysInternals ority\$1 SYST* EM 的身份运行以下命令：

   ```
   psexec.exe -s "C:\Program Files\Amazon\CloudHsm\tools\set_cloudhsm_credentials.exe" --username <USERNAME> --password <PASSWORD>
   ```

   用 HSM 凭证替换*<USERNAME>*和*<PASSWORD>*。

**在您的 Windows Server 上安装 IIS**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板中，选择**添加角色和功能**。

1. 阅读**开始之前**信息，然后选择**下一步**。

1. 对于**安装类型**，选择**基于角色或基于功能的安装**。然后选择**下一步**。

1. 对于**服务器选择**，选择**从服务器池中选择服务器**。然后选择**下一步**。

1. 对于**服务器角色**，请执行以下操作：

   1. 选择 **Web 服务器(IIS)**。

   1. 对于**添加 Web Server (IIS) 所需的功能**，选择**添加功能**。

   1. 选择**下一步**完成选择服务器角色。

1. 对于**功能**，接受默认值。然后选择**下一步**。

1. 阅读 **Web 服务器角色(IIS)** 信息。然后选择**下一步**。

1. 对于**选择角色服务**，接受默认值或根据偏好更改设置。然后选择**下一步**。

1. 对于**确认**，阅读确认信息。然后选择**安装**。

1. 安装完成后，选择**关闭**。

完成这些步骤后，请转到 [步骤 2：创建证书签名请求 (CSR) 和证书](#ssl-offload-windows-create-csr-and-certificate)。

## 步骤 2：创建证书签名请求 (CSR) 和证书
<a name="ssl-offload-windows-create-csr-and-certificate"></a>

要启用 HTTPS，您的 Web 服务器需要 SSL/TLS 证书和相应的私钥。要使用 SSL/TLS 卸载 AWS CloudHSM，请将私钥存储在集群的 HSM 中。 AWS CloudHSM 为此，您可使用[适用于 Microsoft 的加密 API：下一代 (CNG) 的AWS CloudHSM 密钥存储提供程序 (KSP)](ksp-v3-library.md) 来创建证书签名请求 (CSR)。然后，您向证书颁发机构 (CA) 提供 CSR，该机构负责签署 CSR 以生成证书。

**Topics**
+ [使用 Client SDK 5 创建 CSR](#ssl-offload-windows-create-csr-new-version)
+ [使用 Client SDK 3 创建 CSR](#ssl-offload-windows-create-csr-old-version)
+ [获取签名证书并导入](#ssl-offload-windows-create-certificate)

### 使用 Client SDK 5 创建 CSR
<a name="ssl-offload-windows-create-csr-new-version"></a>

1. 在您的 Windows Server 上，使用文本编辑器创建一个名为 `IISCertRequest.inf` 的证书请求文件。以下显示了示例 `IISCertRequest.inf` 文件的内容。有关可在文件中指定的各部分、键和值，请参阅 [Microsoft 的文档](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1#BKMK_New)。请勿更改 `ProviderName` 值。

   ```
   [Version]
   Signature = "$Windows NT$"
   [NewRequest]
   Subject = "CN=example.com,C=US,ST=Washington,L=Seattle,O=ExampleOrg,OU=WebServer"
   HashAlgorithm = SHA256
   KeyAlgorithm = RSA
   KeyLength = 2048
   ProviderName = "CloudHSM Key Storage Provider"
   KeyUsage = 0xf0
   MachineKeySet = True
   [EnhancedKeyUsageExtension]
   OID=1.3.6.1.5.5.7.3.1
   ```

1. 使用 [Windows **certreq** 命令](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1)从您在上一步中创建的 `IISCertRequest.inf` 文件创建 CSR。以下示例将 CSR 保存至名为 `IISCertRequest.csr` 的文件。如果您为证书申请文件使用了不同的文件名，请*IISCertRequest.inf*替换为相应的文件名。您可以选择将 CSR 文件*IISCertRequest.csr*替换为不同的文件名。

   ```
   C:\>certreq -new IISCertRequest.inf IISCertRequest.csr
   
   CertReq: Request Created
   ```

   `IISCertRequest.csr` 文件包含您的 CSR。您需要此 CSR 才能获取签名证书。

### 使用 Client SDK 3 创建 CSR
<a name="ssl-offload-windows-create-csr-old-version"></a>

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 使用以下命令启动 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
   ```

------
#### [ Windows ]
   + 对于 Windows 客户端 1.1.2 以上版本：

     ```
     C:\Program Files\Amazon\CloudHSM>net.exe start AWSCloudHSMClient
     ```
   + 对于 Windows 客户端 1.1.1 及更低版本：

     ```
     C:\Program Files\Amazon\CloudHSM>start "cloudhsm_client" cloudhsm_client.exe C:\ProgramData\Amazon\CloudHSM\data\cloudhsm_client.cfg
     ```

------

1. 在您的 Windows Server 上，使用文本编辑器创建一个名为 `IISCertRequest.inf` 的证书请求文件。以下显示了示例 `IISCertRequest.inf` 文件的内容。有关可在文件中指定的各部分、键和值，请参阅 [Microsoft 的文档](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1#BKMK_New)。请勿更改 `ProviderName` 值。

   ```
   [Version]
   Signature = "$Windows NT$"
   [NewRequest]
   Subject = "CN=example.com,C=US,ST=Washington,L=Seattle,O=ExampleOrg,OU=WebServer"
   HashAlgorithm = SHA256
   KeyAlgorithm = RSA
   KeyLength = 2048
   ProviderName = "Cavium Key Storage Provider"
   KeyUsage = 0xf0
   MachineKeySet = True
   [EnhancedKeyUsageExtension]
   OID=1.3.6.1.5.5.7.3.1
   ```

1. 使用 [Windows **certreq** 命令](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1)从您在上一步中创建的 `IISCertRequest.inf` 文件创建 CSR。以下示例将 CSR 保存至名为 `IISCertRequest.csr` 的文件。如果您为证书申请文件使用了不同的文件名，请*IISCertRequest.inf*替换为相应的文件名。您可以选择将 CSR 文件*IISCertRequest.csr*替换为不同的文件名。

   ```
   C:\>certreq -new IISCertRequest.inf IISCertRequest.csr
           SDK Version: 2.03
   
   CertReq: Request Created
   ```

   `IISCertRequest.csr` 文件包含您的 CSR。您需要此 CSR 才能获取签名证书。

### 获取签名证书并导入
<a name="ssl-offload-windows-create-certificate"></a>

在生产环境中，您通常使用证书颁发机构 (CA) 通过 CSR 创建证书。测试环境无需 CA。如果您确实使用了 CA，请将 CSR 文件 (`IISCertRequest.csr`) 发送给它，然后使用 CA 创建签名 SSL/TLS 证书。

作为使用 CA 的替代方案，您可以使用 [OpenSSL](https://www.openssl.org/) 等工具创建自签名证书。

**警告**  
自签名证书不受浏览器的信任，不应在生产环境中使用。它们可在测试环境中使用。

以下过程演示了如何创建自签名证书并使用该证书来签署您的 Web 服务器的 CSR。

**创建自签名证书**

1. 使用以下 OpenSSL 命令创建私有密钥。您可以选择*SelfSignedCA.key*用文件名替换以包含您的私钥。

   ```
   openssl genrsa -aes256 -out SelfSignedCA.key 2048
   Generating RSA private key, 2048 bit long modulus
   ......................................................................+++
   .........................................+++
   e is 65537 (0x10001)
   Enter pass phrase for SelfSignedCA.key:
   Verifying - Enter pass phrase for SelfSignedCA.key:
   ```

1. 使用以下 OpenSSL 命令，通过您在上一步中创建的私有密钥创建自签名证书。这是一个交互式命令。阅读屏幕上的说明，并按照提示操作。*SelfSignedCA.key*替换为包含您的私钥的文件的名称（如果不同）。您可以选择*SelfSignedCA.crt*用文件名替换，以包含您的自签名证书。

   ```
   openssl req -new -x509 -days 365 -key SelfSignedCA.key -out SelfSignedCA.crt
   Enter pass phrase for SelfSignedCA.key:
   You are about to be asked to enter information that will be incorporated
   into your certificate request.
   What you are about to enter is what is called a Distinguished Name or a DN.
   There are quite a few fields but you can leave some blank
   For some fields there will be a default value,
   If you enter '.', the field will be left blank.
   -----
   Country Name (2 letter code) [AU]:
   State or Province Name (full name) [Some-State]:
   Locality Name (eg, city) []:
   Organization Name (eg, company) [Internet Widgits Pty Ltd]:
   Organizational Unit Name (eg, section) []:
   Common Name (e.g. server FQDN or YOUR name) []:
   Email Address []:
   ```

**使用您的自签名证书签署 Web 服务器的 CSR**
+ 使用以下 OpenSSL 命令，通过您的私有密钥和自签名证书签署 CSR。将以下文件替换为包含相应数据的文件的名称（如果不同）。
  + *IISCertRequest.csr*— 包含您的 Web 服务器的 CSR 的文件的名称
  + *SelfSignedCA.crt*— 包含您的自签名证书的文件的名称
  + *SelfSignedCA.key*— 包含您的私钥的文件的名称
  + *IISCert.crt*— 包含您的 Web 服务器签名证书的文件的名称

  ```
  openssl x509 -req -days 365 -in IISCertRequest.csr \
                              -CA SelfSignedCA.crt \
                              -CAkey SelfSignedCA.key \
                              -CAcreateserial \
                              -out IISCert.crt
  Signature ok
  subject=/ST=IIS-HSM/L=IIS-HSM/OU=IIS-HSM/O=IIS-HSM/CN=IIS-HSM/C=IIS-HSM
  Getting CA Private Key
  Enter pass phrase for SelfSignedCA.key:
  ```

在完成上一步后，您会有一个用于 Web 服务器的签名证书 (`IISCert.crt`) 和一个自签名证书 (`SelfSignedCA.crt`)。在具有这些文件后，请转到[步骤 3：配置 Web 服务器](#ssl-offload-configure-web-server-windows)。

## 步骤 3：配置 Web 服务器
<a name="ssl-offload-configure-web-server-windows"></a>

将您的 IIS 网站的配置更新为使用在[上一步](#ssl-offload-windows-create-csr-and-certificate)结束时创建的 HTTPS 证书。这将完成你的 Windows Web 服务器软件 (IIS) 的设置以供 SSL/TLS 卸载。 AWS CloudHSM

如果您使用了自签名证书签署 CSR，则必须首先将自签名证书导入 Windows 受信任的根证书颁发机构。

**将您的自签名证书导入 Windows 受信任的根证书颁发机构**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 将您的自签名证书复制到 Windows Server。

1. 在 Windows Server 上，打开 **Control Panel (控制面板)**。

1. 对于**搜索控制面板**，键入 **certificates**。然后选择**管理计算机证书**。

1. 在**证书 - 本地计算机**窗口中，双击**受信任的根证书颁发机构**。

1. 右键单击**证书**，然后选择**所有任务**、**导入**。

1. 在**证书导入向导** 中，选择**下一步**。

1. 选择**浏览**，然后找到并选择您的自签名证书。如果按照[本教程的上一步](#ssl-offload-windows-create-csr-and-certificate)中的说明创建了您的自签名证书，则您的自签名证书将命名为 `SelfSignedCA.crt`。选择**打开**。

1. 选择**下一步**。

1. 对于**证书存储**，选择**将所有证书置于以下存储中**。然后，确保针对**证书存储**选中**受信任的根证书颁发机构**。

1. 选择**下一步**，然后选择**完成**。

**更新 IIS 网站的配置**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 启动 AWS CloudHSM 客户端守护程序。

1. 将您在[本教程的上一步](#ssl-offload-windows-create-csr-and-certificate)中创建的 Web 服务器的签名证书复制到您的 Windows 服务器。

1. 在您的 Windows Server 上，使用 [Windows **certreq** 命令](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1)接受此签名证书，如以下示例所示。*IISCert.crt*替换为包含 Web 服务器签名证书的文件名。

   ```
   C:\>certreq -accept IISCert.crt
           SDK Version: 2.03
   ```

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板的右上角，选择**工具**、**Internet Information Services (IIS)管理器**。

1. 在 **Internet Information Services (IIS)管理器**窗口中，双击您的服务器名称。然后双击**网站**。选择您的网站。

1. 选择 **SSL 设置**。然后，在窗口左侧选择**绑定**。

1. 在**网站绑定** 窗口中，选择**添加**。

1. 对于**类型**，选择 **https**。对于 **SSL 证书**，选择您在[本教程的上一步](#ssl-offload-windows-create-csr-and-certificate)结束时创建的 HTTPS 证书。
**注意**  
如果您在该绑定证书的过程中遇到错误，请重新启动服务器并重试此步骤。

1. 选择**确定**。

在更新您的网站配置后，请转到[步骤 4：启用 HTTPS 流量并验证证书](#ssl-offload-enable-traffic-and-verify-certificate-windows)。

## 步骤 4：启用 HTTPS 流量并验证证书
<a name="ssl-offload-enable-traffic-and-verify-certificate-windows"></a>

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

**Topics**
+ [启用入站 HTTPS 连接](#ssl-offload-add-security-group-windows)
+ [验证 HTTPS 使用的是您已配置的证书](#ssl-offload-verify-https-connection-windows)

### 启用入站 HTTPS 连接
<a name="ssl-offload-add-security-group-windows"></a>

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

**为 HTTPS 创建安全组并将其分配给您的网络服务器**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**安全组**。

1. 选择**创建安全组**。

1. 对于**创建安全组**，执行以下操作：

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

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

   1. 对于 **VPC**，选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。

   1. 选择**添加规则**。

   1. 对于**类型**，从下拉窗口中选择 **HTTPS**。

   1. 对于**来源**，输入来源位置。

   1. 选择**创建安全组**。

1. 在导航窗格中，选择**实例**。

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

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

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

1. 选择**保存**。

### 验证 HTTPS 使用的是您已配置的证书
<a name="ssl-offload-verify-https-connection-windows"></a>

将 Web 服务器添加到安全组后，您可以验证 SSL/TLS 卸载是否使用您的自签名证书。您可以使用网络浏览器或使用工具 (如 [OpenSSL s\$1client](https://www.openssl.org/docs/manmaster/man1/s_client.html)) 执行此操作。

**使用 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 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

1. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息，请参阅下列内容：
   + 对于 Mozilla Firefox，请参阅 Mozilla Support 网站上的[查看证书](https://support.mozilla.org/en-US/kb/secure-website-certificate#w_view-a-certificate)。
   + 关于 Google Chrome 浏览器，请参阅 Google Tools for Web Developers 网站上的[了解安全问题](https://developers.google.com/web/tools/chrome-devtools/security)。

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

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

**使用 OpenSSL s\$1client 验证 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 Route 53 开发人员指南》*或 DNS 服务文档中的[将流量路由到 Amazon EC2 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

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

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

若要添加负载均衡器，请参阅 [使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM（可选）](third-offload-add-lb.md)。

# 使用 Elastic Load Balancing 添加负载均衡器 AWS CloudHSM（可选）
<a name="third-offload-add-lb"></a>

使用一台 Web 服务器设置 SSL/TLS 卸载后，您可以创建更多 Web 服务器和一个 Elastic Load Balancing 负载均衡器，将 HTTPS 流量路由到 Web 服务器。负载均衡器可通过使两台或更多 web 服务器上的流量达到均衡，来减少您的单个 web 服务器上的负载。它还可以提高您的网站的可用性，因为负载均衡器可监视您的 Web 服务器的运行状况并且仅将流量路由到运行状况良好的服务器。如果某个 Web 服务器出现故障，负载均衡器会自动停止将流量路由到该服务器。

**Topics**
+ [步骤 1：为第二个 Web 服务器创建子网](#ssl-offload-load-balancer-create-new-subnet)
+ [步骤 2：创建第二个 Web 服务器](#ssl-offload-load-balancer-create-web-server)
+ [步骤 3：创建负载均衡器](#ssl-offload-load-balancer-create-load-balancer)

## 步骤 1：为第二个 Web 服务器创建子网
<a name="ssl-offload-load-balancer-create-new-subnet"></a>

在创建另一个 Web 服务器之前，您需要在包含现有 Web 服务器和 AWS CloudHSM 集群的同一 VPC 中创建一个新子网。

**创建新子网**

1. 打开 [Amazon VPC 控制台的**子网**部分](https://console.aws.amazon.com/vpc/home#subnets:)。

1. 选择**创建子网**。

1. 在**创建子网**对话框中，执行以下操作：

   1. 对于**名称标签**，键入您的子网的名称。

   1. 对于 **VPC**，请选择包含您的现有 Web 服务器和 AWS CloudHSM 集群的 AWS CloudHSM VPC。

   1. 对于**可用区**，选择与包含现有 Web 服务器的可用区不同的可用区。

   1. 对于 **IPv4 CIDR block**，键入要用于子网的 CIDR 块。例如，键入 **10.0.10.0/24**。

   1. 选择**是，创建**。

1. 选中包含现有 Web 服务器的公有子网旁边的复选框。这与您在上一步中创建的公有子网不同。

1. 在内容窗格中，选择**路由表**选项卡。然后选择路由表的链接。  
![\[在 Amazon VPC 控制台中选择路由表链接。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/console-vpc-choose-route-table.png)

1. 选中路由表旁边的复选框。

1. 选择**子网关联**选项卡。然后选择**编辑**。

1. 选中您在此过程的前面部分创建的公有子网旁的复选框。然后选择**保存**。

## 步骤 2：创建第二个 Web 服务器
<a name="ssl-offload-load-balancer-create-web-server"></a>

完成以下步骤以创建与现有 Web 服务器配置相同的另一个 Web 服务器。

**创建另一个 Web 服务器**

1. 打开 Amazon EC2 控制台的[https://console.aws.amazon.com/ec2/v2/home#Instances:](https://console.aws.amazon.com/ec2/v2/home#Instances:)章节，其位于。

1. 选中现有 Web 服务器实例旁边的复选框。

1. 依次选择**操作** 、**映像**和**创建映像**。

1. 在**创建映像** 对话框中，执行以下操作：

   1. 对于**映像名称** ，请键入映像的唯一名称。

   1. 对于**映像描述** ，请键入映像的描述。

   1. 选择**创建映像**。此操作将重启现有 Web 服务器。

   1. 选择**查看待处理图片 ami-*<AMI ID>*** 链接。  
![\[在 Amazon EC2 控制台中选择查看待处理影像链接。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/console-ec2-choose-view-pending-image.png)

      在**状态**列中，记下您的影像状态。当您的映像状态为**可用**时 (这可能需要几分钟)，请转到下一步。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 选中现有 Web 服务器旁边的复选框。

1. 选择**操作** ，然后选择**启动更多类似项**。

1. 选择**编辑 AMI**。  
![\[在 Amazon EC2 控制台中选择编辑 AMI 链接。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/console-ec2-choose-edit-ami.png)

1. 在左侧导航窗格中，选择**我的 AMIs**。然后，清除搜索框中的文本。

1. 在您的 Web 服务器映像旁，选择**选择**。

1. 选择**是，我想继续使用此 AMI (*<image name>*-ami-*<AMI ID>*)**。

1. 选择**下一步**。

1. 选择实例类型，然后选择**下一步：配置实例详细信息**。

1. 对于**步骤 3：配置实例详细信息**，执行以下操作：

   1. 对于**网络**，选择包含现有 Web 服务器的 VPC。

   1. 对于**子网**，选择您为第二个 Web 服务器创建的公有子网。

   1. 对于**自动分配公有 IP**，选择**启用**。

   1. 根据偏好更改其余实例的详细信息。然后选择**下一步：添加存储**。

1. 根据偏好更改存储设置。然后，选择**下一步：添加标签**。

1. 根据偏好添加或编辑标签。然后选择**下一步：配置安全组**。

1. 对于**步骤 6：配置安全组**，执行以下操作：

   1. 对于**分配安全组**，选择**选择现有安全组**。

   1. 选中名为 **cloudhsm--*<cluster ID>* s** g 的安全组旁边的复选框。 AWS CloudHSM 创建集群时代表您[创建了此安全组](create-cluster.md)。您必须选择此安全组才能允许 Web 服务器实例连接到群集 HSMs 中的。

   1. 选中允许入站 HTTPS 流量的安全组旁边的复选框。您[之前创建了此安全组](ssl-offload-windows.md#ssl-offload-add-security-group-windows)。

   1. (可选) 选中允许来自网络的入站 SSH（适用 Linux）或 RDP（适用 Windows）流量的安全组旁边的复选框。也就是说，安全组必须允许端口 22（Linux 上的 SSH）或端口 3389（Windows 上的 RDP）上的入站 TCP 流量。否则，您将无法连接到客户端实例。如果您没有此类安全组，则必须创建一个安全组并稍后将它分配给客户端实例。

   选择**审核并启动**。

1. 查看实例详细信息，然后选择 **启动**。

1. 选择是使用现有密钥对启动您的实例、创建新的密钥对还是在没有密钥对的情况下启动您的实例。
   + 要使用现有密钥对，请执行以下操作：

     1. 选择**选择现有密钥对**。

     1. 对于**选择密钥对**，选择要使用的密钥对。

     1. 选中 “**我确认我有权访问所选私钥文件 (*<private key file name>*.pem)” 旁边的复选框，如果没有此文件，我将无法登录我的**实例。
   + 要创建新密钥对，请执行以下操作：

     1. 选择 **Create a new key pair**。

     1. 对于**密钥对名称** ，请键入一个密钥对名称。

     1. 选择**下载密钥对**并将私有密钥文件保存在一个安全且易于访问的位置。
**警告**  
此后您无法再次下载私有密钥文件。如果您现在不下载私有密钥文件，您将无法访问客户端实例。
   + 要在没有密钥对的情况下启动您的实例，请执行以下操作：

     1. 选择**继续操作但不提供密钥对**。

     1. 选中 **I acknowledge that I will not be able to connect to this instance unless I already know the password built into this AMI** 旁边的复选框。

   选择**启动新实例**。

## 步骤 3：创建负载均衡器
<a name="ssl-offload-load-balancer-create-load-balancer"></a>

完成以下步骤以创建将 HTTPS 流量路由到您的 Web 服务器的 Elastic Load Balancing 负载均衡器。

**创建负载均衡器**

1. 打开 Amazon EC2 控制台的[ https://console.aws.amazon.com/ec2/v2/home#LoadBalancers:]( https://console.aws.amazon.com/ec2/v2/home#LoadBalancers:)章节。

1. 选择**创建负载均衡器**。

1. 在**网络负载均衡器**部分中，选择**创建**。

1. 对于**步骤 1：配置负载均衡器**，执行以下操作：

   1. 对于**名称**，键入您创建的负载均衡器的名称。

   1. 在**侦听器**章节中，对于**负载均衡器端口**，将值更改为 **443**。

   1. 在**可用区**部分中，对于 **VPC**，选择包含您的 Web 服务器的 VPC。

   1. 在**可用区**部分中，选择包含您的 Web 服务器的子网。

   1. 选择**下一步：配置路由**。

1. 对于**步骤 2：配置路由**，执行以下操作：

   1. 对于**名称**，键入您创建的目标组的名称。

   1. 对于**端口**，将值更改为 **443**。

   1. 选择**下一步：注册目标**。

1. 对于**步骤 3：注册目标**，请执行以下操作：

   1. 在**实例**部分，选中您的 web 服务器实例旁边的复选框。然后选择**添加到已注册**。

   1. 选择**下一步：审核**。

1. 审核您的负载均衡器详细信息，然后选择**创建**。

1. 在成功创建负载均衡器后，选择**关闭**。

完成前面的步骤后，Amazon EC2 控制台将显示您的 Elastic Load Balancing 负载均衡器。

当负载均衡器处于活动状态时，您可以验证负载均衡器是否正常工作。也就是说，您可以通过 SSL/TLS 卸载来验证它是否正在向您的网络服务器发送 HTTPS 流量。 AWS CloudHSM您可以使用 Web 浏览器或使用工具（如 [OpenSSL s\$1client](https://www.openssl.org/docs/manmaster/man1/s_client.html)）执行此操作。

**验证您的负载均衡器是否正在与 Web 浏览器结合使用**

1. 在 Amazon EC2 控制台中，找到您刚刚创建的负载均衡器的 **DNS name**。然后选择 DNS 名称并复制该名称。

1. 使用 Web 浏览器 (例如 Mozilla Firefox 或 Google Chrome) 通过负载均衡器的 DNS 名称连接到负载均衡器。确保地址栏中的 URL 以 https:// 开头。
**提示**  
您可以使用诸如 Amazon Route 53 之类的 DNS 服务将您网站的域名（例如 https://www.example.com/）路由到您的网络服务器。有关更多信息，请参阅 *《Amazon Route 53 开发人员指南》*或 DNS 服务文档中的[将流量路由到 Amazon EC2 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

1. 使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息，请参阅下列内容：
   + 对于 Mozilla Firefox，请参阅 Mozilla Support 网站上的[查看证书](https://support.mozilla.org/en-US/kb/secure-website-certificate#w_view-a-certificate)。
   + 关于 Google Chrome 浏览器，请参阅 Google Tools for Web Developers 网站上的[了解安全问题](https://developers.google.com/web/tools/chrome-devtools/security)。

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

1. 确保该证书是您配置 web 服务器使用的证书。

**验证您的负载均衡器是否正在与 OpenSSL s\$1client 结合使用**

1. 使用以下 OpenSSL 命令通过 HTTPS 连接到您的负载均衡器。*<DNS name>*替换为负载均衡器的 DNS 名称。

   ```
   openssl s_client -connect <DNS name>:443
   ```
**提示**  
您可以使用诸如 Amazon Route 53 之类的 DNS 服务将您网站的域名（例如 https://www.example.com/）路由到您的网络服务器。有关更多信息，请参阅 *《Amazon Route 53 开发人员指南》*或 DNS 服务文档中的[将流量路由到 Amazon EC2 实例](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-ec2-instance.html)。

1. 确保该证书是您配置 web 服务器使用的证书。

您现在有一个使用 HTTPS 保护的网站，Web 服务器的私钥存储在 AWS CloudHSM 集群的 HSM 中。您的网站有两个 Web 服务器和一个负载均衡器，可帮助提高效率和可用性。

# 将 Windows 服务器配置为证书颁发机构 (CA) AWS CloudHSM
<a name="third-ca-toplevel"></a>

AWS CloudHSM 支持通过客户端 SDK 3 和客户端 SDK 5 将 Windows 服务器配置为证书颁发机构 (CA)。根据您当前下载的 Client SDK 版本，使用这些工具的步骤会有所不同：以下部分提供了每个 SDK 的信息。

**Topics**
+ [Client SDK 5 与 Windows Server CA](win-ca-overview-sdk5.md)
+ [Client SDK 3 与 Windows Server CA](win-ca-overview-sdk3.md)

# 将 Windows Server 配置为具有 Client SDK 5 的证书颁发机构（CA）
<a name="win-ca-overview-sdk5"></a>

在公有密钥基础设施 (PKI) 中，证书颁发机构 (CA) 是一个颁发数字证书的可信实体。这些数字证书通过公有密钥加密和数字签名的方式，将公有密钥与身份（用户或组织）绑定。要操作 CA，您必须通过保护签署由 CA 颁发的证书的私有密钥来维持信任。您可以将此私有密钥存储至 AWS CloudHSM 集群的 HSM，然后使用 HSM 执行加密签名操作。

在本教程中，您将使用 Windows 服务器和 AWS CloudHSM 来配置 CA。在 Windows Server 上安装适用于 Windows 的 AWS CloudHSM 客户端软件，然后将 Active Directory 证书服务 (AD CS) 角色添加到 Windows Server。配置此角色时，您可以使用 AWS CloudHSM 密钥存储提供程序 (KSP) 在 AWS CloudHSM 集群上创建和存储 CA 的私钥。KSP 是将 Windows 服务器连接到 AWS CloudHSM 集群的桥梁。在最后一个步骤中，您使用 Windows Server CA 签署证书签名请求 (CSR)。

有关更多信息，请参阅以下主题：

**Topics**
+ [步骤 1：设置先决条件](#win-ca-prerequisites-sdk5)
+ [步骤 2：使用创建 Windows 服务器 CA AWS CloudHSM](#win-ca-setup-sdk5)
+ [第 3 步：使用您的 Windows 服务器证书颁发机构签署证书签名请求 (CSR) AWS CloudHSM](#win-ca-sign-csr-sdk5)

## 步骤 1：设置先决条件
<a name="win-ca-prerequisites-sdk5"></a>

要将 Windows 服务器设置为证书颁发机构 (CA) AWS CloudHSM，你需要满足以下条件：
+ 至少有一个 HSM 的活动 AWS CloudHSM 集群。
+ 运行 Windows 服务器操作系统且安装了 Windows AWS CloudHSM 客户端软件的 Amazon EC2 实例。本教程使用的是 Microsoft Windows Server 2016。
+ 一个加密用户 (CU)，该用户拥有和管理 HSM 上的 CA 私有密钥。

**要设置 Windows 服务器 CA 的先决条件，请使用 AWS CloudHSM**

1. 完成 [开始使用](getting-started.md) 中的步骤。启动 Amazon EC2 客户端时，选择 Windows Server AMI。本教程使用的是 Microsoft Windows Server 2016。完成这些步骤后，您有一个至少包含一个 HSM 的活动集群。你还有一个运行 Windows 服务器的 Amazon EC2 AWS CloudHSM 客户端实例，其中安装了 Windows 客户端软件。

1. （可选） HSMs 向您的集群添加更多内容。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。

1. 连接到您的客户端实例。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 通过[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)或[使用 CloudHSM 管理实用程序（CMU）管理 HSM 用户](manage-hsm-users-cmu.md)来创建加密用户（CU）。跟踪 CU 用户名和密码。您需要这些信息才能完成下一步。

1. 使用您在上一步中创建的 CU 用户名和密码[设置 HSM 的登录凭证](ksp-library-authentication.md)。

1. 在步骤 5 中，如果您使用 Windows 凭据管理器设置 HSM 凭据，请[https://live.sysinternals.com/psexec.exe](https://live.sysinternals.com/psexec.exe)从下载并以 *NT Auth SysInternals ority\$1 SYST* EM 的身份运行以下命令：

   ```
   psexec.exe -s "C:\Program Files\Amazon\CloudHsm\tools\set_cloudhsm_credentials.exe" --username <USERNAME> --password <PASSWORD>
   ```

   用 HSM 凭证替换*<USERNAME>*和*<PASSWORD>*。

要使用创建 Windows 服务器 CA AWS CloudHSM，请转至[创建 Windows Server CA](#win-ca-setup-sdk5)。

## 步骤 2：使用创建 Windows 服务器 CA AWS CloudHSM
<a name="win-ca-setup-sdk5"></a>

要创建 Windows Server CA，您将向 Windows Server 添加 Active Directory 证书服务 (AD CS) 角色。添加此角色时，您可以使用 AWS CloudHSM 密钥存储提供程序 (KSP) 在 AWS CloudHSM 集群上创建和存储 CA 的私钥。

**注意**  
创建 Windows Server CA 时，您可以选择创建根 CA 或从属 CA。您通常根据组织的公有密钥基础设施和安全策略的设计制定此决策。本教程介绍了如何创建根 CA 以简化操作。

**向 Windows Server 添加 AD CS 角色和创建 CA 的私有密钥**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板中，选择**添加角色和功能**。

1. 阅读**开始之前**信息，然后选择**下一步**。

1. 对于**安装类型**，选择**基于角色或基于功能的安装**。然后选择**下一步**。

1. 对于**服务器选择**，选择**从服务器池中选择服务器**。然后选择**下一步**。

1. 对于**服务器角色**，请执行以下操作：

   1. 选择 **Active Directory 证书服务**。

   1. 对于**添加 Active Directory 证书服务所需的功能**，选择**添加功能**。

   1. 选择**下一步**完成选择服务器角色。

1. 对于**功能**，接受默认值，然后选择**下一步**。

1. 对于 **AD CS**，请执行以下操作：

   1. 选择**下一步**。

   1. 选择**证书颁发机构**，然后选择**下一步**。

1. 对于**确认**，阅读确认信息，然后选择**安装**。不要关闭该窗口。

1. 选择突出显示的**配置目标服务器上的 Active Directory 证书服务**链接。

1. 对于**凭据**，请验证或更改显示的凭证。然后选择**下一步**。

1. 对于**角色服务**，选择**证书颁发机构**。然后选择**下一步**。

1. 对于**设置类型**，选择**独立 CA**。然后选择**下一步**。

1. 对于 **CA 类型**，选择**根 CA**。然后选择**下一步**。
**注意**  
您可以选择根据公有密钥基础设施和您组织的安全策略的设计创建根 CA 或从属 CA。本教程介绍了如何创建根 CA 以简化操作。

1. 对于**私有密钥**，选择**新建私有密钥**。然后选择**下一步**。

1. 对于**加密**，请执行以下操作：

   1. 对于**选择加密提供程序**，从菜单中选择一个 **CloudHSM 密钥存储提供程序**选项。这些是 AWS CloudHSM 密钥存储提供程序。例如，可以选择 **RSA\$1CloudHSM 密钥存储提供程序**。

   1. 对于**密钥长度**，从中选择一个密钥长度选项。

   1. 对于**选择用于签署此 CA 颁发的证书的哈希算法**，请选择其中一个哈希算法选项。

   选择**下一步**。

1. 对于 **CA 名称**，请执行以下操作：

   1. （可选）编辑公用名。

   1. （可选）键入可分辨名称后缀。

   选择**下一步**。

1. 对于**有效期**，指定时间段（以年、月、周或天为单位）。然后选择**下一步**。

1. 对于**证书数据库**，您可以接受默认值，也可以选择更改数据库和数据库日志的位置。然后选择**下一步**。

1. 对于**确认**，请查看有关 CA 的信息；然后选择**配置**。

1. 选择**关闭**，然后再次选择**关闭**。

你现在有了带的 Windows 服务器 CA AWS CloudHSM。要了解如何使用 CA 签署证书签名请求 (CSR) 的信息，请转到[签署 CSR](#win-ca-sign-csr-sdk5)。

## 第 3 步：使用您的 Windows 服务器证书颁发机构签署证书签名请求 (CSR) AWS CloudHSM
<a name="win-ca-sign-csr-sdk5"></a>

你可以使用你的 Windows 服务器 CA AWS CloudHSM 来签署证书签名请求 (CSR)。要完成这些步骤，您需要一个有效的 CSR。可以通过以下方法来创建 CSR：
+ 使用 OpenSSL
+ 使用 Windows Server Internet Information Services (IIS) 管理器
+ 使用 Microsoft 管理控制台中的证书单元
+ 在 Windows 上使用 **certreq** 命令行实用程序

创建 CSR 的步骤不在本教程的介绍范围之内。如果您有 CSR，则可使用您的 Windows Server CA 登录。

**使用 Windows Server CA 登录 CSR**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板的右上角，选择**工具**、**证书颁发机构**。

1. 在**证书颁发机构**窗口中，选择您的计算机名称。

1. 在**操作**菜单上，选择**所有任务**、**提交新请求**。

1. 选择 CSR 文件，然后选择**打开**。

1. 在**证书颁发机构**窗口中，双击 **待定的请求**。

1. 选择待定的请求。然后在**操作**菜单上，选择**所有任务**、**颁发**。

1. 在**证书颁发机构**窗口中，双击 **已发出的请求**以查看签署的证书。

1. （可选）要将签署的证书导出到文件中，请完成以下步骤：

   1. 在**证书颁发机构**窗口中，双击证书。

   1. 选择**详细信息**选项卡，然后选择**复制到文件**。

   1. 按照**证书导出向导**的说明操作。

现在，你有一个 Windows 服务器 CA 和一个由 Windows Server CA 签署的有效证书。 AWS CloudHSM

# 将 Windows Server 配置为具有 Client SDK 3 的证书颁发机构（CA）
<a name="win-ca-overview-sdk3"></a>

在公有密钥基础设施 (PKI) 中，证书颁发机构 (CA) 是一个颁发数字证书的可信实体。这些数字证书通过公有密钥加密和数字签名的方式，将公有密钥与身份（用户或组织）绑定。要操作 CA，您必须通过保护签署由 CA 颁发的证书的私有密钥来维持信任。您可以将此私有密钥存储至 AWS CloudHSM 集群的 HSM，然后使用 HSM 执行加密签名操作。

在本教程中，您将使用 Windows 服务器和 AWS CloudHSM 来配置 CA。在 Windows Server 上安装适用于 Windows 的 AWS CloudHSM 客户端软件，然后将 Active Directory 证书服务 (AD CS) 角色添加到 Windows Server。配置此角色时，您可以使用 AWS CloudHSM 密钥存储提供程序 (KSP) 在 AWS CloudHSM 集群上创建和存储 CA 的私钥。KSP 是将 Windows 服务器连接到 AWS CloudHSM 集群的桥梁。在最后一个步骤中，您使用 Windows Server CA 签署证书签名请求 (CSR)。

有关更多信息，请参阅以下主题：

**Topics**
+ [步骤 1：设置先决条件](#win-ca-prerequisites-sdk3)
+ [步骤 2：使用创建 Windows 服务器 CA AWS CloudHSM](#win-ca-setup-sdk3)
+ [第 3 步：使用您的 Windows 服务器证书颁发机构签署证书签名请求 (CSR) AWS CloudHSM](#win-ca-sign-csr-sdk3)

## 步骤 1：设置先决条件
<a name="win-ca-prerequisites-sdk3"></a>

要将 Windows 服务器设置为证书颁发机构 (CA) AWS CloudHSM，你需要满足以下条件：
+ 至少有一个 HSM 的活动 AWS CloudHSM 集群。
+ 运行 Windows 服务器操作系统且安装了 Windows AWS CloudHSM 客户端软件的 Amazon EC2 实例。本教程使用的是 Microsoft Windows Server 2016。
+ 一个加密用户 (CU)，该用户拥有和管理 HSM 上的 CA 私有密钥。

**要设置 Windows 服务器 CA 的先决条件，请使用 AWS CloudHSM**

1. 完成 [开始使用](getting-started.md) 中的步骤。启动 Amazon EC2 客户端时，选择 Windows Server AMI。本教程使用的是 Microsoft Windows Server 2016。完成这些步骤后，您有一个至少包含一个 HSM 的活动集群。你还有一个运行 Windows 服务器的 Amazon EC2 AWS CloudHSM 客户端实例，其中安装了 Windows 客户端软件。

1. （可选） HSMs 向您的集群添加更多内容。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。

1. 连接到您的客户端实例。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 通过[使用 CloudHSM CLI 管理 HSM 用户](manage-hsm-users-chsm-cli.md)或[使用 CloudHSM 管理实用程序（CMU）管理 HSM 用户](manage-hsm-users-cmu.md)来创建加密用户（CU）。跟踪 CU 用户名和密码。您需要这些信息才能完成下一步。

1. 使用您在上一步中创建的 CU 用户名和密码[设置 HSM 的登录凭证](ksp-library-prereq.md)。

1. 在步骤 5 中，如果您使用 Windows 凭据管理器设置 HSM 凭据，请[https://live.sysinternals.com/psexec.exe](https://live.sysinternals.com/psexec.exe)从下载并以 *NT Auth SysInternals ority\$1 SYST* EM 的身份运行以下命令：

   ```
   	  psexec.exe -s "C:\Program Files\Amazon\CloudHsm\tools\set_cloudhsm_credentials.exe" --username <USERNAME> --password <PASSWORD>
   ```

   用 HSM 凭证替换*<USERNAME>*和*<PASSWORD>*。

要使用创建 Windows 服务器 CA AWS CloudHSM，请转至[创建 Windows Server CA](#win-ca-setup-sdk3)。

## 步骤 2：使用创建 Windows 服务器 CA AWS CloudHSM
<a name="win-ca-setup-sdk3"></a>

要创建 Windows Server CA，您将向 Windows Server 添加 Active Directory 证书服务 (AD CS) 角色。添加此角色时，您可以使用 AWS CloudHSM 密钥存储提供程序 (KSP) 在 AWS CloudHSM 集群上创建和存储 CA 的私钥。

**注意**  
创建 Windows Server CA 时，您可以选择创建根 CA 或从属 CA。您通常根据组织的公有密钥基础设施和安全策略的设计制定此决策。本教程介绍了如何创建根 CA 以简化操作。

**向 Windows Server 添加 AD CS 角色和创建 CA 的私有密钥**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板中，选择**添加角色和功能**。

1. 阅读**开始之前**信息，然后选择**下一步**。

1. 对于**安装类型**，选择**基于角色或基于功能的安装**。然后选择**下一步**。

1. 对于**服务器选择**，选择**从服务器池中选择服务器**。然后选择**下一步**。

1. 对于**服务器角色**，请执行以下操作：

   1. 选择 **Active Directory 证书服务**。

   1. 对于**添加 Active Directory 证书服务所需的功能**，选择**添加功能**。

   1. 选择**下一步**完成选择服务器角色。

1. 对于**功能**，接受默认值，然后选择**下一步**。

1. 对于 **AD CS**，请执行以下操作：

   1. 选择**下一步**。

   1. 选择**证书颁发机构**，然后选择**下一步**。

1. 对于**确认**，阅读确认信息，然后选择**安装**。不要关闭该窗口。

1. 选择突出显示的**配置目标服务器上的 Active Directory 证书服务**链接。

1. 对于**凭据**，请验证或更改显示的凭证。然后选择**下一步**。

1. 对于**角色服务**，选择**证书颁发机构**。然后选择**下一步**。

1. 对于**设置类型**，选择**独立 CA**。然后选择**下一步**。

1. 对于 **CA 类型**，选择**根 CA**。然后选择**下一步**。
**注意**  
您可以选择根据公有密钥基础设施和您组织的安全策略的设计创建根 CA 或从属 CA。本教程介绍了如何创建根 CA 以简化操作。

1. 对于**私有密钥**，选择**新建私有密钥**。然后选择**下一步**。

1. 对于**加密**，请执行以下操作：

   1. 对于**选择加密提供程序**，从菜单中选择一个 **Cavium 密钥存储提供程序**。这些是 AWS CloudHSM 密钥存储提供程序。例如，您可以选择 **RSA \$1 Cavium 密钥存储提供程序**。

   1. 对于**密钥长度**，从中选择一个密钥长度选项。

   1. 对于**选择用于签署此 CA 颁发的证书的哈希算法**，请选择其中一个哈希算法选项。

   选择**下一步**。

1. 对于 **CA 名称**，请执行以下操作：

   1. （可选）编辑公用名。

   1. （可选）键入可分辨名称后缀。

   选择**下一步**。

1. 对于**有效期**，指定时间段（以年、月、周或天为单位）。然后选择**下一步**。

1. 对于**证书数据库**，您可以接受默认值，也可以选择更改数据库和数据库日志的位置。然后选择**下一步**。

1. 对于**确认**，请查看有关 CA 的信息；然后选择**配置**。

1. 选择**关闭**，然后再次选择**关闭**。

你现在有了带的 Windows 服务器 CA AWS CloudHSM。要了解如何使用 CA 签署证书签名请求 (CSR) 的信息，请转到[签署 CSR](#win-ca-sign-csr-sdk3)。

## 第 3 步：使用您的 Windows 服务器证书颁发机构签署证书签名请求 (CSR) AWS CloudHSM
<a name="win-ca-sign-csr-sdk3"></a>

你可以使用你的 Windows 服务器 CA AWS CloudHSM 来签署证书签名请求 (CSR)。要完成这些步骤，您需要一个有效的 CSR。可以通过以下方法来创建 CSR：
+ 使用 OpenSSL
+ 使用 Windows Server Internet Information Services (IIS) 管理器
+ 使用 Microsoft 管理控制台中的证书单元
+ 在 Windows 上使用 **certreq** 命令行实用程序

创建 CSR 的步骤不在本教程的介绍范围之内。如果您有 CSR，则可使用您的 Windows Server CA 登录。

**使用 Windows Server CA 登录 CSR**

1. 如果您尚未完成此操作，请连接到您的 Windows 服务器。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 在 Windows 服务器上，启动**服务器管理器**。

1. 在**服务器管理器**控制面板的右上角，选择**工具**、**证书颁发机构**。

1. 在**证书颁发机构**窗口中，选择您的计算机名称。

1. 在**操作**菜单上，选择**所有任务**、**提交新请求**。

1. 选择 CSR 文件，然后选择**打开**。

1. 在**证书颁发机构**窗口中，双击 **待定的请求**。

1. 选择待定的请求。然后在**操作**菜单上，选择**所有任务**、**颁发**。

1. 在**证书颁发机构**窗口中，双击 **已发出的请求**以查看签署的证书。

1. （可选）要将签署的证书导出到文件中，请完成以下步骤：

   1. 在**证书颁发机构**窗口中，双击证书。

   1. 选择**详细信息**选项卡，然后选择**复制到文件**。

   1. 按照**证书导出向导**的说明操作。

现在，你有一个 Windows 服务器 CA 和一个由 Windows Server CA 签署的有效证书。 AWS CloudHSM

# 使用 Oracle 数据库透明数据加密 (TDE) AWS CloudHSM
<a name="oracle-tde"></a>

透明数据加密（TDE）用于数据库文件加密。使用 TDE，数据库软件可以先对数据进行加密，然后再将其存储在磁盘上。数据库的表列或表空间中的数据通过表密钥或表空间密钥进行加密。Oracle 数据库软件的某些版本提供 TDE。在 Oracle TDE 中，这些密钥通过 TDE 主加密密钥进行加密。通过将 TDE 主加密密钥存储在 AWS CloudHSM 集群 HSMs 中，可以提高安全性。

![\[将 Oracle TDE 主加密密钥存储在 AWS CloudHSM中。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/tde-master-key-in-hsm.png)


在此解决方案中，您将使用安装在 Amazon EC2 实例上的 Oracle Database。Oracle 数据库与 [PKCS \$111 的AWS CloudHSM 软件库集成，用于](pkcs11-library.md)将 TDE 主密钥存储 HSMs 在集群中。

**重要**  
 我们建议在 Amazon EC2 实例上安装 Oracle Database。

完成以下步骤以完成 Oracle TDE 与 AWS CloudHSM的集成。

**Topics**
+ [步骤 1：设置先决条件](#oracle-tde-prerequisites)
+ [步骤 2：更新 Oracle 数据库配置](#oracle-tde-configure-database-and-generate-master-key)
+ [步骤 3：生成 Oracle TDE 主加密密钥](#oracle-tde-generate-master-key)

## 步骤 1：设置先决条件
<a name="oracle-tde-prerequisites"></a>

要完成 Oracle TDE 与的集成 AWS CloudHSM，您需要满足以下条件：
+ 至少有一个 HSM 的活动 AWS CloudHSM 集群。
+ 运行 Amazon Linux 操作系统并安装了以下软件的 Amazon EC2 实例：
  +  AWS CloudHSM 客户端和命令行工具。
  + PKCS \$111 的 AWS CloudHSM 软件库。
  + 甲骨文数据库。 AWS CloudHSM 支持 Oracle TDE 集成。客户端软件开发工具包 5.6 及更高版本支持适用于 Oracle Database 19c 的 Oracle TDE。客户端软件开发工具包 3 支持适用于 Oracle Database 11g 和 12c 的 Oracle TDE。
+ 拥有和管理集群 HSMs 中的 TDE 主加密密钥的加密用户 (CU)。

完成以下步骤可设置所有先决组件。

**设置与 Oracle TDE 集成的先决条件 AWS CloudHSM**

1. 完成 [开始使用](getting-started.md) 中的步骤。完成后，您将拥有一个带一个 HSM 的活动集群。您还将拥有一个运行 Amazon Linux 操作系统的 Amazon EC2 实例。还将安装和配置 AWS CloudHSM 客户端和命令行工具。

1. （可选） HSMs 向您的集群添加更多内容。有关更多信息，请参阅 [向集群添加 HS AWS CloudHSM M](add-hsm.md)。

1. 连接到您的 Amazon C2 客户端实例并执行以下操作：

   1. [安装 PKCS \$111 的 AWS CloudHSM 软件库](pkcs11-library-install.md)。

   1. 安装 Oracle Database。有关更多信息，请参阅 [Oracle Database 文档](https://docs.oracle.com/en/database/)。客户端软件开发工具包 5.6 及更高版本支持适用于 Oracle Database 19c 的 Oracle TDE。客户端软件开发工具包 3 支持适用于 Oracle Database 11g 和 12c 的 Oracle TDE。

   1. 使用 cloudhsm\$1mgmt\$1util 命令行工具在您的集群上创建加密用户 (CU)。有关创建 CU 的更多信息，请参阅[如何使用 CMU 管理 HSM 用户](create-users-cmu.md)和[HSM 用户](manage-hsm-users.md)。

## 步骤 2：更新 Oracle 数据库配置
<a name="oracle-tde-configure-database-and-generate-master-key"></a>

要将 Oracle Database 配置更新为使用您的集群中的 HSM 作为*外部安全模块*，请完成以下步骤。有关外部安全模块的信息，请参阅[《Oracle Database 高级安全指南》](https://docs.oracle.com/database/122/ASOAG/introduction-to-transparent-data-encryption.htm)中的*透明数据加密简介*。

**更新 Oracle 配置**

1. 连接到您的 Amazon EC2 客户端实例。这是在其中安装 Oracle Database 的实例。

1. 为名为 `sqlnet.ora` 的文件创建备份副本。有关此文件的位置，请参阅 Oracle 文档。

1. 使用文本编辑器编辑名为 `sqlnet.ora` 的文件。添加以下行。如果文件中的现有行以 `encryption_wallet_location` 开头，请将现有行替换为以下行。

   ```
   encryption_wallet_location=(source=(method=hsm))
   ```

   保存该文件。

1. 运行以下命令创建 Oracle 数据库期望在其中查找 AWS CloudHSM PKCS \$111 软件库库的库文件的目录。

   ```
   sudo mkdir -p /opt/oracle/extapi/64/hsm
   ```

1. 运行以下命令将 PKCS \$111 文件的 AWS CloudHSM 软件库复制到您在上一步中创建的目录中。

   ```
   sudo cp /opt/cloudhsm/lib/libcloudhsm_pkcs11.so /opt/oracle/extapi/64/hsm/
   ```
**注意**  
`/opt/oracle/extapi/64/hsm` 目录只能包含一个库文件。删除该目录中存在的所有其他文件。

1. 运行以下命令更改 `/opt/oracle` 目录的所有权及其包含的所有内容。

   ```
   sudo chown -R oracle:dba /opt/oracle
   ```

1. 启动 Oracle Database。

## 步骤 3：生成 Oracle TDE 主加密密钥
<a name="oracle-tde-generate-master-key"></a>

要在集群 HSMs 中生成 Oracle TDE 主密钥，请完成以下过程中的步骤。

**生成主密钥**

1. 使用以下命令打开 Oracle SQL\$1Plus。在系统提示时，键入安装 Oracle Database 时设置的系统密码。

   ```
   sqlplus / as sysdba
   ```
**注意**  
使用客户端软件开发工具包 3 生成主密钥时，每次都必须设置 `CLOUDHSM_IGNORE_CKA_MODIFIABLE_FALSE` 环境变量。仅在生成主密钥时需要此变量。有关更多信息，请参阅“问题：Oracle 在主密钥生成过程中设置了 PKCS \$111 属性`CKA_MODIFIABLE`”，但在[有关集成第三方应用程序的已知问题](ki-third-party.md)中 HSM 并不支持该属性。

1. 运行 SQL 语句来创建主加密密钥，如以下示例所示。使用与您的 Oracle Database 的版本对应的语句。*<CU user name>*替换为加密用户 (CU) 的用户名。*<password>*替换为 CU 密码。
**重要**  
仅运行以下命令一次。每次运行此命令时，它都会创建一个新的主加密密钥。
   + 对于 Oracle Database 版本 11，运行以下 SQL 语句。

     ```
     SQL> alter system set encryption key identified by "<CU user name>:<password>";
     ```
   + 对于 Oracle Database 版本 12 和版本 19c，运行以下 SQL 语句。

     ```
     SQL> administer key management set key identified by "<CU user name>:<password>";
     ```

   如果响应是 `System altered` 或 `keystore altered`，则您已成功生成并设置 Oracle TDE 的主密钥。

1. (可选) 运行以下命令来验证 *Oracle wallet* 的状态。

   ```
   SQL> select * from v$encryption_wallet;
   ```

   如果 wallet 未打开，请使用下列命令之一将其打开。*<CU user name>*替换为加密用户 (CU) 的名称。*<password>*替换为 CU 密码。
   + 对于 Oracle 11，运行以下命令以打开 wallet。

     ```
     SQL> alter system set encryption wallet open identified by "<CU user name>:<password>";
     ```

     要手动关闭 wallet，请运行以下命令。

     ```
     SQL> alter system set encryption wallet close identified by "<CU user name>:<password>";
     ```
   + 对于 Oracle 12 和 Oracle 19c，运行以下命令以打开 wallet。

     ```
     SQL> administer key management set keystore open identified by "<CU user name>:<password>";
     ```

     要手动关闭 wallet，请运行以下命令。

     ```
     SQL> administer key management set keystore close identified by "<CU user name>:<password>";
     ```

# 使用 Microsof AWS CloudHSM t SignTool 与签名文件
<a name="third-signtool-toplevel"></a>

AWS CloudHSM 支持使用 Microsoft Signtool 通过客户端 SDK 3 和客户端 SDK 5 签署文件。根据您当前下载的 Client SDK 版本，使用这些工具的步骤会有所不同：以下部分提供了每个 SDK 的信息。

**Topics**
+ [微软客户端 SDK 5 SignTool](signtool-sdk5.md)
+ [微软客户端 SDK 3 SignTool](signtool-sdk3.md)

# 使用微软 SignTool 和客户端 SDK 5 来签署文件
<a name="signtool-sdk5"></a>

在加密和公有密钥基础结构 (PKI) 中，数字签名用于确认数据已由可信实体发送。签名还表明数据在传输过程中未被篡改。签名是使用发送方的私有密钥生成的加密哈希。接收方可以通过使用发送方的公有密钥解密其哈希签名来验证数据的完整性。反过来，发送方有责任维护数字证书。数字证书显示发送方对私有密钥的所有权，并向接收方提供解密所需的公有密钥。只要私钥归发件人所有，签名就可以被信任。 AWS CloudHSM 提供安全的 FIPS 140-2 3 级验证硬件，让您可以通过独家单租户访问来保护这些密钥。

许多组织使用 Microsoft SignTool（一种命令行工具）来签名、验证文件并给文件加上时间戳，以简化代码签名过程。您可以使用安全 AWS CloudHSM 地存储密钥对，直到需要它们为止 SignTool，从而创建易于自动化的签名数据工作流程。

以下主题概述了如何 SignTool 与一起使用 AWS CloudHSM。

**Topics**
+ [步骤 1：设置先决条件](#signtool-sdk5-prereqs)
+ [步骤 2：创建签名请求](#signtool-sdk5-csr)
+ [步骤 3：对文件进行签名](#signtool-sdk5-sign)

## 步骤 1：设置先决条件
<a name="signtool-sdk5-prereqs"></a>

要将 Microsoft SignTool 与配合使用 AWS CloudHSM，你需要满足以下条件：
+ 一个运行 Windows 操作系统的 Amazon EC2 客户端实例。
+ 一个证书颁发机构 (CA)，自我维护或由第三方提供商建立。
+ 与您的 EC2 AWS CloudHSM 实例位于同一个虚拟公有云 (VPC) 中的活动集群。该集群必须包含至少一个 HSM。
+ 在 AWS CloudHSM 集群中拥有和管理密钥的加密用户 (CU)。
+ 未签名文件或可执行文件。
+ Microsoft Windows 软件开发工具包 (SDK)。

**设置在 Windows 中使用的 AWS CloudHSM 先决条件 SignTool**

1. 按照本指南的[入门](getting-started.md)部分中的说明进行操作，启用 Windows EC2 实例和 AWS CloudHSM 集群。

1. 如果你想托管自己的 Windows Server CA，请按照[将 Windows 服务器配置为证书颁发机构中的步骤 1 和 2 进行](win-ca-overview-sdk5.md)操作 AWS CloudHSM。否则，请继续使用您的公开可信的第三方 CA。

1. 在 Windows EC2 实例上下载并安装下列版本的 Microsoft Windows 开发工具包之一：
   + [Microsoft Windows 开发工具包 10](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)
   + [Microsoft Windows 开发工具包 8.1](https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk)
   + [Microsoft Windows 开发工具包 7](https://www.microsoft.com/en-us/download/details.aspx?id=8279)

   `SignTool` 可执行文件是 Windows SDK Signing Tools for Desktop Apps 安装功能的一部分。您可以省略要安装的其他功能（如果您不需要它们）。默认安装位置是：

   ```
   C:\Program Files (x86)\Windows Kits\<SDK version>\bin\<version number>\<CPU architecture>\signtool.exe
   ```

现在，你可以使用 Microsoft Windows SDK、你的 AWS CloudHSM 集群和你的 CA 来[创建签名证书](#signtool-sdk5-csr)。

## 步骤 2：创建签名请求
<a name="signtool-sdk5-csr"></a>

现在您已将 Windows 开发工具包下载到 EC2 实例，您可以使用它来生成证书签名请求 (CSR)。CSR 是未签名的证书，该证书最终将传递给您的 CA 进行签名。在此示例中，我们使用 Windows 开发工具包中包含的 `certreq` 可执行文件来生成 CSR。

**使用 `certreq` 可执行文件生成 CSR**

1. 如果您尚未完成此操作，请连接到您的 Windows EC2 实例。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 创建一个名为 `request.inf` 的文件，其中包含下列行。将 `Subject` 信息替换为该组织的相应信息。有关每个参数的说明，请参阅 [Microsoft 的文档](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1#BKMK_New)。

   ```
   [Version]
   Signature= $Windows NT$
   [NewRequest]
   Subject = "C=<Country>,CN=<www.website.com>,O=<Organization>,OU=<Organizational-Unit>,L=<City>,S=<State>"
   RequestType=PKCS10
   HashAlgorithm = SHA256
   KeyAlgorithm = RSA
   KeyLength = 2048
   ProviderName = "CloudHSM Key Storage Provider"
   KeyUsage = "CERT_DIGITAL_SIGNATURE_KEY_USAGE"
   MachineKeySet = True
   Exportable = False
   ```

1. 运行 `certreq.exe`。在此示例中，我们将 CSR 保存为 `request.csr`。

   ```
   certreq.exe -new request.inf request.csr
   ```

   在内部，将在您的 AWS CloudHSM 集群上生成一个新的密钥对，该密钥对的私钥用于创建 CSR。

1. 将 CSR 提交给 CA。如果您使用的是 Windows Server CA，请执行以下步骤：

   1. 输入以下命令以打开 CA 工具：

      ```
      certsrv.msc
      ```

   1. 在新窗口中，右键单击 CA 服务器的名称。选择**所有任务**，然后选择**提交新请求**。

   1. 导航到 `request.csr` 的位置，然后选择**打开**。

   1. 展开**服务器 CA** 菜单，导航至**待处理请求**文件夹。右键单击您刚刚创建的请求，并在**所有任务**下，选择 **Issue** (发布)。

   1. 现在，导航到**颁发的证书**文件夹（位于**待处理请求**文件夹上）。

   1. 选择**打开**以查看证书，然后选择**详细信息**选项卡。

   1. 选择**复制到文件**以启动证书导出向导。将经 DER 编码的 X.509 文件作为 `signedCertificate.cer` 保存到安全位置。

   1. 退出 CA 工具并使用以下命令，该命令将证书文件移动到 Windows 中的个人证书存储。然后，它可由其他应用程序使用。

      ```
      certreq.exe -accept signedCertificate.cer
      ```

现在，您可以使用导入的证书来[签署文件](#signtool-sdk5-sign)。

## 步骤 3：对文件进行签名
<a name="signtool-sdk5-sign"></a>

现在，您可以使用导入 SignTool 的证书来签署示例文件。为此，您需要知道证书的 SHA-1 哈希或*指纹*。指纹用于确保 SignTool仅使用经过验证的 AWS CloudHSM证书。在此示例中，我们使用 PowerShell 获取证书的哈希值。您还可以使用 CA 的 GUI 或 Windows 开发工具包的 `certutil` 可执行文件。

**获取证书的指纹并使用它来对文件进行签名**

1. 以管理员 PowerShell 身份打开并运行以下命令：

   ```
   Get-ChildItem -path cert:\LocalMachine\My
   ```

   复制返回的 `Thumbprint`。  
![\[证书的哈希将作为指纹返回\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/signtool-hash.png)

1. 导航到其中包含 PowerShell 的目录`SignTool.exe`。默认位置是 `C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64`。

1. 最后，通过运行以下命令来对文件签名。如果命令成功，则 PowerShell 返回成功消息。

   ```
   signtool.exe sign /v /fd sha256 /sha1 <thumbprint> /sm C:\Users\Administrator\Desktop\<test>.ps1
   ```  
![\[已对 .ps1 文件成功签名。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/signtool-last-command.png)

1. （可选）要验证文件上的签名，请使用以下命令：

   ```
   signtool.exe verify /v /pa C:\Users\Administrator\Desktop\<test>.ps1
   ```

# 使用微软 SignTool 和客户端 SDK 3 签署文件
<a name="signtool-sdk3"></a>

在加密和公有密钥基础结构 (PKI) 中，数字签名用于确认数据已由可信实体发送。签名还表明数据在传输过程中未被篡改。签名是使用发送方的私有密钥生成的加密哈希。接收方可以通过使用发送方的公有密钥解密其哈希签名来验证数据的完整性。反过来，发送方有责任维护数字证书。数字证书显示发送方对私有密钥的所有权，并向接收方提供解密所需的公有密钥。只要私钥归发件人所有，签名就可以被信任。 AWS CloudHSM 提供安全的 FIPS 140-2 3 级验证硬件，让您可以通过独家单租户访问来保护这些密钥。

许多组织使用 Microsoft SignTool（一种命令行工具）来签名、验证文件并给文件加上时间戳，以简化代码签名过程。您可以使用安全 AWS CloudHSM 地存储密钥对，直到需要它们为止 SignTool，从而创建易于自动化的签名数据工作流程。

以下主题概述了如何 SignTool 与一起使用 AWS CloudHSM。

**Topics**
+ [步骤 1：设置先决条件](#signtool-sdk3-prereqs)
+ [步骤 2：创建签名请求](#signtool-sdk3-csr)
+ [步骤 3：对文件进行签名](#signtool-sdk3-sign)

## 步骤 1：设置先决条件
<a name="signtool-sdk3-prereqs"></a>

要将 Microsoft SignTool 与配合使用 AWS CloudHSM，你需要满足以下条件：
+ 一个运行 Windows 操作系统的 Amazon EC2 客户端实例。
+ 一个证书颁发机构 (CA)，自我维护或由第三方提供商建立。
+ 与您的 EC2 AWS CloudHSM 实例位于同一个虚拟公有云 (VPC) 中的活动集群。该集群必须包含至少一个 HSM。
+ 在 AWS CloudHSM 集群中拥有和管理密钥的加密用户 (CU)。
+ 未签名文件或可执行文件。
+ Microsoft Windows 软件开发工具包 (SDK)。

**设置在 Windows 中使用的 AWS CloudHSM 先决条件 SignTool**

1. 按照本指南的[入门](getting-started.md)部分中的说明进行操作，启用 Windows EC2 实例和 AWS CloudHSM 集群。

1. 如果你想托管自己的 Windows Server CA，请按照[将 Windows 服务器配置为证书颁发机构中的步骤 1 和 2 进行](win-ca-overview-sdk3.md)操作 AWS CloudHSM。否则，请继续使用您的公开可信的第三方 CA。

1. 在 Windows EC2 实例上下载并安装下列版本的 Microsoft Windows 开发工具包之一：
   + [Microsoft Windows 开发工具包 10](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)
   + [Microsoft Windows 开发工具包 8.1](https://developer.microsoft.com/en-us/windows/downloads/windows-8-1-sdk)
   + [Microsoft Windows 开发工具包 7](https://www.microsoft.com/en-us/download/details.aspx?id=8279)

   `SignTool` 可执行文件是 Windows SDK Signing Tools for Desktop Apps 安装功能的一部分。您可以省略要安装的其他功能（如果您不需要它们）。默认安装位置是：

   ```
   C:\Program Files (x86)\Windows Kits\<SDK version>\bin\<version number>\<CPU architecture>\signtool.exe
   ```

现在，你可以使用 Microsoft Windows SDK、你的 AWS CloudHSM 集群和你的 CA 来[创建签名证书](#signtool-sdk3-csr)。

## 步骤 2：创建签名请求
<a name="signtool-sdk3-csr"></a>

现在您已将 Windows 开发工具包下载到 EC2 实例，您可以使用它来生成证书签名请求 (CSR)。CSR 是未签名的证书，该证书最终将传递给您的 CA 进行签名。在此示例中，我们使用 Windows 开发工具包中包含的 `certreq` 可执行文件来生成 CSR。

**使用 `certreq` 可执行文件生成 CSR**

1. 如果您尚未完成此操作，请连接到您的 Windows EC2 实例。有关详细信息，请参阅《*Amazon EC2 用户指南*》中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 创建一个名为 `request.inf` 的文件，其中包含下列行。将 `Subject` 信息替换为该组织的相应信息。有关每个参数的说明，请参阅 [Microsoft 的文档](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1#BKMK_New)。

   ```
   [Version]
   Signature= $Windows NT$
   [NewRequest]
   Subject = "C=<Country>,CN=<www.website.com>,O=<Organization>,OU=<Organizational-Unit>,L=<City>,S=<State>"
   RequestType=PKCS10
   HashAlgorithm = SHA256
   KeyAlgorithm = RSA
   KeyLength = 2048
   ProviderName = "Cavium Key Storage Provider"
   KeyUsage = "CERT_DIGITAL_SIGNATURE_KEY_USAGE"
   MachineKeySet = True
   Exportable = False
   ```

1. 运行 `certreq.exe`。在此示例中，我们将 CSR 保存为 `request.csr`。

   ```
   certreq.exe -new request.inf request.csr
   ```

   在内部，将在您的 AWS CloudHSM 集群上生成一个新的密钥对，该密钥对的私钥用于创建 CSR。

1. 将 CSR 提交给 CA。如果您使用的是 Windows Server CA，请执行以下步骤：

   1. 输入以下命令以打开 CA 工具：

      ```
      certsrv.msc
      ```

   1. 在新窗口中，右键单击 CA 服务器的名称。选择**所有任务**，然后选择**提交新请求**。

   1. 导航到 `request.csr` 的位置，然后选择**打开**。

   1. 展开**服务器 CA** 菜单，导航至**待处理请求**文件夹。右键单击您刚刚创建的请求，并在**所有任务**下，选择 **Issue** (发布)。

   1. 现在，导航到**颁发的证书**文件夹（位于**待处理请求**文件夹上）。

   1. 选择**打开**以查看证书，然后选择**详细信息**选项卡。

   1. 选择**复制到文件**以启动证书导出向导。将经 DER 编码的 X.509 文件作为 `signedCertificate.cer` 保存到安全位置。

   1. 退出 CA 工具并使用以下命令，该命令将证书文件移动到 Windows 中的个人证书存储。然后，它可由其他应用程序使用。

      ```
      certreq.exe -accept signedCertificate.cer
      ```

现在，您可以使用导入的证书来[签署文件](#signtool-sdk3-sign)。

## 步骤 3：对文件进行签名
<a name="signtool-sdk3-sign"></a>

现在，您可以使用导入 SignTool 的证书来签署示例文件。为此，您需要知道证书的 SHA-1 哈希或*指纹*。指纹用于确保 SignTool仅使用经过验证的 AWS CloudHSM证书。在此示例中，我们使用 PowerShell 获取证书的哈希值。您还可以使用 CA 的 GUI 或 Windows 开发工具包的 `certutil` 可执行文件。

**获取证书的指纹并使用它来对文件进行签名**

1. 以管理员 PowerShell 身份打开并运行以下命令：

   ```
   Get-ChildItem -path cert:\LocalMachine\My
   ```

   复制返回的 `Thumbprint`。  
![\[证书的哈希将作为指纹返回\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/signtool-hash.png)

1. 导航到其中包含 PowerShell 的目录`SignTool.exe`。默认位置是 `C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64`。

1. 最后，通过运行以下命令来对文件签名。如果命令成功，则 PowerShell 返回成功消息。

   ```
   signtool.exe sign /v /fd sha256 /sha1 <thumbprint> /sm C:\Users\Administrator\Desktop\<test>.ps1
   ```  
![\[已对 .ps1 文件成功签名。\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/signtool-last-command.png)

1. （可选）要验证文件上的签名，请使用以下命令：

   ```
   signtool.exe verify /v /pa C:\Users\Administrator\Desktop\<test>.ps1
   ```

# Java Keytool 和 Jarsigner 与 AWS CloudHSM
<a name="third_java-sdk_integration"></a>

AWS CloudHSM 通过客户端 SDK 3 和客户端 SDK 5 提供与 Java Keytool 和 Jarsigner 实用程序的集成。根据您当前下载的 Client SDK 版本，使用这些工具的步骤会有所不同：以下部分提供了每个 SDK 的信息。

**Topics**
+ [Client SDK 5 与 Java Keytool 和 Jarsigner](keystore-third-party-tools_5.md)
+ [Client SDK 3 与 Java Keytool 和 Jarsigner](keystore-third-party-tools.md)

# 使用客户端 SDK 5 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成
<a name="keystore-third-party-tools_5"></a>

AWS CloudHSM 密钥存储是一种特殊用途的 JCE 密钥存储区，它通过第三方工具（如和）使用与硬件安全模块 (HSM) 上的密钥关联的证书。`keytool` `jarsigner` AWS CloudHSM 不在 HSM 上存储证书，因为证书是公开的非机密数据。 AWS CloudHSM 密钥库将证书存储在本地文件中，并将证书映射到您的 HSM 上的相应密钥。

当您使用密 AWS CloudHSM 钥库生成新密钥时，本地密钥存储文件中不会生成任何条目——密钥是在 HSM 上创建的。同样，当您使用 AWS CloudHSM 密钥库搜索密钥时，搜索将传递到 HSM。当您将证书存储在 AWS CloudHSM 密钥库中时，提供程序会验证 HSM 上是否存在具有相应别名的密钥对，然后将提供的证书与相应的密钥对相关联。

**Topics**
+ [先决条件](keystore-prerequisites_5.md)
+ [将密钥库与 Keytool 结合使用](using_keystore_with_keytool_5.md)
+ [将密钥库与 Jarsigner 结合使用](using_keystore_jarsigner_5.md)
+ [已知问题](known-issues-keytool-jarsigner_5.md)

# 使用客户端 SDK 5 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成的先决条件
<a name="keystore-prerequisites_5"></a>

要使用 AWS CloudHSM 密钥库，必须先初始化并配置 AWS CloudHSM JCE SDK。请按照以下步骤进行操作。

## 步骤 1：安装 JCE
<a name="prereq-step-one_5"></a>

要安装 JCE，包括 AWS CloudHSM 客户端先决条件，请按照[安装 Java 库](java-library-install_5.md)的步骤进行操作。

## 步骤 2：将 HSM 登录凭证添加到环境变量
<a name="prereq-step-two_5"></a>

设置环境变量以包含 HSM 登录凭证。

------
#### [ Linux ]

```
$ export HSM_USER=<HSM user name>
```

```
$ export HSM_PASSWORD=<HSM password>
```

------
#### [ Windows ]

```
PS C:\> $Env:HSM_USER=<HSM user name>
```

```
PS C:\> $Env:HSM_PASSWORD=<HSM password>
```

------

**注意**  
 AWS CloudHSM JCE 提供各种登录选项。要在第三方应用程序中使用 AWS CloudHSM 密钥库，必须使用带环境变量的隐式登录。如果要通过应用程序代码使用显式登录，则必须使用 AWS CloudHSM 密钥库构建自己的应用程序。有关更多信息，请参阅有关[使用 AWS CloudHSM 密钥库](alternative-keystore_5.md)的文章。

## 步骤 3：注册 JCE 提供程序
<a name="prereq-step-three_5"></a>

要在 Java CloudProvider 配置中注册 JCE 提供程序，请执行以下步骤：

1. 在 Java 安装中打开 `java.security` 配置文件进行编辑。

1. 在 `java.security` 配置文件中，添加 `com.amazonaws.cloudhsm.jce.provider.CloudHsmProvider` 作为最后一个提供程序。例如，如果 `java.security` 文件中有 9 个提供程序，则将以下提供程序添加为本节中的最后一个提供程序：

   `security.provider.10=com.amazonaws.cloudhsm.jce.provider.CloudHsmProvider`

**注意**  
将 AWS CloudHSM 提供商添加为更高的优先级可能会对系统的性能产生负面影响，因为对于可以安全地卸载到软件的操作，将优先考虑 AWS CloudHSM 提供商。作为最佳实践，请**务必**指定要用于操作的提供商，无论是基于软件的提供商还是基于软件的提供商。 AWS CloudHSM 

**注意**  
在使用带有 AWS CloudHSM 密钥库的 **keytool** 生成密钥时指定 `-providerName`、`-providerclass` 和 `-providerpath` 命令行选项可能会导致错误。

# 使用客户端 SDK 5 将 AWS CloudHSM 密钥库与 keytool 配合使用
<a name="using_keystore_with_keytool_5"></a>

 [Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) 是一个常见的命令行实用程序，用于常见密钥和证书任务。有关 keytool 的完整教程不在 AWS CloudHSM 文档的讨论范围内。本文介绍了在通过密钥库用作信任根时，应与各种 AWS CloudHSM 密钥工具函数一起使用的特定参数。 AWS CloudHSM 

在密钥库中 AWS CloudHSM 使用 keytool 时，请为任何 keytool 命令指定以下参数：

------
#### [ Linux ]

```
-storetype CLOUDHSM -J-classpath< '-J/opt/cloudhsm/java/*'>
```

------
#### [ Windows ]

```
-storetype CLOUDHSM -J-classpath<'-J"C:\Program Files\Amazon\CloudHSM\java\*"'>
```

------

如果要使用 AWS CloudHSM 密钥库创建新的密钥库文件，请参阅[使用 AWS CloudHSM KeyStore 适用于 AWS CloudHSM 客户端 SDK 3](alternative-keystore.md#using_cloudhsm_keystore)。要使用现有密钥库，请使用 keytool 的 –keystore 参数指定密钥库的名称（包括路径）。如果您在 keytool 命令中指定了不存在的密钥存储文件，则 AWS CloudHSM 密钥库会创建一个新的密钥存储文件。

# 使用 keytool 创建新 AWS CloudHSM 密钥
<a name="create_key_keytool_5"></a>

你可以使用 keytool 生成 RSA、AES 和 AWS CloudHSM JCE SDK 支持的密钥 DESede 类型。

**重要**  
通过 keytool 生成的密钥在软件中生成，然后 AWS CloudHSM 作为可提取的永久密钥导入到。

我们强烈建议在 keytool 之外生成不可导出的密钥，然后将相应的证书导入密钥库。如果您通过 keytool 和 Jarsigner 使用可提取的 RSA 或 EC 密钥，则提供程序会从中导出密钥， AWS CloudHSM 然后在本地使用该密钥进行签名操作。

如果您有多个客户端实例连接到您的 AWS CloudHSM 集群，请注意，在一个客户端实例的密钥库中导入证书不会自动使证书在其他客户端实例上可用。要在每个客户端实例上注册密钥和关联证书，您需要运行 Java 应用程序，如 [使用 keyt AWS CloudHSM ool 生成 CSR](generate_csr_using_keytool_5.md) 中所述。或者，您可以在一个客户端上进行必要的更改，并将生成的密钥库文件复制到其他每个客户端实例。

**示例 1：**生成对称 AES-256 密钥，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<secret label>*替换为唯一的标签。

------
#### [ Linux ]

```
$ keytool -genseckey -alias <secret label> -keyalg aes \
	-keysize 256 -keystore example_keystore.store \
	-storetype CloudHSM -J-classpath '-J/opt/cloudhsm/java/*' \
```

------
#### [ Windows ]

```
PS C:\> keytool -genseckey -alias <secret label> -keyalg aes `
	-keysize 256 -keystore example_keystore.store `
	-storetype CloudHSM -J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

**示例 2：**生成 RSA 2048 密钥对，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<RSA key pair label>*替换为唯一的标签。

------
#### [ Linux ]

```
$ keytool -genkeypair -alias <RSA key pair label> \
	-keyalg rsa -keysize 2048 \
	-sigalg sha512withrsa \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -genkeypair -alias <RSA key pair label> `
	-keyalg rsa -keysize 2048 `
	-sigalg sha512withrsa `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

您可以在 Java 库中找到[支持的签名算法](java-lib-supported_5.md#java-sign-verify_5)列表。

# 使用 AWS CloudHSM keytool 删除密钥
<a name="delete_key_using_keytool_5"></a>

密 AWS CloudHSM 钥库不支持删除密钥。您可以使用 [Destroyable](https://devdocs.io/openjdk%7E8/javax/security/auth/destroyable#destroy--) 接口的销毁方法删除密钥。

```
((Destroyable) key).destroy();
```

# 使用 keyt AWS CloudHSM ool 生成 CSR
<a name="generate_csr_using_keytool_5"></a>

如果使用 [适用于 AWS CloudHSM 客户端 SDK 的 OpenSSL 动态引擎 5](openssl-library.md)，您可以在生成证书签名请求 (CSR) 时获得最大的灵活性。以下命令使用 keytool 为具有别名 `example-key-pair` 的密钥对生成 CSR。

------
#### [ Linux ]

```
$ keytool -certreq -alias <key pair label> \
	-file my_csr.csr \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -certreq -alias <key pair label> `
	-file my_csr.csr `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

**注意**  
要从 keytool 使用密钥对，该密钥对必须在指定的密钥库文件中包含一个条目。如果要使用在 keytool 之外生成的密钥对，则必须将密钥和证书元数据导入密钥库中。有关导入密钥库数据的说明，请参阅 [使用 keytool 将中间证书和根证书导入 AWS CloudHSM 密钥存储库](import_cert_using_keytool_5.md)。

# 使用 keytool 将中间证书和根证书导入 AWS CloudHSM 密钥存储库
<a name="import_cert_using_keytool_5"></a>

要将 CA 证书导入 AWS CloudHSM，必须在新导入的证书上启用对完整证书链的验证。以下命令是一个示例。

------
#### [ Linux ]

```
$ keytool -import -trustcacerts -alias rootCAcert \
	-file rootCAcert.cert -keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -import -trustcacerts -alias rootCAcert `
	-file rootCAcert.cert -keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

如果您将多个客户端实例连接到 AWS CloudHSM 集群，则在一个客户端实例的密钥库中导入证书不会自动使该证书在其他客户端实例上可用。您必须在每个客户端实例上导入证书。

# 使用 keytool 从 AWS CloudHSM 密钥库中删除证书
<a name="delete_cert_using_keytool_5"></a>

以下命令显示了如何从 Java keytool 密钥库中删除 AWS CloudHSM 证书的示例。

------
#### [ Linux ]

```
$ keytool -delete -alias mydomain \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -delete -alias mydomain `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

如果您将多个客户端实例连接到 AWS CloudHSM 集群，则删除一个客户端实例密钥存储中的证书不会自动从其他客户端实例中删除该证书。您必须删除每个客户端实例上的证书。

# 使用 keytool 将有效的证书导入 AWS CloudHSM 密钥库
<a name="import_working_cert_using_keytool_5"></a>

签署证书签名请求 (CSR) 后，您可以将其导入 AWS CloudHSM 密钥库并将其与相应的密钥对关联。以下命令是一个示例。

------
#### [ Linux ]

```
$ keytool -importcert -noprompt -alias <key pair label> \
	-file my_certificate.crt \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -importcert -noprompt -alias <key pair label> `
	-file my_certificate.crt `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

别名应该是密钥库中具有关联证书的密钥对。如果密钥是在 keytool 之外生成的，或者在其他客户端实例上生成的，则必须先将密钥和证书元数据导入密钥库中。

证书链必须是可验证的。如果无法验证证书，则可能需要将签名（证书颁发机构）证书导入密钥库，以便验证证书链。

# AWS CloudHSM 使用 keytool 导出证书
<a name="export_cert_using_keytool_5"></a>

以下示例生成二进制 X.509 格式的证书。要从中导出人类可读的证书 AWS CloudHSM，请在`-exportcert`命令中`-rfc`添加。

------
#### [ Linux ]

```
$ keytool -exportcert -alias <key pair label> \
	-file my_exported_certificate.crt \
	-keystore example_keystore.store \
	-storetype CLOUDHSM \
	-J-classpath '-J/opt/cloudhsm/java/*'
```

------
#### [ Windows ]

```
PS C:\> keytool -exportcert -alias <key pair label> `
	-file my_exported_certificate.crt `
	-keystore example_keystore.store `
	-storetype CLOUDHSM `
	-J-classpath '-J"C:\Program Files\Amazon\CloudHSM\java\*"'
```

------

# 使用客户端 SDK 5 在 Jarsigner 中使用 AWS CloudHSM 密钥库
<a name="using_keystore_jarsigner_5"></a>

Jarsigner 是一个流行的命令行实用程序，用于使用安全存储在硬件安全模块（HSM）上的密钥签署 JAR 文件。有关 Jarsigner 的完整教程超出了本文档的 AWS CloudHSM 范围。本节介绍了 Jarsigner 参数，您应该使用这些参数通过 AWS CloudHSM 密钥存储区 AWS CloudHSM 作为信任根进行签名和验证签名。

# 使用 Jarsigner 设置 AWS CloudHSM 密钥和证书
<a name="jarsigner_set_up_certificates_5"></a>

在使用 AWS CloudHSM Jarsigner 签署 JAR 文件之前，请确保您已经设置或完成了以下步骤：

1. 按照 [AWS CloudHSM 密钥库先决条件](keystore-prerequisites_5.md)中的指导操作。

1. 设置您的签名密钥以及相关的证书和证书链，这些证书和证书链应存储在当前服务器或客户端实例的 AWS CloudHSM 密钥存储中。在上创建密钥， AWS CloudHSM 然后将关联的元数据导入您的 AWS CloudHSM 密钥存储区。如果要使用 keytool 设置密钥和证书，请参阅 [使用 keytool 创建新 AWS CloudHSM 密钥](create_key_keytool_5.md)。如果您使用多个客户端实例来签名 JARs，请创建密钥并导入证书链。然后将生成的密钥库文件复制到每个客户端实例。如果您经常生成新密钥，您可能会发现将证书单独导入到每个客户端实例更容易。

1. 整个证书链应该是可验证的。要使证书链可验证，您可能需要将 CA 证书和中间证书添加到 AWS CloudHSM 密钥库中。请参阅 [使用 AWS CloudHSM 和 Jarsigner 对 Jarsigner 文件进行签名](jarsigner_sign_jar_using_hsm_jarsigner_5.md) 中的代码片段，了解有关使用 Java 代码验证证书链的说明。如果您愿意，可以使用 keytool 导入证书。有关使用 keytool 的说明，请参阅 [使用 keytool 将中间证书和根证书导入 AWS CloudHSM 密钥存储库](import_cert_using_keytool_5.md)。

# 使用 AWS CloudHSM 和 Jarsigner 对 Jarsigner 文件进行签名
<a name="jarsigner_sign_jar_using_hsm_jarsigner_5"></a>

使用以下命令使用和 Jarsigner 对 JAR 文件 AWS CloudHSM 进行签名：

------
#### [ Linux; ]

适用于 OpenJDK 8

```
jarsigner -keystore example_keystore.store \
	-signedjar signthisclass_signed.jar \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass.jar <key pair label>
```

适用于 OpenJDK 11、OpenJDK 17 和 OpenJDK 21

```
jarsigner -keystore example_keystore.store \
	-signedjar signthisclass_signed.jar \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass.jar <key pair label>
```

------
#### [ Windows ]

公开版 JDK8

```
jarsigner -keystore example_keystore.store `
	-signedjar signthisclass_signed.jar `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*;C:\Program Files\Java\jdk1.8.0_331\lib\tools.jar' `
	 "-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass.jar <key pair label>
```

适用于 OpenJDK 11、OpenJDK 17 和 OpenJDK 21

```
jarsigner -keystore example_keystore.store `
	-signedjar signthisclass_signed.jar `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*'`
	 "-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass.jar <key pair label>
```

------

使用以下命令验证已签名的 JAR：

------
#### [ Linux ]

公开版 JDK8

```
jarsigner -verify \
	-keystore example_keystore.store \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass_signed.jar <key pair label>
```

适用于 OpenJDK 11、OpenJDK 17 和 OpenJDK 21

```
jarsigner -verify \
	-keystore example_keystore.store \
	-sigalg sha512withrsa \
	-storetype CloudHSM \
	-J-classpath '-J/opt/cloudhsm/java/*' \
	-J-Djava.library.path=/opt/cloudhsm/lib \
	signthisclass_signed.jar <key pair label>
```

------
#### [ Windows ]

适用于 OpenJDK 8

```
jarsigner -verify `
	-keystore example_keystore.store `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*;C:\Program Files\Java\jdk1.8.0_331\lib\tools.jar' `
	"-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass_signed.jar <key pair label>
```

适用于 OpenJDK 11、OpenJDK 17 和 OpenJDK 21

```
jarsigner -verify `
	-keystore example_keystore.store `
	-sigalg sha512withrsa `
	-storetype CloudHSM `
	-J-classpath '-JC:\Program Files\Amazon\CloudHSM\java\*`
	"-J-Djava.library.path='C:\Program Files\Amazon\CloudHSM\lib\'" `
	signthisclass_signed.jar <key pair label>
```

------

# 使用客户端 SDK 5 AWS CloudHSM 集成 Java Keytool 和 Jarsigner 的已知问题
<a name="known-issues-keytool-jarsigner_5"></a>

以下列表提供了使用 Client SDK 5 将 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成的当前已知问题列表。

1. 我们不支持 Keytool 和 Jarsigner 的 EC 密钥。

# 使用客户端 SDK 3 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成
<a name="keystore-third-party-tools"></a>

AWS CloudHSM 密钥存储是一种特殊用途的 JCE 密钥存储区，它通过第三方工具（如和）使用与硬件安全模块 (HSM) 上的密钥关联的证书。`keytool` `jarsigner` AWS CloudHSM 不在 HSM 上存储证书，因为证书是公开的非机密数据。 AWS CloudHSM 密钥库将证书存储在本地文件中，并将证书映射到您的 HSM 上的相应密钥。

当您使用密 AWS CloudHSM 钥库生成新密钥时，本地密钥存储文件中不会生成任何条目——密钥是在 HSM 上创建的。同样，当您使用 AWS CloudHSM 密钥库搜索密钥时，搜索将传递到 HSM。当您将证书存储在 AWS CloudHSM 密钥库中时，提供程序会验证 HSM 上是否存在具有相应别名的密钥对，然后将提供的证书与相应的密钥对相关联。

**Topics**
+ [先决条件](keystore-prerequisites.md)
+ [将密钥库与 Keytool 结合使用](using_keystore_with_keytool.md)
+ [将密钥库与 jarsigner 结合使用](using_keystore_jarsigner.md)
+ [已知问题](known-issues-keytool-jarsigner.md)
+ [向密钥库注册预先存在的密钥](register-pre-existing-keys-with-keystore.md)

# 使用客户端 SDK AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成的先决条件 3
<a name="keystore-prerequisites"></a>

要使用 AWS CloudHSM 密钥库，必须先初始化并配置 AWS CloudHSM JCE SDK。请按照以下步骤进行操作。

## 步骤 1：安装 JCE
<a name="prereq-step-one"></a>

要安装 JCE，包括 AWS CloudHSM 客户端先决条件，请按照[安装 Java 库](java-library-install.md)的步骤进行操作。

## 步骤 2：将 HSM 登录凭证添加到环境变量
<a name="prereq-step-two"></a>

设置环境变量以包含 HSM 登录凭证。

```
export HSM_PARTITION=PARTITION_1
export HSM_USER=<HSM user name> 
export HSM_PASSWORD=<HSM password>
```

**注意**  
CloudHSM JCE 提供各种登录选项。要将 AWS CloudHSM 密钥存储用于第三方应用程序，必须使用带环境变量的隐式登录。如果要通过应用程序代码使用显式登录，则必须使用 AWS CloudHSM 密钥库构建自己的应用程序。有关更多信息，请参阅有关[使用 AWS CloudHSM 密钥库](alternative-keystore.md)的文章。

## 步骤 3：注册 JCE 提供程序
<a name="prereq-step-three"></a>

要注册 JCE 提供程序，请在 Java CloudProvider 配置中进行注册。

1. 在 Java 安装中打开 java.security 配置文件进行编辑。

1. 在 java.security 配置文件中，添加 `com.cavium.provider.CaviumProvider` 作为最后一个提供程序。例如，如果 java.security 文件中有 9 个提供程序，则将以下提供程序添加为本部分中的最后一个提供程序。将 Cavium 提供程序添加为一个更高的优先级可能会对您的系统性能产生负面影响。

   `security.provider.10=com.cavium.provider.CaviumProvider`
**注意**  
使用 keytool 时，高级用户可能习惯于指定 `-providerName`、`-providerclass` 和 `-providerpath` 命令行选项，而不是更新安全配置文件。如果您在使用密钥存储库生成密钥时尝试指定命令行选项，则会导致错误。 AWS CloudHSM 

# 使用客户端 SDK 3 将 AWS CloudHSM 密钥库与 keytool 配合使用
<a name="using_keystore_with_keytool"></a>

[Keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html) 是一个常见的命令行实用程序，用于 Linux 系统上的常见密钥和证书任务。有关 keytool 的完整教程不在 AWS CloudHSM 文档的讨论范围内。本文介绍了在通过密钥库用作信任根时，应与各种 AWS CloudHSM 密钥工具函数一起使用的特定参数。 AWS CloudHSM 

在密钥库中 AWS CloudHSM 使用 keytool 时，请为任何 keytool 命令指定以下参数：

```
-storetype CLOUDHSM \
		-J-classpath '-J/opt/cloudhsm/java/*' \
		-J-Djava.library.path=/opt/cloudhsm/lib
```

如果要使用 AWS CloudHSM 密钥库创建新的密钥库文件，请参阅[使用 AWS CloudHSM KeyStore 适用于 AWS CloudHSM 客户端 SDK 3](alternative-keystore.md#using_cloudhsm_keystore)。要使用现有密钥库，请使用 keytool 的 –keystore 参数指定密钥库的名称（包括路径）。如果您在 keytool 命令中指定了不存在的密钥存储文件，则 AWS CloudHSM 密钥库会创建一个新的密钥存储文件。

# 使用 keytool 创建新 AWS CloudHSM 密钥
<a name="create_key_keytool"></a>

你可以使用 keytool 生成 AWS CloudHSM JCE SDK 支持的任何类型的密钥。请参阅 Java 库中[支持的密钥](java-lib-supported.md#java-keys)文章中的密钥和长度的完整列表。

**重要**  
通过 keytool 生成的密钥在软件中生成，然后 AWS CloudHSM 作为可提取的永久密钥导入到。

直接在硬件安全模块 (HSM) 上创建不可提取的密钥，然后将其与 keytool 或 Jarsigner 一起使用的说明见向密钥库[注册](register-pre-existing-keys-with-keystore.md)已存在的密钥中的代码示例。 AWS CloudHSM 我们强烈建议在 keytool 之外生成不可导出的密钥，然后将相应的证书导入密钥库。如果您通过 keytool 和 jarsigner 使用可提取的 RSA 或 EC 密钥，则提供程序会从中导出密钥， AWS CloudHSM 然后在本地使用该密钥进行签名操作。

如果您有多个客户端实例连接到 CloudHSM 集群，请注意，在一个客户端实例的密钥库上导入证书不会自动使证书在其他客户端实例上可用。要在每个客户端实例上注册密钥和关联证书，您需要运行 Java 应用程序，如[使用 Keytool 生成 CSR](generate_csr_using_keytool.md) 中所述。或者，您可以在一个客户端上进行必要的更改，并将生成的密钥库文件复制到其他每个客户端实例。

**示例 1：**生成对称 AES-256 密钥，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<secret label>*替换为唯一的标签。

```
keytool -genseckey -alias <secret label> -keyalg aes \
		-keysize 256 -keystore example_keystore.store \
		-storetype CloudHSM -J-classpath '-J/opt/cloudhsm/java/*' \
		-J-Djava.library.path=/opt/cloudhsm/lib/
```

**示例 2：**生成 RSA 2048 密钥对，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<RSA key pair label>*替换为唯一的标签。

```
keytool -genkeypair -alias <RSA key pair label> \
        -keyalg rsa -keysize 2048 \
        -sigalg sha512withrsa \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

**示例 3：**生成 p256 ED 密钥，并将其保存在工作目录中名为“example\$1keystore.store”的密钥库文件中。*<ec key pair label>*替换为唯一的标签。

```
keytool -genkeypair -alias <ec key pair label> \
        -keyalg ec -keysize 256 \
        -sigalg SHA512withECDSA \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

您可以在 Java 库中找到[支持的签名算法](java-lib-supported.md#java-sign-verify)列表。

# 使用 AWS CloudHSM keytool 删除密钥
<a name="delete_key_using_keytool"></a>

密 AWS CloudHSM 钥库不支持删除密钥。要删除密钥，必须使用 AWS CloudHSM的命令行工具的`deleteKey`功能[使用 KM AWS CloudHSM U 删除密钥](key_mgmt_util-deleteKey.md)。

# 使用 keyt AWS CloudHSM ool 生成 CSR
<a name="generate_csr_using_keytool"></a>

如果使用 [适用于 AWS CloudHSM 客户端 SDK 的 OpenSSL 动态引擎 5](openssl-library.md)，您可以在生成证书签名请求 (CSR) 时获得最大的灵活性。以下命令使用 keytool 为具有别名 `example-key-pair` 的密钥对生成 CSR。

```
keytool -certreq -alias <key pair label> \
        -file example_csr.csr \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

**注意**  
要从 keytool 使用密钥对，该密钥对必须在指定的密钥库文件中包含一个条目。如果要使用在 keytool 之外生成的密钥对，则必须将密钥和证书元数据导入密钥库中。有关导入密钥库数据的说明，请参阅[使用 Keytool 将中间证书和根证书导入 AWS CloudHSM 密钥库](import_cert_using_keytool.md)。

# 使用 keytool 将中间证书和根证书导入 AWS CloudHSM 密钥存储库
<a name="import_cert_using_keytool"></a>

要将 CA 证书导入 AWS CloudHSM，必须在新导入的证书上启用对完整证书链的验证。以下命令是一个示例。

```
keytool -import -trustcacerts -alias rootCAcert \
        -file rootCAcert.cert -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

如果您将多个客户端实例连接到 AWS CloudHSM 集群，则在一个客户端实例的密钥库中导入证书不会自动使该证书在其他客户端实例上可用。您必须在每个客户端实例上导入证书。

# 使用 keytool 从 AWS CloudHSM 密钥库中删除证书
<a name="delete_cert_using_keytool"></a>

以下命令显示了如何从 Java keytool 密钥库中删除 AWS CloudHSM 证书的示例。

```
keytool -delete -alias mydomain -keystore \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

如果您将多个客户端实例连接到 AWS CloudHSM 集群，则删除一个客户端实例密钥存储中的证书不会自动从其他客户端实例中删除该证书。您必须删除每个客户端实例上的证书。

# 使用 keytool 将有效的证书导入 AWS CloudHSM 密钥库
<a name="import_working_cert_using_keytool"></a>

签署证书签名请求 (CSR) 后，您可以将其导入 AWS CloudHSM 密钥库并将其与相应的密钥对关联。以下命令是一个示例。

```
keytool -importcert -noprompt -alias <key pair label> \
        -file example_certificate.crt \
        -keystore example_keystore.store
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

别名应该是密钥库中具有关联证书的密钥对。如果密钥是在 keytool 之外生成的，或者在其他客户端实例上生成的，则必须先将密钥和证书元数据导入密钥库中。有关导入证书元数据的说明，请参阅向密钥[库注册已存在的密钥](register-pre-existing-keys-with-keystore.md)中的代码示例。 AWS CloudHSM 

证书链必须是可验证的。如果无法验证证书，则可能需要将签名（证书颁发机构）证书导入密钥库，以便验证证书链。

# AWS CloudHSM 使用 keytool 导出证书
<a name="export_cert_using_keytool"></a>

以下示例生成二进制 X.509 格式的证书。要从中导出人类可读的证书 AWS CloudHSM，请在`-exportcert`命令中`-rfc`添加。

```
keytool -exportcert -alias <key pair label> \
        -file example_exported_certificate.crt \
        -keystore example_keystore.store \
        -storetype CLOUDHSM \
        -J-classpath '-J/opt/cloudhsm/java/*' \
        -J-Djava.library.path=/opt/cloudhsm/lib/
```

# 使用客户端 SDK 3 将 AWS CloudHSM 密钥存储与 Jarsigner 配合使用
<a name="using_keystore_jarsigner"></a>

Jarsigner 是一个流行的命令行实用程序，用于使用安全存储在硬件安全模块（HSM）上的密钥签署 JAR 文件。有关 Jarsigner 的完整教程超出了本文档的 AWS CloudHSM 范围。本节介绍了 Jarsigner 参数，您应该使用这些参数通过 AWS CloudHSM 密钥存储区 AWS CloudHSM 作为信任根进行签名和验证签名。

# 使用 Jarsigner 设置 AWS CloudHSM 密钥和证书
<a name="jarsigner_set_up_certificates"></a>

在使用 AWS CloudHSM Jarsigner 签署 JAR 文件之前，请确保您已经设置或完成了以下步骤：

1. 按照 [AWS CloudHSM 密钥库先决条件](keystore-prerequisites.md)中的指导操作。

1. 设置您的签名密钥以及相关的证书和证书链，这些证书和证书链应存储在当前服务器或客户端实例的 AWS CloudHSM 密钥存储中。在上创建密钥， AWS CloudHSM 然后将关联的元数据导入您的 AWS CloudHSM 密钥存储区。使用向密钥[库注册预先存在的 AWS CloudHSM 密钥](register-pre-existing-keys-with-keystore.md)中的代码示例将元数据导入密钥库。如果要使用 keytool 设置密钥和证书，请参阅 [使用 keytool 创建新 AWS CloudHSM 密钥](create_key_keytool.md)。如果您使用多个客户端实例来签名 JARs，请创建密钥并导入证书链。然后将生成的密钥库文件复制到每个客户端实例。如果您经常生成新密钥，您可能会发现将证书单独导入到每个客户端实例更容易。

1. 整个证书链应该是可验证的。要使证书链可验证，您可能需要将 CA 证书和中间证书添加到 AWS CloudHSM 密钥库中。有关使用 Java 代码验证证书链的说明[，请参阅使用对 Jarsigner 文件进行签名中的代码片段， AWS CloudHSM 以及](jarsigner_sign_jar_using_hsm_jarsigner.md) Jarsigner。如果您愿意，可以使用 keytool 导入证书。有关使用 keytool 的说明，请参阅[使用 Keytool 将中间证书和根证书导入 AWS CloudHSM 密钥](import_cert_using_keytool.md)库。

# 使用 AWS CloudHSM 和 Jarsigner 对 Jarsigner 文件进行签名
<a name="jarsigner_sign_jar_using_hsm_jarsigner"></a>

使用以下命令使用和 jarsigner 对 JAR 文件 AWS CloudHSM 进行签名：

```
jarsigner -keystore example_keystore.store \
        -signedjar signthisclass_signed.jar \
        -sigalg sha512withrsa \
        -storetype CloudHSM \
        -J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
        -J-Djava.library.path=/opt/cloudhsm/lib \
        signthisclass.jar <key pair label>
```

使用以下命令验证已签名的 JAR：

```
jarsigner -verify \
        -keystore example_keystore.store \
        -sigalg sha512withrsa \
        -storetype CloudHSM \
        -J-classpath '-J/opt/cloudhsm/java/*:/usr/lib/jvm/java-1.8.0/lib/tools.jar' \
        -J-Djava.library.path=/opt/cloudhsm/lib \
        signthisclass_signed.jar <key pair label>
```

# 使用客户端 SDK AWS CloudHSM 集成 Java Keytool 和 Jarsigner 的已知问题 3
<a name="known-issues-keytool-jarsigner"></a>

以下列表提供了使用客户端 SDK 3 与 Java Keytool AWS CloudHSM 和 Jarsigner 集成的当前已知问题列表。
+ 使用 keytool 生成密钥时，提供程序配置中的第一个提供程序不能是。 CaviumProvider
+ 使用 keytool 生成密钥时，安全配置文件中的第一个（受支持的）提供程序将用于生成密钥。这通常是一个软件提供程序。然后，生成的密钥会被赋予一个别名，并在密钥添加过程中作为永久（令牌）密钥导入到 AWS CloudHSM HSM 中。
+  将 keytool 与 AWS CloudHSM 密钥存储一起使用时`-providerName`，请勿在命令行中指定`-providerclass`、或`-providerpath`选项。在安全提供程序文件中指定这些选项，如[密钥库先决条件](keystore-prerequisites.md)中所述。
+ 通过 keytool 和 Jarsigner 使用不可提取的 EC 密钥时，Sunec 提供程序 removed/disabled 必须位于 java.security 文件中的提供者列表中。如果您通过 keytool 和 Jarsigner 使用可提取的 EC 密钥，则提供程序会从 AWS CloudHSM HSM 中导出密钥位并在本地使用该密钥进行签名操作。我们不建议您将可导出的密钥与 keytool 或 Jarsigner 一起使用。

# 在密钥库中注册先前存在的密 AWS CloudHSM 钥
<a name="register-pre-existing-keys-with-keystore"></a>

为了最大限度地提高属性和标签的安全性和灵活性，我们建议您使用 [key\$1mgmt\$1](generate-keys.md) util 生成 AWS CloudHSM 签名密钥。您还可以使用 Java 应用程序在 AWS CloudHSM中生成密钥。

以下部分提供了一个代码示例，演示如何在 HSM 上生成新的密钥对，并使用导入到密钥库中的 AWS CloudHSM 现有密钥对其进行注册。导入的密钥可与第三方工具（如 keytool 和 Jarsigner）一起使用。

要使用预先存在的密钥，请修改代码示例以通过标签查找密钥，而不是生成新密钥。上的 [KeyUtilitiesRunner.java 示例中提供了按标签查找密钥的 GitHub示例](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/KeyUtilitiesRunner.java)代码。

**重要**  
在本地密钥存储库中注册存储 AWS CloudHSM 的密钥不会导出该密钥。注册密钥后，密钥库会注册密钥的别名（或标签），并将本地存储证书对象与 AWS CloudHSM上的密钥对关联。只要密钥对创建为不可导出的对象，密钥位就不会离开 HSM。

```
                      	
                      	
                      	//
 // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 //
 // Permission is hereby granted, free of charge, to any person obtaining a copy of this
 // software and associated documentation files (the "Software"), to deal in the Software
 // without restriction, including without limitation the rights to use, copy, modify,
 // merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so.
 //
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
package com.amazonaws.cloudhsm.examples;

import com.cavium.key.CaviumKey;
import com.cavium.key.parameter.CaviumAESKeyGenParameterSpec;
import com.cavium.key.parameter.CaviumRSAKeyGenParameterSpec;
import com.cavium.asn1.Encoder;
import com.cavium.cfm2.Util;

import javax.crypto.KeyGenerator;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;

import java.math.BigInteger;

import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.KeyStore.PasswordProtection;
import java.security.KeyStore.PrivateKeyEntry;
import java.security.KeyStore.Entry;

import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;

//
// KeyStoreExampleRunner demonstrates how to load a keystore, and associate a certificate with a
// key in that keystore.
//
// This example relies on implicit credentials, so you must setup your environment correctly.
//
// https://docs.aws.amazon.com/cloudhsm/latest/userguide/java-library-install.html#java-library-credentials
//

public class KeyStoreExampleRunner {

     private static byte[] COMMON_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x03 };
     private static byte[] COUNTRY_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x06 };
     private static byte[] LOCALITY_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x07 };
     private static byte[] STATE_OR_PROVINCE_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x08 };
     private static byte[] ORGANIZATION_NAME_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x0A };
     private static byte[] ORGANIZATION_UNIT_OID = new byte[] { (byte) 0x55, (byte) 0x04, (byte) 0x0B };

     private static String helpString = "KeyStoreExampleRunner%n" +
            "This sample demonstrates how to load and store keys using a keystore.%n%n" +
            "Options%n" +
            "\t--help\t\t\tDisplay this message.%n" +
            "\t--store <filename>\t\tPath of the keystore.%n" +
            "\t--password <password>\t\tPassword for the keystore (not your CU password).%n" +
            "\t--label <label>\t\t\tLabel to store the key and certificate under.%n" +
            "\t--list\t\t\tList all the keys in the keystore.%n%n";

    public static void main(String[] args) throws Exception {
        Security.addProvider(new com.cavium.provider.CaviumProvider());
        KeyStore keyStore = KeyStore.getInstance("CloudHSM");

        String keystoreFile = null;
        String password = null;
        String label = null;
        boolean list = false;
        for (int i = 0; i < args.length; i++) {
            String arg = args[i];
            switch (args[i]) {
                case "--store":
                    keystoreFile = args[++i];
                    break;
                case "--password":
                    password = args[++i];
                    break;
                case "--label":
                    label = args[++i];
                    break;
                case "--list":
                    list = true;
                    break;
                case "--help":
                    help();
                    return;
            }
        }

        if (null == keystoreFile || null == password) {
            help();
            return;
        }

        if (list) {
            listKeys(keystoreFile, password);
            return;
        }

        if (null == label) {
            label = "Keystore Example Keypair";
        }

        //
        // This call to keyStore.load() will open the pkcs12 keystore with the supplied
        // password and connect to the HSM. The CU credentials must be specified using
        // standard CloudHSM login methods.
        //
        try {
            FileInputStream instream = new FileInputStream(keystoreFile);
            keyStore.load(instream, password.toCharArray());
        } catch (FileNotFoundException ex) {
            System.err.println("Keystore not found, loading an empty store");
            keyStore.load(null, null);
        }

        PasswordProtection passwd = new PasswordProtection(password.toCharArray());
        System.out.println("Searching for example key and certificate...");

        PrivateKeyEntry keyEntry = (PrivateKeyEntry) keyStore.getEntry(label, passwd);
        if (null == keyEntry) {
            //
            // No entry was found, so we need to create a key pair and associate a certificate.
            // The private key will get the label passed on the command line. The keystore alias
            // needs to be the same as the private key label. The public key will have ":public"
            // appended to it. The alias used in the keystore will We associate the certificate
            // with the private key.
            //
            System.out.println("No entry found, creating...");
            KeyPair kp = generateRSAKeyPair(2048, label + ":public", label);
            System.out.printf("Created a key pair with the handles %d/%d%n", ((CaviumKey) kp.getPrivate()).getHandle(), ((CaviumKey) kp.getPublic()).getHandle());

            //
            // Generate a certificate and associate the chain with the private key.
            //
            Certificate self_signed_cert = generateCert(kp);
            Certificate[] chain = new Certificate[1];
            chain[0] = self_signed_cert;
            PrivateKeyEntry entry = new PrivateKeyEntry(kp.getPrivate(), chain);

            //
            // Set the entry using the label as the alias and save the store.
            // The alias must match the private key label.
            //
            keyStore.setEntry(label, entry, passwd);

            FileOutputStream outstream = new FileOutputStream(keystoreFile);
            keyStore.store(outstream, password.toCharArray());
            outstream.close();

            keyEntry = (PrivateKeyEntry) keyStore.getEntry(label, passwd);
        }

        long handle = ((CaviumKey) keyEntry.getPrivateKey()).getHandle();
        String name = keyEntry.getCertificate().toString();
        System.out.printf("Found private key %d with certificate %s%n", handle, name);
    }

    private static void help() {
        System.out.println(helpString);
    }

    //
    // Generate a non-extractable / non-persistent RSA keypair.
    // This method allows us to specify the public and private labels, which
    // will make KeyStore aliases easier to understand.
    //
    public static KeyPair generateRSAKeyPair(int keySizeInBits, String publicLabel, String privateLabel)
            throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchProviderException {

        boolean isExtractable = false;
        boolean isPersistent = false;
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("rsa", "Cavium");
        CaviumRSAKeyGenParameterSpec spec = new CaviumRSAKeyGenParameterSpec(keySizeInBits, new BigInteger("65537"), publicLabel, privateLabel, isExtractable, isPersistent);

        keyPairGen.initialize(spec);

        return keyPairGen.generateKeyPair();
    }

    //
    // Generate a certificate signed by a given keypair.
    //
    private static Certificate generateCert(KeyPair kp) throws CertificateException {
        CertificateFactory cf = CertificateFactory.getInstance("X509");
        PublicKey publicKey = kp.getPublic();
        PrivateKey privateKey = kp.getPrivate();
        byte[] version = Encoder.encodeConstructed((byte) 0, Encoder.encodePositiveBigInteger(new BigInteger("2"))); // version 1
        byte[] serialNo = Encoder.encodePositiveBigInteger(new BigInteger(1, Util.computeKCV(publicKey.getEncoded())));

        // Use the SHA512 OID and algorithm.
        byte[] signatureOid = new byte[] {
            (byte) 0x2A, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xF7, (byte) 0x0D, (byte) 0x01, (byte) 0x01, (byte) 0x0D };
        String sigAlgoName = "SHA512WithRSA";

         byte[] signatureId = Encoder.encodeSequence(
                                         Encoder.encodeOid(signatureOid),
                                         Encoder.encodeNull());

         byte[] issuer = Encoder.encodeSequence(
                                     encodeName(COUNTRY_NAME_OID, "<Country>"),
                                     encodeName(STATE_OR_PROVINCE_NAME_OID, "<State>"),
                                     encodeName(LOCALITY_NAME_OID, "<City>"),
                                     encodeName(ORGANIZATION_NAME_OID, "<Organization>"),
                                     encodeName(ORGANIZATION_UNIT_OID, "<Unit>"),
                                     encodeName(COMMON_NAME_OID, "<CN>")
                                 );

         Calendar c = Calendar.getInstance();
         c.add(Calendar.DAY_OF_YEAR, -1);
         Date notBefore = c.getTime();
         c.add(Calendar.YEAR, 1);
         Date notAfter = c.getTime();
         byte[] validity = Encoder.encodeSequence(
                                         Encoder.encodeUTCTime(notBefore),
                                         Encoder.encodeUTCTime(notAfter)
                                     );
         byte[] key = publicKey.getEncoded();

         byte[] certificate = Encoder.encodeSequence(
                                         version,
                                         serialNo,
                                         signatureId,
                                         issuer,
                                         validity,
                                         issuer,
                                         key);
         Signature sig;
         byte[] signature = null;
         try {
             sig = Signature.getInstance(sigAlgoName, "Cavium");
             sig.initSign(privateKey);
             sig.update(certificate);
             signature = Encoder.encodeBitstring(sig.sign());

         } catch (Exception e) {
             System.err.println(e.getMessage());
             return null;
         }

         byte [] x509 = Encoder.encodeSequence(
                         certificate,
                         signatureId,
                         signature
                         );
         return cf.generateCertificate(new ByteArrayInputStream(x509));
    }

     //
     // Simple OID encoder.
     // Encode a value with OID in ASN.1 format
     //
     private static byte[] encodeName(byte[] nameOid, String value) {
         byte[] name = null;
         name = Encoder.encodeSet(
                     Encoder.encodeSequence(
                             Encoder.encodeOid(nameOid),
                             Encoder.encodePrintableString(value)
                     )
                 );
         return name;
     }

    //
    // List all the keys in the keystore.
    //
    private static void listKeys(String keystoreFile, String password) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("CloudHSM");

        try {
            FileInputStream instream = new FileInputStream(keystoreFile);
            keyStore.load(instream, password.toCharArray());
        } catch (FileNotFoundException ex) {
            System.err.println("Keystore not found, loading an empty store");
            keyStore.load(null, null);
        }

        for(Enumeration<String> entry = keyStore.aliases(); entry.hasMoreElements();) {
            System.out.println(entry.nextElement());
        }
    }

}
```

# 使用微软清单生成和编辑工具 (Mage.exe) 对文件 AWS CloudHSM 进行签名
<a name="third-magetool"></a>

**注意**  
AWS CloudHSM 仅支持适用于.NET Framework 4.8.1 及更高版本的 Windows SDK 中包含的 64 位 Mage 工具。

以下主题概述了如何将 [Mage.exe](https://learn.microsoft.com/en-us/dotnet/framework/tools/mage-exe-manifest-generation-and-editing-tool) 与配合使用 AWS CloudHSM。

**Topics**
+ [步骤 1：设置先决条件](#magetool-prereqs)
+ [步骤 2：创建签名请求](#magetool-csr)
+ [步骤 3：对文件进行签名](#magetool-sign)

## 步骤 1：设置先决条件
<a name="magetool-prereqs"></a>

要将 Microsoft Mage.exe 与配合使用 AWS CloudHSM，你需要满足以下条件：
+ 运行 Windows 操作系统的亚马逊 EC2 实例
+ 一个证书颁发机构（CA），自我维护或来自第三方提供商
+ 与您的 EC2 实例位于同一个虚拟私有云 (VPC) 中的活动 AWS CloudHSM 集群，且至少有一个 HSM
+ 在 AWS CloudHSM 集群中拥有和管理密钥的加密用户 (CU)
+ 未签名文件或可执行文件
+ Microsoft Windows 软件开发工具包（SDK）

**设置 AWS CloudHSM 与 Mage.exe 一起使用的先决条件**

1. 按照本指南[入门部分中的说明启动](getting-started.md) Windows EC2 实例和 AWS CloudHSM 集群。

1. 如果你想托管自己的 Windows Server CA，请[使用完成将 Windows 服务器配置为证书颁发机构](win-ca-overview-sdk5.md)中的步骤 1 和步骤 2 AWS CloudHSM。否则，请使用您的公开可信的第三方 CA。

1. 在你的 Windows EC2 实例上下载并安装适用于.NET Framework 4.8.1 或更高版本的微软 Windows SDK：
   + [Microsoft Windows 开发工具包 10](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)

   `mage.exe` 可执行文件是 Windows SDK 工具的一部分。默认安装位置是：

   ```
   C:\Program Files (x86)\Windows Kits\<SDK version>\bin\<version number>\x64\Mage.exe
   ```

完成这些步骤后，你可以使用 Microsoft Windows SDK、你的 AWS CloudHSM 集群和你的 CA 来[创建签名证书](#magetool-csr)。

## 步骤 2：创建签名请求
<a name="magetool-csr"></a>

现在，您已经在 EC2 实例上安装了 Windows 软件开发工具包，您可以使用它来生成证书签名请求 (CSR)。CSR 是未签名的证书，您将其提交给您的 CA 进行签名。在此示例中，我们使用 Windows SDK 中包含的 `certreq` 可执行文件来生成 CSR。

**使用 certreq 可执行文件生成 CSR**

1. 连接到你的 Windows EC2 实例。有关更多信息，请参阅 *Amazon EC2 用户指南*中的 [Connect 到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/EC2_GetStarted.html#ec2-connect-to-instance-windows)。

1. 使用以下内容创建名为 `request.inf` 的文件。将 `Subject` 信息替换为贵组织的详细信息：

   ```
   [Version]
   Signature= $Windows NT$
   [NewRequest]
   Subject = "C=<Country>,CN=<www.website.com>,O=<Organization>,OU=<Organizational-Unit>,L=<City>,S=<State>"
   RequestType=PKCS10
   HashAlgorithm = SHA256
   KeyAlgorithm = RSA
   KeyLength = 2048
   ProviderName = "CloudHSM Key Storage Provider"
   KeyUsage = "CERT_DIGITAL_SIGNATURE_KEY_USAGE"
   MachineKeySet = True
   Exportable = False
   ```

   有关每个参数的说明，请参阅 [Microsoft 的文档](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1#BKMK_New)。

1. 运行 `certreq.exe` 生成 CSR：

   ```
   certreq.exe -new request.inf request.csr
   ```

   此命令在您的 AWS CloudHSM 集群上生成新的密钥对，并使用私钥创建 CSR。

1. 将 CSR 提交给 CA。如果您使用的是 Windows Server CA，请执行以下步骤：

   1. 打开 CA 工具：

      ```
      certsrv.msc
      ```

   1. 在新窗口中，右键单击 CA 服务器的名称。选择**所有任务**，然后选择**提交新请求**。

   1. 导航到 `request.csr` 的位置，然后选择**打开**。

   1. 展开 **Server CA** 菜单，导航到**待处理请求**文件夹。右键单击您刚刚创建的请求，选择**所有任务**，然后选择**颁发**。

   1. 导航到**已颁发的证书**文件夹。

   1. 选择**打开**以查看证书，然后选择**详细信息**选项卡。

   1. 选择**复制到文件**以启动证书导出向导。将经 DER 编码的 X.509 文件作为 `signedCertificate.cer` 保存到安全位置。

   1. 退出 CA 工具并使用以下命令，将证书文件移动到 Windows 中的个人证书存储。

      ```
      certreq.exe -accept signedCertificate.cer
      ```

现在，可以使用导入的证书[对文件进行签名](#magetool-sign)。

## 步骤 3：对文件进行签名
<a name="magetool-sign"></a>

现在，您已拥有 Mage.exe 和导入的证书，可以对文件进行签名了。您需要知道证书的 SHA-1 哈希或*指纹*。指纹可确保 Mage.exe 仅使用经过 AWS CloudHSM验证的证书。在此示例中，我们使用 PowerShell 获取证书的哈希值。

**获取证书的指纹并使用它来对文件进行签名**

1. 导航到含有 `mage.exe` 的目录。默认位置是：

   ```
   C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8.1 Tools\x64
   ```

1. 要使用 Mage.exe 创建示例应用程序文件，请运行以下命令：

   ```
   mage.exe -New Application -ToFile C:\Users\Administrator\Desktop\sample.application
   ```

1. 以管理员 PowerShell 身份打开并运行以下命令：

   ```
   Get-ChildItem -path cert:\LocalMachine\My
   ```

   从输出中复制 `Thumbprint`、`Key Container` 和 `Provider` 值。  
![\[证书的哈希将在输出中显示为指纹、密钥容器和提供商\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/images/certstore-my-certificate.png)

1. 通过运行以下命令对文件进行签名：

   ```
   mage.exe -Sign -CertHash <thumbprint> -KeyContainer <keycontainer> -CryptoProvider <CloudHSM Key Storage Provider/Cavium Key Storage Provider> C:\Users\Administrator\Desktop\<sample.application>
   ```

   如果命令成功，则 PowerShell 返回成功消息。

1. 要验证文件上的签名，请使用以下命令：

   ```
   mage.exe -Verify -CryptoProvider <CloudHSM Key Storage Provider/Cavium Key Storage Provider> C:\Users\Administrator\Desktop\<sample.application>
   ```

# 其他第三方供应商与之集成 AWS CloudHSM
<a name="other-integrations"></a>

一些第三方供应商支持 AWS CloudHSM 将其作为信任根源。这意味着您可以使用自己选择的软件解决方案，同时在 CloudHSM 集群中创建并存储底层密钥。因此，您的工作负载 AWS 可以依赖 CloudHSM 的延迟、可用性、可靠性和弹性优势。以下列表包括了支持 CloudHSM 的第三方供应商。

**注意**  
AWS 不为任何第三方供应商背书或担保。
+ **[Hashicorp Vault](https://www.hashicorp.com)** 是一个密钥管理工具，旨在实现跨组织的协作和管理。它支持 AWS Key Management Service 并 AWS CloudHSM 作为额外保护的信任根源。
+ **[Thycotic Secrets Server](https://thycotic.com)** 可帮助客户跨特权账户管理敏感凭证。它 AWS CloudHSM 作为信任根提供支持。
+ **[P6R 的 KMIP 适配器](https://www.p6r.com/software/ksg.html)**允许您通过标准 KMIP 接口使用您的 AWS CloudHSM 实例。
+ **[PrimeKey EJBCA](https://aws.amazon.com/marketplace/seller-profile?id=7edf9048-58e6-4086-9d98-b8e0c1d78fce)** 是 PKI 的流行开源解决方案。它允许您使用安全地创建和存储密钥对 AWS CloudHSM。
+ **[Box KeySafe](https://blog.box.com)** 为许多具有严格安全、隐私和监管合规要求的组织提供云内容的加密密钥管理。客户可以直接 AWS Key Management Service 或 AWS CloudHSM 通过 AWS KMS 自定义 KeySafe 密钥存储区间接保护密钥。
+ **[Insyde Software](https://www.insyde.com)** 支持 AWS CloudHSM 作为固件签名的信任根。
+ **[F5 BIG-IP LTM](https://techdocs.f5.com)** 支持 AWS CloudHSM 作为信任根。
+ **[Cloudera Navigator Key HSM](https://www.cloudera.com)** 允许您使用 CloudHSM 集群创建和存储 Cloudera Navigator Key Trustee Server 的密钥。
+ **[Venafi 信任保护平台](https://marketplace.venafi.com/details/aws-cloudhsm/)**通过 AWS CloudHSM 密钥生成和保护，为 TLS、SSH 以及代码签名提供全面的计算机身份管理。