首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Apache或Nginx加密Tomcat流量

使用Apache或Nginx加密Tomcat流量

原创
作者头像
藕丝空间
发布2018-08-01 15:51:32
1.4K0
发布2018-08-01 15:51:32
举报

介绍

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》

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

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

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

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

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