第12课:Tomcat

第12课:Tomcat 配置 HTTPS 进阶篇

Tomcat 作为一个轻量级的免费开源的 Web 应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,也是我们学习 Java Web 时的首选 Web 应用服务器。接下来笔者会和大家一起探讨如何在 Tomcat 里面配置 HTTPS 的应用。本文以 Window 10 服务器为例子,和大家分享如何使用第三方 CA 签发的证书配置 Tomcat 并在文章最后介绍 Tomcat Connector(连接器)三种运行模式。

环境准备

假设大家已经安装好了 Tomcat,笔者使用的是 Tomcat 9.0 自带的默认应用,如下图所示。

enter image description here

生成 JKS 文件

在配置 Tomcat 前,需要先生成 JKS 文件,生成 JKS 文件有两种方式:

  • 使用 XCA 工具和 Portecle 生成 JKS 文件;
  • 使用 Keytool 和 XCA 工具生成 JKS 文件。

使用 XCA 工具和 Portecle 生成 JKS 文件

(1)首先使用 XCA 生成私钥

打开在《第04课:使用XCA管理和生成SSL证书》已经生成 XCA 的数据库,在此基础上继续为大家演示其他的操作,生成一个私钥(Private Key),步骤如下。

选择 Private keys 页面,单击右边的“New Key”按钮,在弹出的对话框中输入私钥的信息,比如 Tomcat-Web-Key,key 的类型选择 RSA,KeySize 选择 2048 位。

enter image description here

单击创建后,会生成一个名为 Tomcat-Web-Key 的私钥,如下图所示意。

enter image description here

(2)生成证书请求

单击“Certificate Signing Requests” 页面,然后单击右边的“New Request”按钮。

enter image description here

其他配置保持默认,然后在弹出的对话窗体中单击“Subject”页面,输入 tomcat-web-01 证书请求的相关信息,如下:

  • 通用名称(Common Name):tomcat-web-01
  • 国家(Country):cn
  • 省份(StateOrProvinceName):Shannxi
  • 城市(LocalityName):xian
  • 企业或者组织名称(Organization):51TalkDocter
  • 企业或者组织部门(Organization Unit):IT
  • 邮箱地址(emailAddress):chancein007@163.com

enter image description here

注意在上面窗体的底部,有一个“Private Key”的选型,请选择上文为 tomcat-web-01 的 Web 服务器已经生成的私钥 Tomcat-Web-Key。

单击“OK”按钮之后,证书请求就被成功生成。

enter image description here

(3) 使用私有 CA 签名证书请求

上面我们已经看到 tomcat-web-01 的 Web 服务器的 SSL 证书请求已经成功生成。接下来使用私有 CA 为其签名,步骤如下:

选择 tomcat-web-01 的证书请求,并单击右键,在弹出的菜单中单击签署(Sign)。

enter image description here

在弹出的对话框中,单击源(Source)页面,并注意下面的用红色标出的两处。

  • 使用 51Talk Docter Root CA 签署证书请求。
  • 使用 Https_Server 的模板。

enter image description here

最后单击 ok 按钮,我们发现 Tomcat 的证书请求被成功签名。

enter image description here

(4) 导出 P12 证书

在 XCA 的证书(Certificate)页面,选择已经被签署好的 tomcat-web-01,并单击“导出(Export)”按钮。

enter image description here

导出 PKCS#12 chain(*.p12)的证书时,一定要选择的是证书链,如下图所示:

enter image description here

输入密码,然后单击 OK 按钮,P12 证书导出完毕。

注意:我们导出 P12 证书时设置密码,在其他地方导入时需要输入这个密码,只有输入正确的密码,P12 证书才可以被使用。因此,这个密码我们一定要牢记,在本文中还有很多类似的地方,就不在一一说明。

enter image description here

(4)生成 JKS 文件

假设我们已经安装了 portecle,打开 portecle 工具,在菜单栏左边单击 File 按钮,然后再单击 New Keystore 按钮:

enter image description here

然后在 portecle 中导入上文我们得到的 Tomcat-web-01.p12 证书,单击 Import Key Pair 按钮,选择 tomcat-web-01.p12 选项,最后单击 Choose 按钮。

enter image description here

在弹出的对话框中输入生成 tomcat-web-01.p12 时设置的密码,单击 OK 按钮。

enter image description here

继续单击 OK 按钮。

enter image description here

输入别名,如 tomcat-web-01,单击 OK 按钮。

