Apache Tomcat是一个Web服务器和servlet容器,旨在为Java应用程序提供服务。Tomcat经常用于生产企业部署和较小的应用程序需求,既灵活又强大。
在本教程中,我们将讨论如何使用SSL保护您的Ubuntu 16.04 Tomcat安装。默认情况下,安装时,Tomcat服务器与客户端之间的所有通信都是未加密的,包括输入的任何密码或任何敏感数据。我们可以通过多种方式将SSL合并到Tomcat安装中。本教程将介绍如何设置启用SSL的代理服务器以安全地与客户端协商,然后将请求发送到Tomcat。
我们将介绍如何使用Apache和Nginx进行设置。
您可以通过多种方式为Tomcat安装设置SSL,每种方法都有一套权衡取舍。在了解到Tomcat能够本地加密连接之后,我们讨论反向代理解决方案似乎很奇怪。
使用Tomcat的SSL有许多缺点,使其难以管理:
authbind
程序将非特权程序映射到受限端口,使用防火墙设置端口转发等等,但它们仍然代表着额外的复杂性。反向代理解决方案通过在Tomcat安装前放置一个强大的Web服务器来绕过许多这些问题。Web服务器可以使用SSL处理客户端请求,这是专门设计用于处理的功能。然后,它可以将请求代理到以正常、无特权配置运行的Tomcat。
这种关注点分离简化了配置,即使它意味着运行额外的软件。
要完成本教程,您必须已在服务器上设置Tomcat,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。
当您启动并运行Tomcat时,请继续下面的首选Web服务器部分。 Apache直接从下面开始,而Nginx配置可以通过向前跳过来找到。
mod_jk
进行代理Apache Web服务器有一个模块mod_jk
,可以使用Apache JServ协议直接与Tomcat通信。默认情况下,Tomcat中启用了此协议的连接器,因此Tomcat已准备好处理这些请求。
在我们讨论如何代理Apache Web服务器与Tomcat的连接之前,您必须安装并保护Apache Web服务器。
您可以按照本教程的第一步安装Apache Web服务器。不要安装MySQL或PHP。
之后,您需要在服务器上设置SSL。您这样做的方式取决于您是否拥有域名。
完成这些步骤后,请继续阅读下面的内容,了解如何将Apache Web服务器连接使Tomcat安装。
mod_jk
首先,我们需要安装mod_jk
模块。Apache Web服务器使用它来使Apache JServ协议与Tomcat通信。
我们可以从Ubuntu的默认存储库安装mod_jk
。通过输入以下命令更新本地包索引并安装:
sudo apt-get update
sudo apt-get install libapache2-mod-jk
安装后将自动启用该模块。
接下来,我们需要配置模块。主配置文件位于/etc/libapache2-mod-jk/workers.properties
。现在在文本编辑器中打开此文件:
sudo nano /etc/libapache2-mod-jk/workers.properties
在里面,找到workers.tomcat_home
指令。将其设置为Tomcat安装主目录。对于我们的Tomcat安装,那将是/opt/tomcat
:
/etc/libapache2-mod-jk/workers.properties
workers.tomcat_home=/opt/tomcat
完成后保存并关闭文件。
mod_jk
接下来,我们需要调整Apache Virtual Host来代理对Tomcat安装的请求。
要打开的正确虚拟主机文件取决于您用于设置SSL的方法。
如果使用上面链接的教程设置自签名SSL证书,请打开以下default-ssl.conf
文件:
sudo nano /etc/apache2/sites-available/default-ssl.conf
如果使用Let's Encrypt设置SSL,则文件位置将取决于您在设置证书过程中选择的选项。您可以通过输入以下内容找到服务SSL请求所涉及的虚拟主机:
sudo apache2ctl -S
您的输出可能会以这样的结果开头:
VirtualHost configuration:
*:80 example.com (/etc/apache2/sites-enabled/000-default.conf:1)
*:443 is a NameVirtualHost
default server example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
port 443 namevhost example.com (/etc/apache2/sites-enabled/000-default-le-ssl.conf:2)
port 443 namevhost www.example.com (/etc/apache2/sites-enabled/default-ssl.conf:2)
. . .
查看与SSL端口443相关联的行(本示例中的第3-6行),我们可以确定为这些域提供服务所涉及的虚拟主机文件。在这里,我们看到000-default-le-ssl.conf
文件和default-ssl.conf
文件都涉及,因此您应该编辑这两个文件。您的结果可能会有所不同:
sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
sudo nano /etc/apache2/sites-enabled/default-ssl.conf
无论您必须打开哪个文件,程序都是相同的。在VirtualHost
标签内,您应输入以下内容:
<VirtualHost *:443>
. . .
JKMount /* ajp13_worker
. . .
</VirtualHost>
保存并关闭文件。对您确定需要编辑的任何其他文件重复上述过程。
完成后,输入以下命令检查配置:
sudo apache2ctl configtest
如果输出包含Syntax OK
,请重新启动Apache Web服务器进程:
sudo systemctl restart apache2
您现在应该可以通过在Web浏览器中访问站点的SSL版本来访问Tomcat:
https://example.com
接下来,跳过下面的Nginx配置,继续详细介绍如何限制对Tomcat的访问以完成配置。
如果您喜欢Apache Web服务器,那么使用Nginx中的代理也很容易。虽然Nginx没有允许它说Apache JServ协议的模块,但它可以使用其强大的HTTP代理功能与Tomcat进行通信。
在我们讨论如何代理到Tomcat的Nginx连接之前,您必须安装并保护Nginx。
您可以按照我们在Ubuntu 16.04上安装Nginx的教程来安装Nginx。
之后,您需要在服务器上设置SSL。您这样做的方式取决于您是否拥有域名。
完成这些步骤后,请继续阅读下面的内容,了解如何将Nginx Web服务器连接到Tomcat安装。
设置Nginx代理到Tomcat非常简单。
首先打开与您的站点关联的服务器块文件。我们假设您使用的是本教程中的默认服务器块文件:
sudo nano /etc/nginx/sites-available/default
在文件的顶部,我们需要添加一个upstream
块。这将概述连接细节,以便Nginx知道我们的Tomcat服务器正在监听的位置。将server
放在文件中定义的任何块之外:
upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
. . .
接下来,在server
块内定义端口443,修改location /
块。我们希望将所有请求直接传递给我们刚刚定义的upstream
块。注释掉当前内容并使用该proxy_pass
指令传递给我们刚刚定义的“tomcat”上游。
我们还需要在此块中包含proxy_params
配置。该文件定义了Nginx如何代理连接的许多细节:
upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
. . .
location / {
#try_files $uri $uri/ =404;
include proxy_params;
proxy_pass http://tomcat/;
}
. . .
}
完成后,保存并关闭文件。
接下来,测试以确保您的配置更改不会有任何语法错误:
sudo nginx -t
如果未报告任何错误,请重新启动Nginx以实施更改:
sudo systemctl restart nginx
您现在应该可以通过在Web浏览器中访问站点的SSL版本来访问Tomcat:
https://example.com
现在您拥有对Tomcat安装的SSL加密访问权限,我们可以更多地锁定Tomcat安装。
由于我们希望Tomcat的所有请求都通过我们的代理,因此我们可以将Tomcat配置为仅侦听本地环回接口上的连接。这可确保外部各方无法直接尝试从Tomcat发出请求。
在Tomcat配置目录中打开server.xml
文件以更改这些设置:
sudo nano /opt/tomcat/conf/server.xml
在此文件中,我们需要修改连接器定义。目前,配置中启用了两个连接器。一个处理端口8080上的正常HTTP请求,而另一个处理端口8009上的Apache JServ协议请求。配置将如下所示:
. . .
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
. . .
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
为了限制对本地环回接口的访问,我们只需要127.0.0.1
在每个连接器定义中添加一个“address”属性集。最终结果如下所示:
. . .
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
address="127.0.0.1"
redirectPort="8443" />
. . .
<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
完成这两项更改后,保存并关闭文件。
我们需要重新启动Tomcat进程来实现这些更改:
sudo systemctl restart tomcat
如果您遵循我们的Tomcat安装步骤,则表明您的安装已启用防火墙ufw
。现在我们对Tomcat的所有请求都限制在本地环回接口,我们可以从防火墙中删除允许外部请求到Tomcat的规则。
sudo ufw delete allow 8080
现在,只能通过Web服务器代理访问Tomcat安装。
此时,应在Web服务器代理的帮助下使SSL加密与Tomcat实例进行连接。虽然配置单独的Web服务器进程可能会增加服务应用程序所涉及的软件,但它显著简化了保护流量的过程。
想要了解更多关于Linux的开源信息教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Encrypt Tomcat 8 Connections with Apache or Nginx on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。