

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

# 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)。