enter image description here

设置密码之后继续单击 OK 按钮。

enter image description here

单击“确定”按钮,导入“Key Pair”成功。

enter image description here

在主菜单栏下面的一列中单击“Save KeyStore”按钮,在弹出的对话框中设置 JKS 文件的密码,然后单击“OK”按钮。

enter image description here

在弹出的对话框中输入文件的名字以及它的后缀名,如 tomcat-web-01.jks,然后单击“保存”按钮。在 xca 目录下,会发现已经生成了 tomcat-web-01.jks 文件。

enter image description here

恭喜你,第一种方式生成 JKS 文件的步骤已经完成了。如果你不喜欢使用这种方式,或者需要把你的 CSR 发送给第三方的商业 CA 或者企业自己其他部分的私有 CA 去签名的话,使用下面的 Keytool 工具生成和配置 JKS 也是一种不错的方式哦。

使用 Keytool 和 XCA 工具生成 JKS 文件

(1)用 Keytool 命令生成只带有私钥的 JKS 文件

为了区分第一种方式,笔者在这里将 JKS 文件名改为 Tomcat,假设已经安装及配置好了 JDK,我们便可以直接使用 JDK 自带的 KeyTool 工具。

打开 cmd 窗口后输入下面的命令:

keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.jks -validity 365

然后设置 JKS 文件的密码,需要填写的相关信息如下:

  • 您的名字与姓氏是什么? tomcat-web-01
  • 该单位的双字母国家/地区代码是什么? CN
  • 您所在的省/市/自治区名称是什么? Shannxi
  • 您所在的城市或区域名称是什么? xian
  • 您的组织名称是什么? 51TalkDocter
  • 您的组织单位名称是什么? IT
  • CN=tomcat-web-01, OU=www, O=www, L=www, ST=www, C=ch是否正确? Y

enter image description here

(2) 生成 csr 文件

在 cmd 窗口中输入:keytool -certreq -keyalg RSA -alias tomcat -file tomcat.csr -keystore tomcat.jks,然后输入生成 JKS 文件时设置的密码。在 xca 目录下可以看到已经生成了 csr 文件。

enter image description here

(3) 使用私有 CA 签署 csr 文件

首先将 csr 文件导入 xca 中,单击“Certificate Signing Requests” 页面,然后单击右边的“Import”按钮。

enter image description here

在弹出的对话框中选择上一步生成的 tomcat.csr,然后单击“打开”按钮。

enter image description here

单击 OK 按钮后,CSR 文件已经导入成功。

enter image description here

接下来便可以在 XCA 中使用 CA 为 csr 签署,选择 tomcat-web-01 的证书请求,并单击右键,在弹出的菜单中单击签署(Sign)。

enter image description here

在弹出的对话框中,单击源(Source)页面,并注意下面的用红色标出的两处。

  • 使用 51Talk Docter Root CA 签署证书请求。
  • 使用 Https_Server 的模板。

enter image description here

最后单击 OK 按钮,发现 CSR 文件被成功签名。

enter image description here

注意:因为第一种方式和第二种方式都签署的是 tomcat-web-01 的服务器证书,因此名字会冲突,所以上图所示名字变成了 tomcat_web_01_1

(4)导出 P7B 证书

这里与第一种方式不同的是需要导出的是 P7B 证书。在 XCA 的证书(Certificate)页面,选择已经被签署好的tomcat_web_01_1,并单击“导出(Export)”按钮。

enter image description here

在弹出的页面,选择导出的格式为 PKCS#7 chain(*.p7b),一定是选择证书链,并输入要导出的路径名称,单击 OK 按钮。

enter image description here

接下来需要做的就是为上文生成的 tomcat.jks 导入证书的公钥。

这里仍然使用的是 JDK 自带的 KeyTool 工具, 打开 cmd 窗口,然后输入:

 keytool -import -alias tomcat -keystore tomcat.jks -file tomcat-web-01_1.p7b

按回车键后输入生成 tomcat.jks 时设置的密码,按回车键,然后输入 y,最终得到带有公钥的 JKS 文件。

enter image description here

通过以上两种方式,我们都可以得到 JKS 文件。大家在做实际配置的时候采用任意一种都是可以的,如果有兴趣的话,两种方式都可以动手实践一遍。

下文笔者将会采用第一种方式生成的 JKS 文件和服务器证书来介绍如何配置 Tomcat。

配置 Tomcat 的 HTTPS

