使用Apache或Nginx加密Tomcat流量

介绍

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。如果您开发Java应用程序,Tomcat是一种快速简便的方法,可以在专门为此目的设计的完整服务器环境中为它们提供服务。

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

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

为什么要使用反向代理?

您可以通过多种方式为Tomcat安装设置SSL,每种方法都有一定的权衡取舍。Tomcat本身也能够加密本地连接,我们是不是有点画蛇添足,多此一举呢?

使用Tomcat自带的SSL有许多缺点,非常难用:

  • 当Tomcat按照非root用户运行时,无法绑定到受限制的端口,如传统的443端口:当然也有解决方案,比如使用authbind程序将非root程序映射到受限端口,使用防火墙设置端口转发等等,但它们操作更麻烦了。
  • 使用Tomcat的SSL并不像其他软件那样被广泛支持:Java密钥库格式要求在使用前转换传统证书,假如我们想使用自动化部署脚本,部署起来就非常麻烦。
  • 传统的Web服务器比Tomcat更新版本快:Tomcat发布版本较慢,这会对您的应用程序产安全隐患。例如,受支持的Tomcat SSL套件可能会过时,从而使您的应用程序得不到最佳保护。如果需要安全更新,则更新Web服务器可能比安装Tomcat更容易。

反向代理解决方案可以在Tomcat服务前放置一个Web服务器来绕过这些问题。Web服务器可以使用SSL处理客户端请求。然后,它可以将请求代理到正常的Tomcat。这种方案分离简化了配置,但是他需要运行额外的软件。

准备

要完成本教程,你需要具备以下内容:

当您启动并运行Tomcat时,请继续下面的首选Web服务器部分。我们将直接从Apache开始,而Nginx配置则放在之后。

使用Apache Web 服务器的mod_jk进行代理

Apache Web服务器有一个模块mod_jk,可以使用Apache“JServ”协议直接与Tomcat通信。在默认情况下Tomcat中启用了此协议的连接。

准备部分

在我们讨论如何代理Apache Web服务器与Tomcat的连接之前,您必须安装Apache Web服务器,安装教程请参考如何在CentOS 7上设置Apache虚拟主机这篇文章。

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

第一步:编译并安装 mod_jk

虽然Tomcat本身带有JServ连接器,但CentOS 7软件库不包含Apache Web服务器使用该协议进行通信所需的模块mod_jk。要添加此功能,我们必须从Tomcat站点下载并编译mod_jk

在我们下载mod_jk源代码之前,我们需要从CentOS存储库安装必要的构建和运行依赖项。我们将安装GCC来编译mod_jk,以便可以使用所需的Apache库。

sudo yum install gcc httpd-devel

安装依赖项后,就可以进行编译啦。复制最新tar.gz源的链接,并使用该curl命令将其下载到您的服务器:

cd /tmp
curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz

接下来,将tar命令解压缩到文件,并移动到源代码native子目录中:

tar xzvf tomcat-connectors*
cd tomcat-connectors*/native

现在,我们已准备好配置该软件。我们需要设置apxsApache扩展工具二进制文件的位置,以便编译成功后直接使用。之后,我们可以使用make构建并安装已编译的模块:

./configure --with-apxs=/usr/bin/apxs
make
sudo make install

这会将mod_jk模块安装到Apache目录中。

第二步:配置mod_jk模块

现在已经安装了模块,我们可以配置Apache Web以使用它来与我们的Tomcat进行通信。这可以通过设置一些配置文件来完成。

首先打开/etc/httpd/conf.d目录中的jk.conf的文件:

sudo vi /etc/httpd/conf.d/jk.conf

我们需要从加载mod_jk模块开始,将配置专用日志和共享内存文件。最后,我们将使用JkWorkersFile指令指向我们将创建的文件。将以下配置粘贴到文件中,不要修改任何东西。

LoadModule jk_module modules/mod_jk.so
​
JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm
​
JkWorkersFile conf/workers.properties

完成后保存并关闭文件。

接下来,我们将创建worker属性文件。我们使用它来定义连接到Tomcat后端的worker:

sudo vi /etc/httpd/conf/workers.properties

在这个文件中,我们将定义单个worker,它将使用Apache JServ协议连接到8009端口上的Tomcat实例:

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009

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

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

