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。
我们将介绍如何使用Apache和Nginx进行设置SSL。
您可以通过多种方式为Tomcat安装设置SSL,每种方法都有一定的权衡取舍。Tomcat本身也能够加密本地连接,我们是不是有点画蛇添足,多此一举呢?
使用Tomcat自带的SSL有许多缺点,非常难用:
反向代理解决方案可以在Tomcat服务前放置一个Web服务器来绕过这些问题。Web服务器可以使用SSL处理客户端请求。然后,它可以将请求代理到正常的Tomcat。这种方案分离简化了配置,但是他需要运行额外的软件。
要完成本教程,你需要具备以下内容:
sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。当您启动并运行Tomcat时,请继续下面的首选Web服务器部分。我们将直接从Apache开始,而Nginx配置则放在之后。
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
现在,我们已准备好配置该软件。我们需要设置apxs
Apache扩展工具二进制文件的位置,以便编译成功后直接使用。之后,我们可以使用make
构建并安装已编译的模块:
./configure --with-apxs=/usr/bin/apxs
make
sudo make install
这会将mod_jk
模块安装到Apache目录中。
现在已经安装了模块,我们可以配置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代理也很容易。虽然Nginx没有用Apache JServ协议的模块,但它可以使用其强大的HTTP代理功能与Tomcat进行通信。
您需要先安装Nginx,可以参考如何在CVM上安装Nginx这篇文章。
完成上面步骤后,请继续阅读下面的内容,了解如何将Nginx服务器连接到Tomcat。
设置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;
}
. . .
}
完成后,保存并关闭文件。
接下来,测试以确保您的配置更改不会有任何语法错误:
sudo nginx -t
如果未报任何错误,请重新启动Nginx以更改:
sudo systemctl restart nginx
您现在应该可以通过在Web浏览器内访问SSL版本的来连接Tomcat:
https://example.com
现在您拥有对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 删除。