前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 16.04上使用Apache或Nginx加密Tomcat 8连接

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

原创
作者头像
信姜缘
修改2018-09-26 17:16:26
1.8K0
修改2018-09-26 17:16:26
举报

介绍

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。通过输入以下命令更新本地包索引并安装:

代码语言:javascript
复制
sudo apt-get update
sudo apt-get install libapache2-mod-jk

安装后将自动启用该模块。

接下来,我们需要配置模块。主配置文件位于/etc/libapache2-mod-jk/workers.properties。现在在文本编辑器中打开此文件:

代码语言:javascript
复制
sudo nano /etc/libapache2-mod-jk/workers.properties

在里面,找到workers.tomcat_home指令。将其设置为Tomcat安装主目录。对于我们的Tomcat安装,那将是/opt/tomcat

/etc/libapache2-mod-jk/workers.properties

代码语言:javascript
复制
workers.tomcat_home=/opt/tomcat

完成后保存并关闭文件。

第二步:使用Apache将虚拟主机调整为代理 mod_jk

接下来,我们需要调整Apache Virtual Host来代理对Tomcat安装的请求。

要打开的正确虚拟主机文件取决于您用于设置SSL的方法。

如果使用上面链接的教程设置自签名SSL证书,请打开以下default-ssl.conf文件:

代码语言:javascript
复制
sudo nano /etc/apache2/sites-available/default-ssl.conf

如果使用Let's Encrypt设置SSL,则文件位置将取决于您在设置证书过程中选择的选项。您可以通过输入以下内容找到服务SSL请求所涉及的虚拟主机:

代码语言:javascript
复制
sudo apache2ctl -S

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

代码语言:javascript
复制
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文件都涉及,因此您应该编辑这两个文件。您的结果可能会有所不同:

代码语言:javascript
复制
sudo nano /etc/apache2/sites-enabled/000-default-le-ssl.conf
sudo nano /etc/apache2/sites-enabled/default-ssl.conf

无论您必须打开哪个文件,程序都是相同的。在VirtualHost标签内,您应输入以下内容:

代码语言:javascript
复制
<VirtualHost *:443>
​
    . . .
​
    JKMount /* ajp13_worker
​
    . . .
​
</VirtualHost>

保存并关闭文件。对您确定需要编辑的任何其他文件重复上述过程。

完成后,输入以下命令检查配置:

代码语言:javascript
复制
sudo apache2ctl configtest

如果输出包含Syntax OK,请重新启动Apache Web服务器进程:

代码语言:javascript
复制
sudo systemctl restart apache2

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

代码语言:javascript
复制
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非常简单。

首先打开与您的站点关联的服务器块文件。我们假设您使用的是本教程中的默认服务器块文件:

代码语言:javascript
复制
sudo nano /etc/nginx/sites-available/default

在文件的顶部,我们需要添加一个upstream块。这将概述连接细节,以便Nginx知道我们的Tomcat服务器正在监听的位置。将server放在文件中定义的任何块之外:

代码语言:javascript
复制
upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}
​
server {
​
    . . .

接下来,在server块内定义端口443,修改location /块。我们希望将所有请求直接传递给我们刚刚定义的upstream块。注释掉当前内容并使用该proxy_pass指令传递给我们刚刚定义的“tomcat”上游。

我们还需要在此块中包含proxy_params配置。该文件定义了Nginx如何代理连接的许多细节:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
sudo nginx -t

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

代码语言:javascript
复制
sudo systemctl restart nginx

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

代码语言:javascript
复制
https://example.com

限制对Tomcat安装的访问

现在您拥有对Tomcat安装的SSL加密访问权限,我们可以更多地锁定Tomcat安装。

由于我们希望Tomcat的所有请求都通过我们的代理,因此我们可以将Tomcat配置为仅侦听本地环回接口上的连接。这可确保外部各方无法直接尝试从Tomcat发出请求。

在Tomcat配置目录中打开server.xml文件以更改这些设置:

代码语言:javascript
复制
sudo nano /opt/tomcat/conf/server.xml

在此文件中,我们需要修改连接器定义。目前,配置中启用了两个连接器。一个处理端口8080上的正常HTTP请求,而另一个处理端口8009上的Apache JServ协议请求。配置将如下所示:

代码语言:javascript
复制
. . .
​
    <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”属性集。最终结果如下所示:

代码语言:javascript
复制
. . .
​
    <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进程来实现这些更改:

代码语言:javascript
复制
sudo systemctl restart tomcat

如果您遵循我们的Tomcat安装步骤,则表明您的安装已启用防火墙ufw。现在我们对Tomcat的所有请求都限制在本地环回接口,我们可以从防火墙中删除允许外部请求到Tomcat的规则。

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 为什么要反向代理?
  • 准备
  • (选项1)使用Apache Web Server 的 mod_jk进行代理
    • 部分准备条件
      • 第一步:安装和配置 mod_jk
        • 第二步:使用Apache将虚拟主机调整为代理 mod_jk
        • (选项2)使用Nginx进行HTTP代理
          • 部分准备条件
            • 第一步:调整Nginx服务器块配置
              • 第二步:测试并重启Nginx
              • 限制对Tomcat安装的访问
              • 结论
              相关产品与服务
              SSL 证书
              腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档