最后,我们需要调整启用SSL的Apache配置文件。如果您遵循准备教程,则应当将其配置为使用受信任或自签名SSL证书保护您的内容。

现在输入以下命令打开文件:

sudo vi /etc/httpd/conf.d/ssl.conf

VirtualHost配置块内部,添加一个JkMount指令,将该虚拟主机接收的所有流量传递给我们刚定义的worker实例。

. . .
​
<VirtualHost _default_:443>
​
. . .
JkMount /* worker1
. . .
​
</VirtualHost>

完成后保存并关闭文件。

接下来,输入以下命令检查配置:

sudo apachectl configtest

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

sudo systemctl restart httpd

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

https://example.com

接下来,跳过下面的Nginx配置,我们将继续详细介绍如何限制对Tomcat的访问以完成配置。

使用Nginx进行HTTP代理

使用Nginx代理也很容易。虽然Nginx没有用Apache JServ协议的模块,但它可以使用其强大的HTTP代理功能与Tomcat进行通信。

准备部分

您需要先安装Nginx,可以参考如何在CVM上安装Nginx这篇文章。

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

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

设置Nginx代理到Tomcat非常简单。

首先打开与您的站点关联的Nginx配置文件在etc/httpd/conf.d/ssl.conf文件:

sudo vi /etc/nginx/conf.d/ssl.conf

我们需要添加一个名为upstream的模块,该模块可以让Nginx知道我们的Tomcat服务器正在监听的位置:

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}
​
server {
​
    . . .

接下来,在配置文件内定义并修改location /块。我们希望将所有请求直接传递给我们刚刚定义的upstream。注释掉现有内容并使用proxy_pass指令传递给我们刚刚定义的upstream块。

我们还将设置一些报头以允许Nginx传递有关请求的Tomcat信息:

upstream tomcat {
    server 127.0.0.1:8080 fail_timeout=0;
}
​
server {
    . . .
​
    location / {
        #try_files $uri $uri/ =404;
        proxy_pass http://tomcat/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
​
    . . .
}

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

第二步:测试并重启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 vi /opt/tomcat/conf/server.xml

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

. . .
​
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
. . .
​
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <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" />
. . .
​
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />

完成这两项更改后,保存并关闭文件。我们需要重新启动Tomcat进程来实现这些更改:

sudo systemctl restart tomcat

现在,只能通过Web服务器代理访问Tomcat。

结论

现在你可以在Web服务器代理的帮助下使用SSL加密Tomcat连接。虽然配置单独的Web服务器进程可能会增加服务应用程序所涉及的软件,但它可以显着简化SSL部署保护流量的过程。更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Encrypt Tomcat 8 Connections with Apache or Nginx on CentOS 7》

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

Maven

在使用 Maven 之前,我们必须要了解一下 Maven 到底是怎样管理 jar 包的,这就是 Maven 仓库要干的活了。

821
来自专栏黑泽君的专栏

linux下如何删除文件夹?

直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除; -f 就是直接强行删除,不作任何提示的意...

2301
来自专栏weixuqin 的专栏

Django 使用第三方服务发送电子邮件

1294
来自专栏前端之心

如何搭建主从架构的 DNS 服务器

前面我们介绍了如何搭建 DNS 服务器以及如何往 DNS 服务器添加反向解析记录,本文将在前面的基础上告诉大家如何搭建主从架构的 DNS 服务器。

5802
来自专栏Petrichor的专栏

apt-get指令

apt-cache search package #搜索包(相当于yum list | grep pkg) apt-cache show packag...

1421
来自专栏运维小白

2.8 创建和删除目录mkdir/rm

mkdir mkdir = make directory mkdir就是创建目录,不能级联创建目录 date 显示当前时间 mkdir -p ...

2019
来自专栏黑泽君的专栏

Ubuntu 16.04 LTS中没有.ssh文件,该如何解决呢?

sudo apt install openssh-server  或者  sudo apt-get install openssh-server

971
来自专栏云计算教程系列

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

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

4083
来自专栏IT开发技术与工作效率

Outlook清理邮件

1504
来自专栏python学习路

二、urllib进阶

Handler处理器 和 自定义Opener opener是 urllib.request.OpenerDirector 的实例,我们之前一直都在使用的ur...

3045

扫码关注云+社区

领取腾讯云代金券