介绍
Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。 Tomcat通常用于生产企业部署和较小的应用程序需求,既灵活又强大。 在本指南中,我们将讨论如何使用SSL保护CentOS 7 Tomcat安装。默认情况下,安装后,Tomcat服务器和客户端之间的所有通信都是未加密的,包括任何输入的密码或任何敏感数据。有很多方法可以将SSL加入我们的Tomcat安装。本指南将介绍如何设置启用SSL的代理服务器以与客户端安全协商,然后将请求转交给Tomcat。 我们将介绍如何设置这与 Apache和 Nginx 。为什么是反向代理?
有多种方法可以为Tomcat安装设置SSL,每种方法都有一组权衡。在了解到Tomcat能够本地加密连接之后,我们可能会讨论一个反向代理解决方案似乎很奇怪。 SSL与Tomcat有许多缺点,使其难以管理:- Tomcat对非特权用户推荐时无法绑定到受限制的端口,如传统的SSL端口443 :有解决方法,例如使用
authbind
程序映射非特权程序与受限端口,设置端口转发与防火墙等,但它们各自引入额外的复杂性。 - 与Tomcat的SSL不受其他软件广泛支持 :Let's Encrypt之类的项目不提供与Tomcat交互的本地方式。此外,Java密钥库格式要求在使用之前转换常规证书,这使自动化复杂化。
- 传统的Web服务器比Tomcat更频繁地发布 :这对您的应用程序有重大的安全隐患。例如,受支持的Tomcat SSL加密套件可能会快速过时,从而使应用程序无法获得最佳保护。在需要安全更新的情况下,更新Web服务器可能比Tomcat安装更容易。
先决条件
为了完成本指南,您必须在您的服务器上设置Tomcat。本指南假设您已经使用我们的 Tomcat 8中的说明在CentOS 7安装指南设置。 当您启动并运行Tomcat时,请继续下面的首选Web服务器部分。 Apache直接从下面开始,而 Nginx配置可以通过向前跳一点来找到。(选项1)使用Apache Web服务器的mod_jk
代理
Apache Web服务器有一个名为
mod_jk
的模块,它可以使用Apache“JServ”协议与Tomcat直接通信。默认情况下,在Tomcat中启用此协议的连接器,因此Tomcat已经准备好处理这些请求。
部分先决条件
在我们讨论如何代理Apache Web服务器到Tomcat的连接之前,您必须安装和保护Apache Web服务器。 您可以 按照CentOS 7 LAMP安装指南的第1步安装Apache Web服务器。不要安装MySQL或PHP。 之后,您需要在服务器上设置SSL。你这样做的方式取决于你是否有域名。- 如果你有一个域名...最安全的服务器的方法是Let's Encrypt,它提供免费的,可信的证书。 按照我们的Let's Encrypt指南为Apache设置。
- 如果您没有域...并且您正在使用此配置进行测试或个人使用,则可以改为使用自签名证书。 这提供了相同类型的加密,但没有域验证。 按照我们的自签名SSL指南进行设置。
第1步:编译和安装mod_jk
虽然Tomcat本身带有JServ连接器,但CentOS 7软件包存储库不包括Apache Web服务器使用该协议进行通信的
mod_jk
模块。要添加此功能,我们必须从Tomcat项目的网站下载并编译连接器。 在下载连接器的源代码之前,我们需要从CentOS存储库安装必要的构建和运行时依赖关系。我们将安装GCC来编译连接器和Apache Web服务器开发文件,以便所需的Apache库可用。
sudo yum install gcc httpd-devel
一旦安装了依赖关系,移动到可写目录并下载连接器源代码。您可以在
Tomcat连接器下载页面上找到最新版本。 复制与Tomcat JK连接器的最新
tar.gz
源相关联的链接,并使用
curl
命令将其下载到您的服务器:
cd /tmp
curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.42-src.tar.gz
接下来,将tarball解压缩到当前目录中,并移动到源代码和构建脚本位于提取的文件层次结构中的本机子目录中:
tar xzvf tomcat-connectors*
cd tomcat-connectors*/native
现在,我们准备好配置软件。我们需要设置
apxs
Apache扩展工具二进制文件的位置,以便为我们的服务器成功配置源代码。 之后,我们可以使用
make
来构建软件并安装已编译的模块:
./configure --with-apxs=/usr/bin/apxs
make
sudo make install
这将安装
mod_jk
模块到Apache modules目录。
第2步:配置mod_jk模块
现在模块已安装,我们可以配置Apache Web服务器使用它来与我们的Tomcat实例进行通信。这可以通过设置几个配置文件来完成。 首先在/etc/httpd/conf.d
目录中打开一个名为
jk.conf
的文件:
sudo vi /etc/httpd/conf.d/jk.conf
在内部,我们需要通过加载
mod_jk
模块来开始。 然后,我们将配置一个专用的日志和共享内存文件。 最后,我们将使用
JkWorkersFile
指令指向我们将要创建的文件以指定我们的工作程序配置。 将以下配置粘贴到文件中以将这些片段链接在一起。你不应该修改任何东西:
/etc/httpd/conf.d/jk.conf
LoadModule jk_module modules/mod_jk.so
JkLogFile logs/mod_jk.log
JkLogLevel info
JkShmFile logs/mod_jk.shm
JkWorkersFile conf/workers.properties
保存并在完成后关闭文件。 接下来,我们将创建工作程序属性文件。我们将使用这个来定义一个工作者连接到我们的Tomcat后端:
sudo vi /etc/httpd/conf/workers.properties
在这个文件中,我们将定义一个单独的worker,它将使用Apache JServ协议的版本13连接到端口8009上的Tomcat实例:
/etc/httpd/conf/workers.properties
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009
完成后,保存并关闭文件。
第3步:使用mod_jk
将Apache虚拟主机调整为代理
最后,我们需要调整已启用SSL的Apache Virtual Host文件。如果您遵循先决条件,则应当当前配置为使用受信任或自签名的SSL证书保护您的内容。 通过键入以下内容打开文件:
sudo vi /etc/httpd/conf.d/ssl.conf
在
VirtualHost
配置块内部,添加一个JkMount指令,将该虚拟主机接收到的所有流量传递给我们刚定义的工作器实例。
VirtualHost
可以放置在
VirtualHost
部分中的任何地方:
/etc/httpd/conf.d/ssl.conf
. . .
<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为了完成您的配置。
(选项2)使用Nginx的HTTP代理
代理也很容易与Nginx,如果你喜欢它Apache网络服务器。虽然Nginx没有允许它使用Apache JServ协议的模块,但它可以使用其强大的HTTP代理功能与Tomcat通信。部分先决条件
在我们可以讨论如何代理Nginx连接到Tomcat之前,您必须安装和保护Nginx。 你这样做的方式取决于你是否有域名。- 如果你有一个域名...最安全的服务器的方法是Let's Encrypt,它提供免费的,可信的证书。 按照我们的让我们加密指南Nginx设置Nginx和安全它与Let's Encrypt。
- 如果您没有域...并且您正在使用此配置进行测试或个人使用,则可以改为使用自签名证书。 这提供了相同类型的加密,但没有域验证。 按照我们的自签名SSL指南为Nginx安装Nginx并配置它与自签名证书。
第1步:调整Nginx服务器块配置
设置Nginx代理到Tomcat非常简单。 首先打开与您的站点相关联的服务器块文件。自签名和Let's Encrypt SSL指南都在/etc/httpd/conf.d/ssl.conf
文件中配置加密的服务器块,因此我们将使用:
sudo vi /etc/nginx/conf.d/ssl.conf
在里面,朝向文件的顶部,我们需要添加一个
upstream
块。 这将概述连接细节,以便Nginx知道我们的Tomcat服务器正在监听。 将其放置在文件中定义的任何
server
块的外部:
/ etc / nginx / sites-available / default
upstream tomcat {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
. . .
接下来,在为端口443定义的
server
块中,修改
location /
块。 我们想将所有请求直接传递给我们刚才定义的
upstream
块。 注释掉任何现有内容,并使用
proxy_pass
指令传递给我们刚定义的“tomcat”上游。 我们还将设置一些标头,允许Nginx传递有关请求的Tomcat信息:
/ etc / nginx / sites-available / default
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;
}
. . .
}
完成后,保存并关闭文件。
第2步:测试并重新启动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协议请求。配置将如下所示:
/opt/tomcat/conf/server.xml
. . .
<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”属性设置为127.0.0.1。最终结果将如下所示:
/opt/tomcat/conf/server.xml
. . .
<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
您的Tomcat安装现在只能通过Web服务器代理访问。