如何在Ubuntu 16.04上使用Apache或Nginx加密Tomcat 8连接

介绍

Apache Tomcat是一个Web服务器和servlet容器,旨在为Java应用程序提供服务。Tomcat经常用于生产企业部署和较小的应用程序需求,既灵活又强大。

在本教程中,我们将讨论如何使用SSL保护您的Ubuntu 16.04 Tomcat安装。默认情况下,安装时,Tomcat服务器与客户端之间的所有通信都是未加密的,包括输入的任何密码或任何敏感数据。我们可以通过多种方式将SSL合并到Tomcat安装中。本教程将介绍如何设置启用SSL的代理服务器以安全地与客户端协商,然后将请求发送到Tomcat。

我们将介绍如何使用ApacheNginx进行设置

为什么要反向代理?

您可以通过多种方式为Tomcat安装设置SSL,每种方法都有一套权衡取舍。在了解到Tomcat能够本地加密连接之后,我们讨论反向代理解决方案似乎很奇怪。

使用Tomcat的SSL有许多缺点,使其难以管理:

  • 当Tomcat按照非特权用户的推荐运行时,无法绑定到受限制的端口,如传统的SSL端口443:有一些解决方法,比如使用authbind程序将非特权程序映射到受限端口,使用防火墙设置端口转发等等,但它们仍然代表着额外的复杂性。
  • 使用Tomcat的SSL并不像其他软件那样广泛支持:像Let's Encrypt这样的项目没有提供与Tomcat交互的本机方式。此外,Java密钥库格式要求在使用前转换传统证书,这使自动化变得复杂。
  • 传统的Web服务器比Tomcat更频繁地发布:这会对您的应用程序产生重大的安全隐患。例如,受支持的Tomcat SSL密码套件可能会很快变得过时,从而使您的应用程序得不到最佳保护。如果需要安全更新,则更新Web服务器可能比Tomcat安装更容易。

反向代理解决方案通过在Tomcat安装前放置一个强大的Web服务器来绕过许多这些问题。Web服务器可以使用SSL处理客户端请求,这是专门设计用于处理的功能。然后,它可以将请求代理到以正常、无特权配置运行的Tomcat。

这种关注点分离简化了配置,即使它意味着运行额外的软件。

准备

要完成本教程,您必须已在服务器上设置Tomcat,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

当您启动并运行Tomcat时,请继续下面的首选Web服务器部分。 Apache直接从下面开始,而Nginx配置可以通过向前跳过来找到。

(选项1)使用Apache Web Server 的 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

完成后保存并关闭文件。

第二步:使用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

您的输出可能会以这样的结果开头:

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的访问以完成配置。

(选项2)使用Nginx进行HTTP代理

如果您喜欢Apache Web服务器,那么使用Nginx中的代理也很容易。虽然Nginx没有允许它说Apache JServ协议的模块,但它可以使用其强大的HTTP代理功能与Tomcat进行通信。

部分准备条件

在我们讨论如何代理到Tomcat的Nginx连接之前,您必须安装并保护Nginx。

您可以按照我们在Ubuntu 16.04上安装Nginx的教程来安装Nginx

之后,您需要在服务器上设置SSL。您这样做的方式取决于您是否拥有域名。

完成这些步骤后,请继续阅读下面的内容,了解如何将Nginx Web服务器连接到Tomcat安装。

第一步:调整Nginx服务器块配置

设置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/;
    }
​
    . . .
}

完成后,保存并关闭文件。

第二步:测试并重启Nginx

接下来,测试以确保您的配置更改不会有任何语法错误:

sudo nginx -t

如果未报告任何错误,请重新启动Nginx以实施更改:

sudo systemctl restart nginx

您现在应该可以通过在Web浏览器中访问站点的SSL版本来访问Tomcat:

https://example.com

限制对Tomcat安装的访问

现在您拥有对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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券