在 Linux 上使用 Tomcat 和 JSSE 进行 AWS CloudHSM SSL/TLS 分载 - AWS CloudHSM

在 Linux 上使用 Tomcat 和 JSSE 进行 AWS CloudHSM SSL/TLS 分载

本主题提供使用 Java 安全套接字扩展(JSSE)和 AWS CloudHSM JCE 软件开发工具包设置 SSL/TLS 分载的分步说明。

概述

在 AWS CloudHSM 中,Tomcat Web 服务器在 Linux 上运行以支持 HTTPS。AWS CloudHSM JCE 软件开发工具包提供了一个可与 JSSE(Java 安全套接字扩展)配合使用的接口,以允许在此类 Web 服务器上使用 HSM。AWS CloudHSMJCE 是将 JSSE 连接到您的 AWS CloudHSM 集群的桥梁。JSSE 是用于安全套接字层(SSL)/传输层安全性协议(TLS)的 Java API。

步骤 1:设置先决条件

要在 Linux 上使用带有 AWS CloudHSM 的 Tomcat Web 服务器进行 SSL/TLS 分载,请遵循以下先决条件。要使用客户端软件开发工具包 5 和 Tomcat Web 服务器设置 Web 服务器的 SSL/TLS 分载,则必须满足这些先决条件。

注意

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

先决条件

如何满足先决条件
  1. 在具有至少两个硬件安全模(HSM)的活动 AWS CloudHSM 集群中安装并配置适用于 AWS CloudHSM 的 JCE。有关安装的更多信息,请参阅适用于客户端软件开发工具包 5 的 JCE

  2. 在可以访问您的AWS CloudHSM集群的 EC2 Linux 实例上,按照 Apache Tomcat 的说明下载并安装 Tomcat Web 服务器。

  3. 使用 CloudHSM CLI 创建加密用户(CU)。有关管理 HSM 用户的更多信息,请参阅使用 CloudHSM CLI 管理 HSM 用户

    提示

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

  4. 要使用 Java Keytool 设置 JCE,请按照 使用 Client SDK 5 将 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成 中的说明进行操作。

完成这些步骤后,请转到 步骤 2:生成或导入私有密钥和 SSL/TLS 证书

注意
  • 要使用安全增强型 Linux (SELinux) 和 Web 服务器,必须允许端口 2223 上的出站 TCP 连接,这是客户端软件开发工具包 5 用于与 HSM 通信的端口。

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

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

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

步骤 2:生成或导入私有密钥和 SSL/TLS 证书

要启用 HTTPS,您的 Tomcat Web 服务器应用程需要私有密钥和相应的 SSL/TLS 证书。要使用 Web 服务器借助 AWS CloudHSM 进行 SSL/TLS 分载功能,您必须将私有密钥存储在 AWS CloudHSM 群集的 HSM 中。

注意

如果您没有私有密钥及相应的证书,则可以在 HSM 中生成私有密钥。使用私有密钥创建证书签名请求(CSR),并用它来创建 SSL/TLS 证书。

您可以创建一个包含对您在 HSM 上的私有密钥的引用和相关证书的本地AWS CloudHSM密钥库文件。在 SSL/TLS 分载期间,您的 Web 服务器使用 AWS CloudHSM 密钥库文件来识别 HSM 上的私有密钥。

生成私有密钥

该节演示了如何使用 JDK 中的 KeyTool 生成密钥。在 HSM 中生成密钥对后,即可将其导出为 KeyStore 文件,并生成相应的证书。

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

使用 KeyTool 中的 genkeypair 命令生成 RSA 密钥对
  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、SHA224withRSA、SHA256withRSA、SHA384withRSA 和 SHA512withRSA)。

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

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

生成自签名证书

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

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

作为使用 CA 的替代方案,您可以使用 KeyTool 创建自签名证书。自签名证书不受浏览器的信任,不应在生产环境中使用。它们可在测试环境中使用。

警告

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

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

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

      $ 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

    签署证书
    • 用您的特定数据替换 <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是使用别名私有密钥的已签名证书。

    在密钥库中导入证书
    • 用您的特定数据替换 <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>
    将证书转换为 PEM
    • 运行以下命令将签名证书文件(.crt)转换为 PEM。PEM 文件将用于发送来自于 http 客户端的请求。

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

    完成这些步骤后,转至步骤 3:配置 Web 服务器

    步骤 3:配置 Tomcat Web 服务器

    更新您的 Web 服务器软件的配置,以使用 HTTPS 证书和在上一步中创建的相应 PEM 文件。切记在开始前备份您现有的证书。这将完成 Linux网络服务器软件的设置,以便借助 AWS CloudHSM 进行 SSL/TLS 分载。有关更多信息,请参考 Apache Tomcat 9 配置参考

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

      $ /<TOMCAT DIRECTORY>/bin/shutdown.sh
      • <TOMCAT DIRECTORY>:您的 Tomcat 安装目录。

    更新 Tomcat 的类路径
    1. 连接到您的客户端实例。

    2. 找到 Tomcat 安装文件夹。

    3. 用您的特定数据替换 <VARIABLES> 后,使用以下命令在 Tomcat 类路径中 Tomcat/bin/catalina.sh 文件下添加 Java 库和 Cloudhsm Java 路径。

      $ 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 安装文件夹。

    在服务器配置中添加 HTTPS 连接器。
    1. 前往 Tomcat 安装文件夹。

    2. 用您的特定数据替换 <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 文件夹的路径。

    启动服务器
    • 用您的特定数据替换 <VARIABLES> 以下内容后,请运行以下命令启动 Tomcat Server

      $ /<TOMCAT DIRECTORY>/bin/startup.sh
      注意

      <TOMCAT DIRECTORY>是您的 Tomcat 安装目录的名称。

    在更新您的网络服务器配置后,转到 步骤 4:启用 HTTPS 流量并验证证书

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

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

    启用入站 HTTPS 连接

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

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

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

    3. 选择创建安全组

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

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

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

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

      4. 选择添加规则

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

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

      7. 选择创建安全组

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

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

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

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

    9. 选择保存

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

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

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

      提示

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

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

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

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

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

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

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

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

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

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

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

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