如何在 CentOS 7 上用 Apache 或 Nginx 加密 Tomcat 8 连接

介绍

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

现在,我们已经准备好配置软件了,我们需要设置apxsApache扩展工具二进制的位置,以便为我们的服务器成功配置源。

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 服务器流程可能会增加服务您的应用程序的软件,但它大大简化了保护您的流量的过程。

Published At
Categories with 技术
comments powered by Disqus