介绍
Apache Tomcat 是一个 Web 服务器和服务器容器,旨在服务 Java 应用程序. 通常用于生产企业部署和较小的应用程序需求,Tomcat 既灵活又强大。
在本指南中,我们将讨论如何通过SSL保护您的CentOS 7 Tomcat安装。默认情况下,在安装时,Tomcat服务器和客户端之间的所有通信都没有加密,包括输入的任何密码或任何敏感数据。有几种方法可以将SSL纳入Tomcat安装中。
我们将讨论如何设置这两个 Apache 和 ** Nginx** 。
为什么要使用反向代理?
您可以为 Tomcat 安装设置 SSL 的几种方法,每种都具有其一系列的妥协。 了解到 Tomcat 有能力本地加密连接后,我们会讨论反向代理解决方案似乎很奇怪。
使用Tomcat的SSL有许多缺点,使其难以管理:
- ** Tomcat, 当使用非特权用户进行运行时, 无法像传统的SSL 端口那样约束受限制的端口 443** : (中文(简体) ). 这个问题有各种变通办法,例如利用`authbind'程序将一个没有特权的程序与一个受限制的端口相映射,设置有防火墙的端口转发等,但每个端口都增加了复杂性.
- 有Tomcat的SSL没有得到其他软件的广泛支持**: 像"让我们加密"这样的项目 无法提供与Tomcat互动的本土方式. 此外,Java keytore格式要求常规证书在使用前需要转换,这使得自动化复杂化.
- ** 常规网络服务器比Tomcat更频繁的发布** : 这会对您的应用程序产生重大的安全影响。 例如,被支持的Tomcat SSL密码套件可以很快地被过时,使您的应用程序有次优的保护. 如果需要安全更新, 更新网络服务器可能比您的Tomcat安装更容易 。 .
反向代理解决方案通过简单地在Tomcat安装前放置一个强大的Web服务器来绕过许多这些问题。Web服务器可以使用SSL来处理客户端请求,其功能是专门设计的。
这种关切的分离简化了配置,即使它意味着运行额外的软件。
前提条件
要完成本指南,您必须在您的服务器上已经安装了 Tomcat. 本指南将假定您使用了我们 Tomcat 8 on CentOS 7 安装指南中的说明来设置。
当你有一个Tomcat并运行时,继续下面的部分为你喜欢的Web服务器。 Apache 开始直接在下面,而 ** Nginx** 配置可以通过跳过前面一点找到。
(选项1)通过Apache Web Server的mod_jk
进行代理
Apache Web 服务器有一个名为mod_jk
的模块,可以使用 Apache JServ
协议直接与 Tomcat 通信. 该协议的连接器在 Tomcat 中默认启用,因此 Tomcat 已经准备好处理这些请求。
分类前提条件
在我们讨论如何向 Tomcat 连接 Apache 网页服务器之前,您必须安装和保护 Apache 网页服务器。
您可以按照 CentOS 7 LAMP 安装指南的步骤 1 安装 Apache Web 服务器。
之后,您将需要在服务器上设置SSL,您这样做的方式取决于您是否拥有域名。
- ** 如果您有一个域名... ** 保护您的服务器最简单的方式是使用Let's Encrypt, 它提供了免费的,信任的证书. 跟着我们让我们为Apache加密指南来设置这个.
- ** 如果您没有域...** 并且您只是使用此配置进行测试或个人使用,您可以使用自签名的证书取而代之. 这提供了同类型的加密,但没有域验证. 遵循我们[自签的 SSL 指南 Apache (https://andsky.com/tech/tutorials/how-to-create-an-ssl-certificate-on-apache-for-centos-7)来设置 。 .
当您完成这些步骤后,继续下方学习如何将Apache Web 服务器连接到您的Tomcat安装。
步骤1:编译和安装mod_jk
虽然Tomcat本身配备了JServ连接器,但CentOS 7包存储库不包含Apache网页服务器需要使用该协议进行通信的mod_jk
模块。
在下载连接器的源代码之前,我们需要从 CentOS 存储库中安装必要的构建和运行时间依赖性,我们将安装 GCC 来编译连接器和 Apache 网络服务器开发文件,使所需的 Apache 库可用。
1sudo yum install gcc httpd-devel
一旦依赖性已安装,请转到可编写的目录并下载连接器源代码。您可以在 Tomcat 连接器下载页面找到最新版本。 复制与 Tomcat JK 连接器的最新 tar.gz
源相关的链接,并使用 curl
命令将其下载到您的服务器:
1cd /tmp
2curl -LO http://mirrors.ibiblio.org/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
接下来,将 tarball 提取到当前目录中,然后移动到原生
子目录中,其中源代码和构建脚本位于提取的文件等级:
1tar xzvf tomcat-connectors*
2cd tomcat-connectors*/native
现在,我们已经准备好配置软件了,我们需要设置apxs
Apache扩展工具二进制的位置,以便为我们的服务器成功配置源。
1./configure --with-apxs=/usr/bin/apxs
2make
3sudo make install
这将将mod_jk
模块安装到Apache模块目录中。
步骤 2:配置 mod_jk 模块
现在,该模块已安装,我们可以配置Apache网络服务器以使用它与我们的Tomcat实例进行通信。
开始打开名为 jk.conf
的文件在 `/etc/httpd/conf.d 的目录中:
1sudo vi /etc/httpd/conf.d/jk.conf
在内部,我们需要通过下载mod_jk
模块开始。之后,我们将配置一个专用日志和共享内存文件。最后,我们将使用JkWorkersFile
指向我们将创建的文件,以指定我们的工人配置。
将下列配置粘贴到文件中以将这些部分连接在一起. 您不应该修改任何东西:
1[label /etc/httpd/conf.d/jk.conf]
2LoadModule jk_module modules/mod_jk.so
3
4JkLogFile logs/mod_jk.log
5JkLogLevel info
6JkShmFile logs/mod_jk.shm
7
8JkWorkersFile conf/workers.properties
保存并关闭文件,当你完成。
接下来,我们将创建工人属性文件,我们将使用此文件来定义工人连接到我们的Tomcat后端:
1sudo vi /etc/httpd/conf/workers.properties
在此文件中,我们将定义一个单个工人,该工人将使用 Apache JServ 协议版本 13 连接到我们的 Tomcat 实例在端口 8009 上:
1[label /etc/httpd/conf/workers.properties]
2worker.list=worker1
3worker.worker1.type=ajp13
4worker.worker1.host=127.0.0.1
5worker.worker1.port=8009
完成后,保存并关闭文件。
步骤 3:将 Apache 虚拟主机调整为mod_jk
的代理
最后,我们需要调整已启用SSL的Apache虚拟主机文件. 如果您遵循了前提条件,则该文件现在应该配置为使用可信或自签名的SSL证书来保护您的内容。
现在通过键入打开文件:
1sudo vi /etc/httpd/conf.d/ssl.conf
在内部,在VirtualHost
配置块中,添加一个JkMount
指令,将这个虚拟主机接收的所有流量传递给我们刚刚定义的工人实例。
1[label /etc/httpd/conf.d/ssl.conf]
2. . .
3
4<VirtualHost _default_:443>
5
6. . .
7JkMount /* worker1
8. . .
9
10</VirtualHost>
保存并关闭文件,当你完成。
接下来,通过键入检查您的配置:
1sudo apachectl configtest
如果输出包含Syntax OK
,请重新启动Apache Web 服务器过程:
1sudo systemctl restart httpd
您现在应该能够通过访问您的网站的SSL版本在您的Web浏览器访问您的Tomcat安装:
1https://example.com
接下来,跳过下面的 Nginx 配置,并继续参阅详细介绍如何限制访问 Tomcat 以完成配置的部分。
(选项 2) HTTP 与 Nginx 接口
如果您更喜欢使用 Nginx 作为 Web 服务器,则代理也容易使用 Nginx. 虽然 Nginx 没有允许它使用 Apache JServ 协议的模块,但它可以使用其强大的 HTTP 代理功能与 Tomcat 进行通信。
分类前提条件
在我们讨论如何将 Nginx 接口连接到 Tomcat 之前,您必须安装和保护 Nginx。
您如何做到这一点取决于您是否拥有域名。
- ** 如果您有一个域名... ** 保护您的服务器最简单的方式是使用Let's Encrypt, 它提供了免费的,信任的证书. 跟着我们的[让我们为Nginx加密指路 (https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-centos-7)来设置Nginx,并用Let's加密保护.
- ** 如果您没有域...** 并且您只是使用此配置进行测试或个人使用,您可以使用自签名的证书取而代之. 这提供了同类型的加密,但没有域验证. 遵循我们[自签名的 Nginx (https://andsky.com/tech/tutorials/how-to-create-a-self-signed-ssl-certificate-for-nginx-on-centos-7) SSL 指南安装 Nginx 并配置自签名证书 。 .
当您完成这些步骤后,继续下方学习如何将 Nginx 网页服务器连接到您的 Tomcat 安装。
步骤1:调整 Nginx 服务器块配置
将 Nginx 设置为 proxy 到 Tomcat 是非常直接的。
從開啟與您的網站相關的伺服器封鎖檔案開始。自訂和讓我們加密SSL指南都會設定在「/etc/httpd/conf.d/ssl.conf」檔案內的加密伺服器封鎖,所以我們會使用:
1sudo vi /etc/nginx/conf.d/ssl.conf
内部,向文件的顶部,我们需要添加一个上游
块,这将概述连接的细节,以便 Nginx知道我们的Tomcat服务器在听。
1[label /etc/nginx/sites-available/default]
2upstream tomcat {
3 server 127.0.0.1:8080 fail_timeout=0;
4}
5
6server {
7
8 . . .
接下来,在为端口443定义的服务器
块中,修改位置/
块,我们希望将所有请求直接传递给我们刚刚定义的上游
块,评论任何现有的内容,并使用proxy_pass
指令传递到我们刚刚定义的tomcat
上游。
我们还将设置一些标题,允许 Nginx 传输有关请求的 Tomcat 信息:
1[label /etc/nginx/sites-available/default]
2upstream tomcat {
3 server 127.0.0.1:8080 fail_timeout=0;
4}
5
6server {
7 . . .
8
9 location / {
10 #try_files $uri $uri/ =404;
11 proxy_pass http://tomcat/;
12 proxy_set_header Host $http_host;
13 proxy_set_header X-Real-IP $remote_addr;
14 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
15 proxy_set_header X-Forwarded-Proto $scheme;
16 }
17
18 . . .
19}
完成后,保存并关闭文件。
第2步:测试并重新启动 Nginx
接下来,测试以确保您的配置更改没有引入任何语法错误:
1sudo nginx -t
如果没有报告错误,请重新启动 Nginx 以实现更改:
1sudo systemctl restart nginx
您现在应该能够通过访问您的网站的SSL版本在您的Web浏览器访问您的Tomcat安装:
1https://example.com
限制访问 Tomcat 安装
现在你有SSL加密访问你的Tomcat安装,我们可以锁定Tomcat安装一点。
由于我们希望所有向Tomcat的请求都通过我们的代理,我们可以将Tomcat配置为仅在本地环绕接口上收听连接,从而确保外部方无法直接尝试向Tomcat提出请求。
在您的 Tomcat 配置目录中打开 server.xml
文件以更改这些设置:
1sudo vi /opt/tomcat/conf/server.xml
在此文件中,我们需要修改 Connector 的定义。目前配置中有两个连接器启用,其中一个处理 8080 端口上的正常 HTTP 请求,另一个处理 8009 端口上的 Apache JServ 协议请求。
1[label /opt/tomcat/conf/server.xml]
2. . .
3
4 <Connector port="8080" protocol="HTTP/1.1"
5 connectionTimeout="20000"
6 redirectPort="8443" />
7. . .
8
9 <!-- Define an AJP 1.3 Connector on port 8009 -->
10 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
为了限制对本地环绕接口的访问,我们只需要在这些连接器定义中添加一个地址
属性设置为127.0.0.1
。
1[label /opt/tomcat/conf/server.xml]
2. . .
3
4 <Connector port="8080" protocol="HTTP/1.1"
5 connectionTimeout="20000"
6 address="127.0.0.1"
7 redirectPort="8443" />
8. . .
9
10 <!-- Define an AJP 1.3 Connector on port 8009 -->
11 <Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" />
完成这两个更改后,保存并关闭文件。
我们需要重新启动我们的Tomcat流程来实施这些变化:
1sudo systemctl restart tomcat
您的 Tomcat 安装现在只能通过您的 Web 服务器代理服务器访问。
结论
在此时,与您的 Tomcat 实例的连接应该通过 Web 服务器代理服务器进行 SSL 加密. 虽然配置一个单独的 Web 服务器流程可能会增加服务您的应用程序的软件,但它大大简化了保护您的流量的过程。