专栏首页云计算教程系列使用Apache或Nginx加密Tomcat流量
原创

使用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 条评论
登录 后参与评论

相关文章

  • 如何创建MySQL的物理备份

    虽然mysqldump工具是数据库系统的首选备份方法,但它仅在数据库服务器可运行时才有效。如果无法启动数据库或无法访问主机系统,我建议直接复制数据库。

    藕丝空间
  • 如何在macOS上安装Python 3并设置本地编程环境

    Python是一种多功能编程语言,可用于许多不同的编程项目。1991年首次出版,其名称灵感来自英国喜剧组织Monty Python,开发团队希望使Python成...

    藕丝空间
  • 如何在Ubuntu 18.04上安装和使用PostgreSQL

    关系数据库管理系统是许多网站和应用程序的关键组件。它们提供了一种存储,组织和访问信息的结构化方法。

    藕丝空间
  • 如何在Ubuntu 16.04上使用Apache或Nginx加密Tomcat 8连接

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

    信姜缘
  • Web服务器加速之Tomcat7性能如何调优

    秋日芒草
  • Tomcat爆出严重漏洞,影响所有版本,附解决方案!

    昨天,群里聊嗨了。大家都在远程办公,却都急急忙忙的升级线上的 Tomcat 版本,原因就是 Tomcat 被曝出了严重的漏洞,几乎涉及到所有的版本。

    业余草
  • 创建银行账户管理系统项目及Tomcat服务器搭建

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    魏晓蕾
  • Java Web入门基础之Tomcat

    可以这么理解Tomcat:开源的Web应用服务器,一般用于中小型系统和并发访问用户不是很多的情况下,是开发和调试JSP的首选。对于一个初学者来说,可以这样认为,...

    黄桂期
  • 思维导图学 Tomcat & Jetty

    作为一个Servlet容器,Tomcat的核心功能就是维护网络请求,将客户端的请求分解处理,分发到对应的具体处理逻辑中,然后获取响应结果包装返回给客户端。

    Yano_nankai
  • Tomcat性能调优方案

    一、操作系统调优  对于操作系统优化来说,是尽可能的增大可使用的内存容量、提高CPU的频率,保证文件系统的读写速率等。经过压力测试验证,在并发连接很多的情况下,...

    流柯

扫码关注云+社区

领取腾讯云代金券