介绍
Apache Tomcat 是一个 Web 服务器和服务器容器,旨在服务 Java 应用程序. 通常用于生产企业部署和较小的应用程序需求,Tomcat 既灵活又强大。
在本指南中,我们将讨论如何以SSL保护您的Ubuntu 16.04 Tomcat安装。默认情况下,在安装时,Tomcat服务器和客户端之间的所有通信都是未加密的,包括输入的任何密码或任何敏感数据。有几种方法可以将SSL纳入Tomcat安装中。
我们将讨论如何设置这两个 Apache 和 ** Nginx** 。
为什么要使用反向代理?
您可以为 Tomcat 安装设置 SSL 的几种方法,每种都具有其一系列的妥协。 了解到 Tomcat 有能力本地加密连接后,我们会讨论反向代理解决方案似乎很奇怪。
使用Tomcat的SSL有许多缺点,使其难以管理:
- ** Tomcat, 当使用非特权用户进行运行时, 无法像传统的SSL 端口那样约束受限制的端口 443** : (中文(简体) ). 对于这一点,有一些绕行方法,例如使用"authbind"程序来绘制一个无特权程序与受限制的端口相映射,设置有防火墙的端口转发等,但它们仍然代表着额外的复杂性.
- 有Tomcat的SSL没有得到其他软件的广泛支持**: 像"让我们加密"这样的项目 无法提供与Tomcat互动的本土方式. 此外,Java keytore格式要求常规证书在使用前需要转换,这使得自动化复杂化.
- ** 常规网络服务器比Tomcat更频繁的发布** : 这会对您的应用程序产生重大的安全影响。 例如,被支持的Tomcat SSL密码套件可以很快地被过时,使您的应用程序有次优的保护. 如果需要安全更新, 更新网络服务器可能比您的Tomcat安装更容易 。 .
反向代理解决方案通过简单地在Tomcat安装前放置一个强大的Web服务器来绕过许多这些问题。Web服务器可以使用SSL来处理客户端请求,其功能是专门设计的。
这种关切的分离简化了配置,即使它意味着运行额外的软件。
前提条件
要完成本指南,您必须在您的服务器上已经安装了 Tomcat. 本指南将假定您使用了我们 Tomcat 8 on Ubuntu 16.04 安装指南中的说明来设置。
当你有一个Tomcat并运行时,继续下面的部分为你喜欢的Web服务器。 Apache 开始直接在下面,而 ** Nginx** 配置可以通过跳过前面一点找到。
(选项1)通过Apache Web Server的mod_jk
进行代理
Apache Web 服务器有一个名为mod_jk
的模块,可以使用 Apache JServ 协议直接与 Tomcat 通信. 该协议的连接器在 Tomcat 中默认启用,因此 Tomcat 已经准备好处理这些请求。
分类前提条件
在我们讨论如何向 Tomcat 连接 Apache 网页服务器之前,您必须安装和保护 Apache 网页服务器。
您可以按照 本指南的步骤 1 安装 Apache Web 服务器。
之后,您将需要在服务器上设置SSL,您这样做的方式取决于您是否拥有域名。
- ** 如果您有一个域名... ** 保护您的服务器最简单的方式是使用Let's Encrypt, 它提供了免费的,信任的证书. 跟着我们让我们为Apache加密指南来设置这个.
- ** 如果您没有域...** 并且您只是使用此配置进行测试或个人使用,您可以使用自签名的证书取而代之. 这提供了同类型的加密,但没有域验证. 遵循我们[自签的 SSL 指南 Apache (https://andsky.com/tech/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-16-04)来设置 。 .
当您完成这些步骤后,继续下方学习如何将Apache Web 服务器连接到您的Tomcat安装。
步骤1:安装和配置mod_jk
首先,我们需要安装mod_jk
模块,Apache Web 服务器使用它来使用Apache JServ 协议与 Tomcat 进行通信。
我们可以从Ubuntu的默认存储库中安装mod_jk
。更新本地包索引并通过键入安装:
1sudo apt-get update
2sudo apt-get install libapache2-mod-jk
该模块将在安装时自动启用。
接下来,我们需要配置模块. 主要配置文件位于 /etc/libapache2-mod-jk/workers.properties
. 现在在文本编辑器中打开此文件:
1sudo nano /etc/libapache2-mod-jk/workers.properties
在内部,找到workers.tomcat_home
指令. 将此设置为您的 Tomcat 安装主目录. 对于我们的 Tomcat 安装,这将是 /opt/tomcat
:
1[label /etc/libapache2-mod-jk/workers.properties]
2workers.tomcat_home=/opt/tomcat
保存并关闭文件,当你完成。
步骤 2:将Apache 虚拟主机调整为mod_jk
的代理
接下来,我们需要将我们的Apache虚拟主机调整到我们的Tomcat安装的代理请求。
要打开正确的 Virtual Host 文件将取决于您使用哪种方法来设置 SSL。
如果您使用上面的指南设置了自签名的SSL证书,请打开‘default-ssl.conf’文件:
1sudo nano /etc/apache2/sites-available/default-ssl.conf
如果您使用 Let's Encrypt 设置 SSL,文件位置将取决于您在证书程序中选择的选项。
1sudo apache2ctl -S
你的输出可能会从这样的东西开始:
1[secondary_label Output]
2VirtualHost configuration:
3*:80 example.com (/etc/apache2/sites-enabled/000-default.conf:1)
4*:443 is a NameVirtualHost
5 default server example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
6 port 443 namevhost example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
7 port 443 namevhost www.example.com (/etc/apache2/sites-enabled/default-ssl.conf:2)
8
9. . .
通过查看与 SSL 端口 443 相关的行(本示例中的 3-6 行),我们可以确定哪些虚拟主机文件涉及服务这些域. 在这里,我们可以看到包括 000-default-le-ssl.conf
文件和 default-ssl.conf
文件,因此您应该编辑两者。
1sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
2sudo nano /etc/apache2/sites-enabled/default-ssl.conf
无论你需要打开哪些文件,程序都将是相同的。在VirtualHost
标签中,你应该输入以下内容:
1<VirtualHost *:443>
2
3 . . .
4
5 JKMount /* ajp13_worker
6
7 . . .
8
9</VirtualHost>
保存和关闭文件. 重复上面的过程,您已确定需要编辑的任何其他文件。
完成后,通过键入检查您的配置:
1sudo apache2ctl configtest
如果输出包含Syntax OK
,请重新启动Apache Web 服务器过程:
1sudo systemctl restart apache2
您现在应该能够通过访问您的网站的SSL版本在您的Web浏览器访问您的Tomcat安装:
1https://example.com
接下来,跳过下面的 Nginx 配置,并继续参阅详细介绍如何限制访问 Tomcat 以完成配置的部分。
(选项 2) HTTP 与 Nginx 接口
Nginx 的代理也很容易,如果你喜欢它比 Apache 网页服务器。虽然 Nginx 没有允许它使用 Apache JServ 协议的模块,但它可以使用其强大的 HTTP 代理功能与 Tomcat 进行通信。
分类前提条件
在我们讨论如何将 Nginx 接口连接到 Tomcat 之前,您必须安装和保护 Nginx。
您可以通过遵循 我们在Ubuntu 16.04上安装 Nginx 的指南来安装 Nginx。
之后,您将需要在服务器上设置SSL,您这样做的方式取决于您是否拥有域名。
- ** 如果您有一个域名... ** 保护您的服务器最简单的方式是使用Let's Encrypt, 它提供了免费的,信任的证书. 跟着我们的 让我们为 Nginx 加密指南 来设置这个 。
- ** 如果您没有域...** 并且您只是使用此配置进行测试或个人使用,您可以使用自签名的证书取而代之. 这提供了同类型的加密,但没有域验证. 遵循我们[自签的 Nginx (https://andsky.com/tech/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-in-ubuntu-16-04) 的 SSL 指南来设置 。 .
当您完成这些步骤后,继续下方学习如何将 Nginx 网页服务器连接到您的 Tomcat 安装。
步骤1:调整 Nginx 服务器块配置
将 Nginx 设置为 proxy 到 Tomcat 是非常直接的。
首先,打开与您的网站相关的服务器封锁文件,我们将假定您正在使用本指南中的默认服务器封锁文件:
1sudo nano /etc/nginx/sites-available/default
内部,向文件的顶部,我们需要添加一个上游
块,这将概述连接的细节,以便 Nginx知道我们的Tomcat服务器在听。
1[label /etc/nginx/sites-available/default]
2upstream tomcat {
3 server 127.0.0.1:8080 fail_timeout=0;
4}
5
6server {
7
8 . . .
接下来,在为端口443定义的服务器
块中,修改位置/
块,我们希望将所有请求直接传递给我们刚刚定义的上游
块,评论当前的内容,并使用proxy_pass
指令传递到我们刚刚定义的tomcat
上游。
我们还需要在这个块中包含proxy_params
配置,该文件定义了 Nginx 将如何代理连接的许多细节:
1[label /etc/nginx/sites-available/default]
2upstream tomcat {
3 server 127.0.0.1:8080 fail_timeout=0;
4}
5
6server {
7 . . .
8
9 location / {
10 #try_files $uri $uri/ =404;
11 include proxy_params;
12 proxy_pass http://tomcat/;
13 }
14
15 . . .
16}
完成后,保存并关闭文件。
第2步:测试并重新启动 Nginx
接下来,测试以确保您的配置更改没有引入任何语法错误:
1sudo nginx -t
如果没有报告错误,请重新启动 Nginx 以实现更改:
1sudo systemctl restart nginx
您现在应该能够通过访问您的网站的SSL版本在您的Web浏览器访问您的Tomcat安装:
1https://example.com
限制访问 Tomcat 安装
现在你有SSL加密访问你的Tomcat安装,我们可以锁定Tomcat安装一点。
由于我们希望所有向Tomcat的请求都通过我们的代理,我们可以将Tomcat配置为仅在本地环绕接口上收听连接,从而确保外部方无法直接尝试向Tomcat提出请求。
在您的 Tomcat 配置目录中打开 server.xml
文件以更改这些设置:
1sudo nano /opt/tomcat/conf/server.xml
在此文件中,我们需要修改 Connector 的定义。目前配置中有两个连接器启用,其中一个处理 8080 端口上的正常 HTTP 请求,另一个处理 8009 端口上的 Apache JServ 协议请求。
1[label /opt/tomcat/conf/server.xml]
2. . .
3
4 <Connector port="8080" protocol="HTTP/1.1"
5 connectionTimeout="20000"
6 redirectPort="8443" />
7. . .
8
9 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
为了限制对本地环绕接口的访问,我们只需要在这些连接器定义中添加一个地址
属性设置为127.0.0.1
。
1[label /opt/tomcat/conf/server.xml]
2. . .
3
4 <Connector port="8080" protocol="HTTP/1.1"
5 connectionTimeout="20000"
6 address="127.0.0.1"
7 redirectPort="8443" />
8. . .
9
10 <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
完成这两个更改后,保存并关闭文件。
我们需要重新启动我们的Tomcat流程来实施这些变化:
1sudo systemctl restart tomcat
如果您遵循我们的Tomcat安装指南,您在您的安装中启用了ufw
防火墙. 现在我们对Tomcat的所有请求都限制在本地环绕接口,我们可以从我们的防火墙中删除允许对Tomcat的外部请求的规则。
1sudo ufw delete allow 8080
您的 Tomcat 安装现在只能通过您的 Web 服务器代理服务器访问。
结论
在此时,与您的 Tomcat 实例的连接应该通过 Web 服务器代理服务器进行 SSL 加密. 虽然配置一个单独的 Web 服务器流程可能会增加服务您的应用程序的软件,但它大大简化了保护您的流量的过程。