AWS CloudHSM 使用带有 JSSE 的 Tomcat 在 Linux 上卸载 SSL/TLS - AWS CloudHSM

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

AWS CloudHSM 使用带有 JSSE 的 Tomcat 在 Linux 上卸载 SSL/TLS

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

概览

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

步骤 1:设置先决条件

要使用带有 AWS CloudHSM Client SDK 5 和 Tomcat Web 服务器的 Tomcat Web 服务器来SSL/TLS offload on Linux. These prerequisites must be met to set up web server SSL/TLS卸载 Tomcat Web 服务器,请遵循以下先决条件。

注意

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

先决条件

如何满足先决条件
  1. 在至少有两个硬件安全模块的活动 AWS CloudHSM 群集 AWS CloudHSM 上安装和配置 JCE(HSMs)。有关安装的更多信息,请参阅适用于客户端软件开发工具包 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,请按照 使用客户端 SDK 5 AWS CloudHSM 与 Java Keytool 和 Jarsigner 集成 中的说明进行操作。

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

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

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

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

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

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

要启用 HTTPS,您的 Tomcat Web 服务器应用程序需要私钥和相应的SSL/TLS certificate. To use web server SSL/TLS卸载 AWS CloudHSM,您必须将私钥存储在集群的 HSM 中。 AWS CloudHSM

注意

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

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

生成私有密钥

本节介绍如何使用来 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

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

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

生成自签名证书

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

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

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

警告

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

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

    2. 运行以下命令以使用创建证书签名请求 (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

    签署证书
    • 用您的特定数据替换<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 中添加 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 安装文件夹。

    在服务器配置中添加 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 服务器:

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

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

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

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

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

    启用入站 HTTPS 连接

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

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

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

    3. 选择创建安全组

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

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

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

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

      4. 选择添加规则

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

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

      7. 选择创建安全组

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

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

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

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

    9. 选择保存

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

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

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

      提示

      您可以使用诸如 Amazon Route 53 之类的 DNS 服务将您网站的域名(例如 https://www.example.com/)路由到您的网络服务器。有关更多信息,请参阅 Amazon R oute 53 开发者指南或您的 DNS 服务文档中的将流量路由到亚马逊 EC2实例

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

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

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

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

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

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

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

      您可以使用诸如 Amazon Route 53 之类的 DNS 服务将您网站的域名(例如 https://www.example.com/)路由到您的网络服务器。有关更多信息,请参阅 Amazon R oute 53 开发者指南或您的 DNS 服务文档中的将流量路由到亚马逊 EC2实例

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

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

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