介绍
Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。 Tomcat通常用于生产企业部署和较小的应用程序需求,既灵活又强大。
在本指南中,我们将讨论如何使用SSL保护您的Ubuntu 16.04 Tomcat安装。 默认情况下,安装后,Tomcat服务器和客户端之间的所有通信都是未加密的,包括任何输入的密码或任何敏感数据。 有很多方法可以将SSL加入我们的Tomcat安装。 本指南将介绍如何设置启用SSL的代理服务器以与客户端安全协商,然后将请求转交给Tomcat。
我们将介绍如何使用Apache和Nginx的设置方法。
为什么是反向代理?
有多种方法可以为Tomcat安装设置SSL,每种方法都有一组权衡。 在了解到Tomcat能够本地加密连接之后,我们可能会讨论一个反向代理解决方案似乎很奇怪。
SSL与Tomcat有许多缺点,使其难以管理:
- Tomcat的运行时与非特权用户推荐的,无法绑定到像传统的SSL端口443限制端口 :有方法可以解决该像使用
authbind
程序映射与受限的端口无特权的程序,设置端口转发了防火墙等,但它们仍然代表额外的复杂性。 - SSL与Tomcat没有得到广泛的其他软件的支持 :像咱们加密项目提供互动的Tomcat没有本机方法。 此外,Java密钥库格式要求在使用之前转换常规证书,这使自动化复杂化。
- 常规的Web服务器发布的频率比Tomcat的 :这个可以有你的应用程序显著的安全隐患。 例如,受支持的Tomcat SSL加密套件可能会快速过时,从而使应用程序无法获得最佳保护。 在需要安全更新的情况下,更新Web服务器可能比Tomcat安装更容易。
反向代理解决方案通过简单地将一个强大的Web服务器放在Tomcat安装面前绕过了许多这些问题。 Web服务器可以使用SSL处理客户端请求,它专门用于处理的功能。 然后它可以代理请求到Tomcat运行在其正常,非特权配置。
这种关注的分离简化了配置,即使它意味着运行一个附加的软件。
先决条件
为了完成本指南,您必须在您的服务器上设置Tomcat。 本指南将假设你使用我们的指示在Ubuntu 16.04安装指南Tomcat的8才能完成设置。
当你有一个Tomcat启动和运行,下面继续为您首选的Web服务器的部分。Apache的正下方开始,而Nginx的配置可以通过直接跳到了一下被发现。
与Apache Web服务器的(方案1)代理功能mod_jk
Apache Web服务器有一个模块调用mod_jk
可以与使用Apache JServ的协议Tomcat的直接通信。 默认情况下,在Tomcat中启用此协议的连接器,因此Tomcat已经准备好处理这些请求。
部分先决条件
在我们讨论如何代理Apache Web服务器到Tomcat的连接之前,您必须安装和保护Apache Web服务器。
您可以通过以下的第1步安装Apache Web服务器本指南 。 不要安装MySQL或PHP。
之后,您需要在服务器上设置SSL。 你这样做的方式取决于你是否有域名。
- 如果你有一个域名......以确保您的服务器是让我们的加密,它提供免费的,可信证书的最简单方法。 按照我们让我们的加密指南为Apache设置此。
- 如果你没有一个域...你只是使用测试或个人使用此配置,您可以使用自签名证书来代替。 这提供了相同类型的加密,但没有域验证。 按照我们的自签名的SSL指南Apache才能完成设置。
完成这些步骤后,请继续下面了解如何将Apache Web服务器连接到Tomcat安装。
第1步:安装和配置mod_jk
首先,我们需要安装mod_jk
模块。 Apache Web服务器使用此来使用Apache JServ协议与Tomcat通信。
我们可以安装mod_jk
从Ubuntu的默认存储库。 通过键入以下命令更新本地软件包索引并进行安装:
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
:
workers.tomcat_home=/opt/tomcat
保存并在完成后关闭文件。
第2步:调整Apache的虚拟主机来代理与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
你的输出可能会开始像这样:
OutputVirtualHost 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为了完成您的配置。
(选项2)使用Nginx的HTTP代理
代理也很容易与Nginx,如果你喜欢它Apache网络服务器。 虽然Nginx没有一个模块允许它说Apache JServ协议,它可以使用其强大的HTTP代理功能与Tomcat通信。
部分先决条件
在我们可以讨论如何代理Nginx连接到Tomcat之前,您必须安装和保护Nginx。
您可以通过以下Nginx的安装在Ubuntu上安装16.04 Nginx的我们的导游 。
之后,您需要在服务器上设置SSL。 你这样做的方式取决于你是否有域名。
- 如果你有一个域名......以确保您的服务器是让我们的加密,它提供免费的,可信证书的最简单方法。 按照我们让我们的加密指南Nginx的设置此。
- 如果你没有一个域...你只是使用测试或个人使用此配置,您可以使用自签名证书来代替。 这提供了相同类型的加密,但没有域验证。 按照我们的自签名的SSL指南的Nginx才能完成设置。
完成这些步骤后,请继续下面了解如何将Nginx Web服务器连接到Tomcat安装。
第1步:调整Nginx服务器块配置
设置Nginx代理到Tomcat非常简单。
首先打开与您的站点相关联的服务器块文件。 我们将假设您在本指南中使用默认服务器块文件:
sudo nano /etc/nginx/sites-available/default
内,朝文件的顶部,我们需要添加一个upstream
块。 这将概述连接细节,以便Nginx知道我们的Tomcat服务器在侦听。 放置此任何的外server
的文件中定义的块:
upstream tomcat {
server 127.0.0.1:8080 fail_timout=0;
}
server {
. . .
接下来,在server
的443端口定义的块,修改location /
块。 我们要直接传递所有请求的upstream
我们刚刚定义的块。 注释掉当前内容,并使用proxy_pass
指令传递到上游,我们刚才定义的“雄猫”。
我们还需要包括proxy_params
该块内配置。 这个文件定义了Nginx如何代理连接的许多细节:
upstream tomcat {
server 127.0.0.1:8080 fail_timout=0;
}
server {
. . .
location / {
#try_files $uri $uri/ =404;
include proxy_params;
proxy_pass http://tomcat/;
}
. . .
}
完成后,保存并关闭文件。
第2步:测试并重新启动Nginx
接下来,测试以确保您的配置更改没有引入任何语法错误:
sudo nginx -t
如果没有报告错误,请重新启动Nginx以实现您的更改:
sudo systemctl restart nginx
现在,您应该可以通过在Web浏览器中访问您的网站的SSL版本来访问Tomcat安装:
https://example.com
限制对Tomcat安装的访问
现在你有了对你的Tomcat安装的SSL加密访问,我们可以锁定Tomcat安装一点。
由于我们希望通过我们的代理发送我们对Tomcat的所有请求,因此我们可以将Tomcat配置为仅侦听本地环回接口上的连接。 这确保外部各方不能尝试直接从Tomcat发出请求。
打开server.xml
的Tomcat配置目录中的文件更改这些设置:
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
在每个连接器定义。 最终结果将如下所示:
. . .
<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
您的Tomcat安装现在只能通过Web服务器代理访问。
结论
此时,您的Tomcat实例的连接应在Web服务器代理的帮助下使用SSL进行加密。 虽然配置单独的Web服务器进程可能会增加服务应用程序所涉及的软件,但它显着简化了保护流量的过程。