接下来把 tomcat-web-01.jks 文件配置到 Tomcat 中,让其支持 HTTPS。首先,把 tomcat-web-01.jks 文件复制到 Tomcat 的 conf 目录下。注意:tomcat-web-01.jks 也可以放到其他自定义目下,这里没有任何的约束。

enter image description here

打开 conf 文件夹下的 server.xml 文件,然后在 server.xml 文件中找到下面的一段注释掉的内容:

enter image description here

更改如下:

enter image description here

其中:

  • keystoreFile:密钥文件路径。
  • keystorePass:创建密钥时设置的密码。

因为51TalkDocter_Root_CA.cer是一个私有的 CA 根证书,不是操作系统默认自带的 CA 根证书,所以需要把其安装到 Windows 操作系统的受信任的根证书列表中。

具体操作步骤如下:

双击从 XCA 导出的 51TalkDocter_Root_CA.cer 证书,其会弹出一个窗体显示证书。

enter image description here

注意,其上面有一个红色叉号,表示当前这个证书是不受操作系统信任的一个 SSL 证书,单击下面的安装证书按钮,然后选择“本地计算机(L)”,单击“下一步”按钮。

enter image description here

在下面的窗体中,选择“将所有证书都放入下列存储(p)” 复选框,并点击最右侧的“浏览..”按钮,其将会弹出“选择要使用的证书存储(C)”的对话框,然后选择“受信任的根证书颁发机构”,然后单击“确定”按钮,再单击“下一步”按钮,如下图所示意。

enter image description here

最后单击“完成”按钮。

enter image description here

再次双击打开c:\ssldemo\51TalkDocter_Root_CA.cer证书,会发现以前的红色叉号已经消失。

enter image description here

接下来还需导入 tomcat-web-01 服务器的证书,步骤和导入根证书相同,在这里不再演示。

目前为止,服务的证书和私有 CA 的根证书都导入完毕。接下来就是见证奇迹的时候了,启动 Tomcat 后输入 https://tomcat-web-01:8443,我们发现可以正常访问 Tomcat 的主页,并且没有任何的不安全提示。

enter image description here

Tomcat Connector(连接器)三种运行模式

笔者在上文配置 Tomcat 的 SSL 时使用的是 NIO 模式:

enter image description here

除此之外,也可以使用 bio(blocking I/O)和 apr(Apache Portable Runtime/Apache 可移植运行时)这两种模式配置,下面笔者会给大家介绍这三种模式的区别。

(1)NIO(new I/O)

Java nio 是一个基于缓冲区、并提供非阻塞 I/O 操作的 Java API,它拥有比传统 I/O 操作(bio)更好的并发运行性能,其异步请求 I/O 处理,可以通过少量的线程处理大量的请求。本文所使用模式便是 nio 模式。

(2)BIO(Blocking I/O)

即阻塞式 I/O 操作,是基于 Java 的 HTTP/1.1,在 Tomcat 7.0 以下都默认采用的是 BIO 模式。一般情况下,BIO 模式是三种运行模式中性能最低的一种。一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源。如果我们想使用 BIO 模式需要在 Tomcat 的 server.xml 中将对应的 protocol 的属性值改为 HTTP/1.1 即可。

(3)APR(Apache Portable Runtime/Apache 可移植运行时)

Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作, 使得 Tomcat 处理静态文件的性能有了很大的提高。Tomcat apr 从操作系统级别来解决异步的 I/O 问题,因此,它也是高并发应用的首选模式。

Apr 模式配置 Tomcat 相比较前两种会稍微复杂一点,需要安装以下三个组件的支持:

  • APR library
  • JNI wrappers for APR used by Tomcat(libtcnative):简单地说,就是自带的 tomcat-native]
  • OpenSSL libraries

安装好这三个组件后,如果想使用 apr 模式也需将对应 Connector 的 protocol 属性值改为 org.apache.coyote.http11.Http11AprProtocol。

如果大家对 BIO 和 APR 的 Tomcat 配置模式感兴趣,可以自行尝试。

总结

本文主要给大家分享了如何使用私有 CA 签名的证书配置 Tomcat,同时也介绍 Tomcat Connector(连接器)三种运行模式。建议大家按照本文的步骤动手试一下,笔者在文中只配置了目前最火以及最常用的 NIO 模式,其他两种模式也可以尝试配置,肯定会有新的收获。最后祝大家学习开心,生活愉快!

上一篇
下一篇
目录