在 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 分载,则必须满足这些先决条件。
注意
不同的平台需要不同的先决条件。请始终按照适用于您的平台的正确安装步骤进行操作。
先决条件
-
运行安装了 tomcat Web 服务器的 Linux 操作系统的 Amazon EC2 实例。
-
一个加密用户(CU),该用户拥有和管理 HSM 上的 Web 服务器的私有密钥。
-
具有至少两个硬件安全模(HSM)的活动 AWS CloudHSM 集群,且安装并配置了适用于客户端软件开发工具包 5 的 JCE。
注意
您可以使用单个 HSM 集群,但您必须首先禁用客户端密钥持久性。有关更多信息,请参阅管理客户端密钥持久性设置和客户端软件开发工具包 5 配置工具。
如何满足先决条件
-
在具有至少两个硬件安全模(HSM)的活动 AWS CloudHSM 集群中安装并配置适用于 AWS CloudHSM 的 JCE。有关安装的更多信息,请参阅适用于客户端软件开发工具包 5 的 JCE。
-
在可以访问您的AWS CloudHSM集群的 EC2 Linux 实例上,按照 Apache Tomcat 的说明
下载并安装 Tomcat Web 服务器。 -
使用 CloudHSM CLI 创建加密用户(CU)。有关管理 HSM 用户的更多信息,请参阅使用 CloudHSM CLI 管理 HSM 用户。
提示
跟踪 CU 用户名和密码。您稍后为 Web 服务器生成或导入 HTTPS 私有密钥和证书时需要它们。
要使用 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 密钥对
用您的特定数据替换
<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)。
-
要确认命令是否成功,请输入以下命令并验证您是否成功生成了 RSA 密钥对。
$
ls
<PATH>
/<JSSE KEYSTORE NAME>
.keystore
生成自签名证书
生成私有密钥和密钥库文件后,即可使用此文件生成证书签名请求(CSR)和证书。
在生产环境中,您通常使用证书颁发机构 (CA) 通过 CSR 创建证书。测试环境无需 CA。如果您使用 CA,则请将 CSR 文件发送给他们,然后使用他们在您的适用于 HTTPS的 Web 服务器中为您提供的签名 SSL/TLS 证书。
作为使用 CA 的替代方案,您可以使用 KeyTool 创建自签名证书。自签名证书不受浏览器的信任,不应在生产环境中使用。它们可在测试环境中使用。
警告
自签名证书只应在测试环境中使用。对于生产环境,请使用更安全的方法 (如证书颁发机构) 来创建证书。
主题
生成证书
-
获取前面步骤中生成的密钥库文件的副本。
-
运行以下命令以使用 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 的类路径
-
连接到您的客户端实例。
-
找到 Tomcat 安装文件夹。
-
用您的特定数据替换
<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 连接器。
前往 Tomcat 安装文件夹。
用您的特定数据替换
<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 创建安全组并将其分配给您的网络服务器
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择安全组。
-
选择创建安全组。
-
对于创建安全组,执行以下操作:
-
对于安全组名称,键入您要创建的安全组的名称。
-
(可选) 键入对您要创建的安全组的描述。
-
对于 VPC,选择包含您的 Web 服务器 Amazon EC2 实例的 VPC。
-
选择添加规则。
-
对于类型,从下拉窗口中选择 HTTPS。
-
对于来源,输入来源位置。
-
选择创建安全组。
-
-
在导航窗格中,选择实例。
-
选中您的 Web 服务器实例旁边的复选框。
-
在页面顶部选择操作下拉菜单。选择安全,然后选择更改安全组。
-
对于关联安全组,请选择搜索框,然后选择您为 HTTPS 创建的安全组。然后选择添加安全组。
-
选择保存。
验证 HTTPS 使用的是您已配置的证书
将 Web 服务器添加到安全组后,就可以验证 SSL/TLS 分载是否使用了自签名证书。您可以使用网络浏览器或使用工具 (如 OpenSSL s_client
使用网络浏览器验证 SSL/TLS 分载
-
使用 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 实例。
-
使用您的 Web 浏览器查看 Web 服务器证书。有关更多信息,请参阅下列内容:
其他网络浏览器可能具有相似的功能,可使用这些功能来查看网络服务器证书。
-
确保 SSL/TLS 证书是您配置 Web 服务器使用的证书。
使用 OpenSSL s_client 验证 SSL/TLS 分载
-
运行以下 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 实例。
-
确保 SSL/TLS 证书是您配置 Web 服务器使用的证书。
您现在有一个通过 HTTPS 保护的网站。网络服务器的私有密钥存储在 AWS CloudHSM 集群的 HSM 中。
若要添加负载均衡器,请参阅 使用 Elastic Load Balancing 为 AWS CloudHSM 添加负载均衡器(可选)。