Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 14 章 Web 服务器

Web 服务器是一个通过 Web 向客户端提供内容的网络服务。这通常是网页,但也可以提供任何其他文档。Web 服务器也称为 HTTP 服务器,因为它们使用 超文本传输协议 (HTTP)。

Red Hat Enterprise Linux 7 中的 web 服务器包括:

  • Apache HTTP 服务器
  • nginx
重要

请注意,nginx web 服务器仅可用作 Red Hat Enterprise Linux 7 的软件集合。有关获取 nginx 访问权限、软件集合和其他信息,请参阅 Red Hat Software Collections 发行注记。

14.1. Apache HTTP 服务器

本节重点介绍 Apache HTTP 服务器 2.4 httpd,这是由 Apache 软件基金会 开发的开源 Web 服务器。

如果您要从之前的 Red Hat Enterprise Linux 版本升级,则需要相应地更新 httpd 服务配置。本节回顾了一些新添加的功能,概述了 Apache HTTP 服务器 2.4 和版本 2.2 之间的重要更改,并指导您更新较旧的配置文件。

14.1.1. 显著变化

与 Red Hat Enterprise Linux 6 相比,Red Hat Enterprise Linux 7 中的 Apache HTTP 服务器有以下变化:

httpd 服务控制

在从 SysV 初始化脚本迁出后,服务器管理员应切换 为使用 apachectlsystemctl 命令来控制服务(代替 service 命令)。以下示例专用于 httpd 服务。

该命令:

service httpd graceful

替换为

apachectl graceful

httpdsystemd 单元文件与初始化脚本有不同的行为,如下所示:

  • 在重新加载服务时,默认使用正常重启。
  • 服务停止时,默认使用正常停止。

    该命令:

    service httpd configtest

    替换为

    apachectl configtest
私有/tmp
为增强系统安全性,systemd 单元文件使用专用 /tmp 目录运行 httpd 守护进程,独立于系统的 /tmp 目录。
配置布局

加载模块的配置文件现在放在 /etc/httpd/conf.modules.d/ 目录中。为 httpd 提供其他可加载模块的软件包(如 php )将文件放在此目录中。在 /etc/httpd/conf/httpd.conf 文件的主部分前面使用 Include 指令来包含 /etc/httpd/conf.modules.d/ 目录中的文件。这意味着在 httpd .conf 主体之前处理conf.modules. d/ 中的任何配置文件。httpd.conf 文件的末尾放置了针对 /etc/httpd/conf.d/ 目录中文件的 IncludeOptional 指令。这意味着 /etc/httpd/conf.d/ 中的文件现在在 httpd.conf 的主正文之后处理。

httpd 软件包本身提供一些额外的配置文件:

  • /etc/httpd/conf.d/autoindex.conf - 这将配置 mod_autoindex 目录索引。
  • /etc/httpd/conf.d/userdir.conf - 它配置对用户目录的访问,例如 http://example.com/~username/。由于安全原因,此类访问会被默认禁用。
  • /etc/httpd/conf.d/welcome.conf - 如之前版本中,这会配置在没有内容时为 http://localhost/ 显示的欢迎页面。
默认配置
现在默认提供了一个最小的 httpd.conf 文件。默认配置中不再明确配置许多常用配置设置,如 TimeoutKeepAlive ;默认情况下,将使用硬编码的设置。所有配置指令的硬编码默认设置在 manual 中指定。如需更多信息,请参阅 “可安装文档”一节
不兼容的语法变化
如果将现有配置从 httpd 2.2 迁移到 httpd 2.4,则需要对 httpd 配置语法进行向后兼容的一些更改。有关升级 http://httpd.apache.org/docs/2.4/upgrading.html的详情,请查看以下 Apache 文档
处理模型

在以前的 Red Hat Enterprise Linux 版本中,提供了不同的 多处理模型 (MPM)作为不同的 httpd 二进制文件:分叉模型、"prefork"作为 /usr/sbin/httpd,以及基于线程的模式"worker"作为 /usr/sbin/httpd.worker

在红帽企业 Linux 7 中,仅使用一个 httpd 二进制文件,三个 MPM 则作为可加载模块提供:worker、prefork(默认)和事件。根据需要编辑配置文件 /etc/httpd/conf.modules.d/00-mpm.conf,添加和删除注释字符 #,以便只加载三个 MPM 模块中的一个。

打包的更改

LDAP 身份验证和授权模块现在在单独的子软件包 mod_ldap 中提供。新模块 mod_session 和关联的帮助程序模块在新的子软件包 mod_session 中提供。新模块 mod_proxy_htmlmod_xml2enc 在新的子软件包 mod_proxy_html 中提供。这些软件包都位于可选频道中。

打包文件系统布局

不再提供 /var/cache/mod_proxy/ 目录,而是使用 proxyssl 子目录打包 /var/cache/httpd/ 目录。

httpd 提供的打包内容已从 /var/www/ 移到 /usr/share/httpd/

  • /usr/share/httpd/icons/ - 包含一组用于目录索引的图标的目录(之前包含在 /var/wwww/icons/ 中) 已移到 /usr/share/httpd/icons/。在默认配置 http://localhost/icons/ 中可用;图标的位置和可用结构可在 /etc/httpd/conf.d/autoindex.conf 文件中进行配置。
  • /usr/share/httpd/manual/ - /var/www/manual/ 已移到 /usr/share/httpd/manual/。此目录包含在 httpd-manual 软件包中,包含 httpd 的 manual 的 HTML 版本。如果安装了该软件包,位于 http://localhost/manual/ 处可用,则在 /etc/httpd/conf.d/manual.conf 文件中可以配置手动的位置和可用性。
  • /usr/share/httpd/error/ - /var/www/error/ 已移至 /usr/share/httpd/error/。自定义多语言 HTTP 错误页面.默认情况下不配置,示例配置文件在 /usr/share/doc/httpd-VERSION/httpd-multilang-errordoc.conf 中提供
身份验证、授权和访问控制
用于控制身份验证、授权和访问控制的配置指令已显著变化。使用 OrderDenyAllow 指令的现有配置文件应改编为使用新的 Require 语法。详情请查看以下 Apache 文档 http://httpd.apache.org/docs/2.4/howto/auth.html
suexec
为提高系统安全性,suexec 二进制文件不再安装,就像由 root 用户一样,而是设置文件系统功能位,从而允许一组更严格的权限。与此更改结合使用,suexec 二进制文件不再使用 /var/log/httpd/suexec.log 日志文件。相反,日志消息会发送到 syslog ;默认情况下,这些消息将显示在 /var/log/secure 日志文件中。
模块接口

由于 httpd 模块接口的更改,根据 httpd 2.2 构建的第三方二进制模块不兼容 httpd 2.4。对于 httpd 2.4 模块接口,需要根据需要调整这些模块,然后重新构建。有关版本 2.4 中 API 更改的详细列表,请参考 http://httpd.apache.org/docs/2.4/developer/new_api_2_4.html

用于从源构建模块的 apxs 二进制文件已从 /usr/sbin/apxs 移到 /usr/bin/apxs

删除的模块

在 Red Hat Enterprise Linux 7 中删除的 httpd 模块列表:

mod_auth_mysql, mod_auth_pgsql
httpd 2.4mod_authn_dbd 模块内部提供 SQL 数据库身份验证支持。
mod_perl
上游 httpd 2.4 不支持 mod_perl
mod_authz_ldap
httpd 2.4 使用 mod_ authnz_ldap 在子软件包 mod_ldap 中提供 LDAP 支持。

14.1.2. 更新配置

要从 Apache HTTP Server 版本 2.2 更新配置文件,请执行以下步骤:

  1. 确保所有模块名称都正确,因为它们可能已更改。调整已重命名的每个模块的 LoadModule 指令。
  2. 重新编译所有第三方模块,然后尝试载入它们。这通常意味着身份验证和授权模块。
  3. 如果您使用 mod_userdir 模块,请确保提供了指明目录名称(通常是 public_html)的 UserDir 指令。
  4. 如果您使用 Apache HTTP 安全服务器,请参阅 第 14.1.8 节 “启用 mod_ssl 模块” 来获得有关启用安全套接字层(SSL)协议的重要信息。

请注意,您可以使用以下命令检查配置中可能存在的错误:

~]# apachectl configtest
Syntax OK

有关将 Apache HTTP 服务器配置从 2.2 升级到 2.4 的更多信息,请参阅 http://httpd.apache.org/docs/2.4/upgrading.html

14.1.3. 运行 httpd 服务

这部分论述了如何启动、停止、重新启动和检查 Apache HTTP 服务器的当前状态。若要能够使用 httpd 服务,请确保已安装了 httpd。您可以使用以下命令完成此操作:

~]# yum install httpd

有关目标概念以及如何在 Red Hat Enterprise Linux 中管理系统服务的详情请参考 第 10 章 使用 systemd 管理服务

14.1.3.1. 启动服务

要运行 httpd 服务,以 root 用户身份在 shell 提示符后输入以下内容:

~]# systemctl start httpd.service

如果您希望该服务在引导时自动启动,请使用以下命令:

~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
注意

如果将 Apache HTTP 服务器作为安全服务器运行,则计算机启动后可能需要密码(如果使用加密的私钥 SSL 密钥)。

14.1.3.2. 停止服务

要停止正在运行的 httpd 服务,以 root 用户身份在 shell 提示符后输入以下内容:

~]# systemctl stop httpd.service

要防止服务在引导时自动启动,请输入:

~]# systemctl disable httpd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

14.1.3.3. 重启服务

重启正在运行的 httpd 服务有三种不同的方法:

  1. 要完全重启该服务,以 root 用户身份输入以下命令:

    ~]# systemctl restart httpd.service

    这将停止正在运行的 httpd 服务,并立即重新启动它。安装或删除动态加载的模块(如 PHP)后,请使用此命令。

  2. 要只重新载入配置,以 root 用户身份输入:

    ~]# systemctl reload httpd.service

    这会导致正在运行的 httpd 服务重新加载其配置文件。当前处理的任何请求都将中断,这可能会导致客户端浏览器显示错误消息或呈现部分页面。

  3. 要在不影响活跃请求的情况下重新载入配置,以 root 用户身份输入以下命令:

    ~]# apachectl graceful

    这会导致正在运行的 httpd 服务重新加载其配置文件。当前处理的任何请求都将继续使用旧配置。

有关如何在 Red Hat Enterprise Linux 7 中管理系统服务的详情请参考 第 10 章 使用 systemd 管理服务

14.1.3.4. 验证服务状态

要验证 httpd 服务是否正在运行,在 shell 提示符后输入以下内容:

~]# systemctl is-active httpd.service
active

14.1.4. 编辑配置文件

httpd 服务启动时,它默认从 表 14.1 “httpd 服务配置文件” 中列出的位置读取配置。

表 14.1. httpd 服务配置文件

路径描述

/etc/httpd/conf/httpd.conf

主配置文件。

/etc/httpd/conf.d/

主配置文件中包含的配置文件的辅助目录。

虽然默认配置应该适合大多数情况,但最好至少熟悉一些更重要的配置选项。请注意,要使任何更改生效,必须首先重新启动 Web 服务器。有关如何重启 httpd 服务的更多信息,请参阅 第 14.1.3.3 节 “重启服务”

要检查配置中的可能错误,在 shell 提示符后输入以下内容:

~]# apachectl configtest
Syntax OK

为了更容易从错误中恢复,建议您先复制原始文件的副本,然后再编辑该文件。

14.1.5. 使用模块

作为模块化应用,httpd 服务与多个 动态共享对象( DSO)一起分发,可以根据需要在运行时动态加载或卸载。在 Red Hat Enterprise Linux 7 中,这些模块位于 /usr/lib64/httpd/modules/ 中。

14.1.5.1. 加载模块

若要加载特定的 DSO 模块,可使用 LoadModule 指令。请注意,由单独的包提供的模块通常在 /etc/httpd/conf.d/ 目录中具有自己的配置文件。

例 14.1. 载入 mod_ssl DSO

LoadModule ssl_module modules/mod_ssl.so

完成后,重新启动 Web 服务器以重新加载配置。有关如何重启 httpd 服务的更多信息,请参阅 第 14.1.3.3 节 “重启服务”

14.1.5.2. 编写模块

如果您打算创建新的 DSO 模块,请确保已安装了 httpd-devel 软件包。要做到这一点,以 root 用户身份输入以下命令:

~]# yum install httpd-devel

此软件包包含编译模块所需的 include 文件、标题文件和 APache eXtenSion (apxs)实用程序。

编写完成后,可以使用以下命令构建模块:

~]# apxs -i -a -c module_name.c

如果构建成功,您应该能够像通过 Apache HTTP 服务器分发的任何其他模块一样加载该模块。

14.1.6. 设置虚拟主机

Apache HTTP 服务器内置的虚拟主机允许服务器根据请求的 IP 地址、主机名或端口提供不同的信息。

若要创建基于名称的虚拟主机,请将示例配置文件 /usr/share/doc/httpd-VERSION/httpd-vhosts.conf 复制到 / etc/httpd/conf.d/ 目录中,并替换 @@Port@@ 和 @@ ServerRoot@ 占位符值。根据 例 14.2 “虚拟主机配置示例” 中所示的要求自定义选项。

例 14.2. 虚拟主机配置示例

<VirtualHost *:80>
  ServerAdmin webmaster@penguin.example.com
  DocumentRoot "/www/docs/penguin.example.com"
  ServerName penguin.example.com
  ServerAlias www.penguin.example.com
  ErrorLog "/var/log/httpd/dummy-host.example.com-error_log"
  CustomLog "/var/log/httpd/dummy-host.example.com-access_log" common
</VirtualHost>

请注意,ServerName 必须是分配给机器的有效 DNS 名称。<VirtualHost> 容器可高度自定义,并接受主服务器配置中提供的大部分指令。此容器中 不支持 的指令包括由 SuexecUserGroup 替代的 用户和组

注意

如果您将虚拟主机配置为侦听非默认端口,请确保相应地更新 /etc/httpd/conf/httpd.conf 文件的全局 settings 部分中的 Listen 指令。

要激活新创建的虚拟主机,必须首先重新启动 Web 服务器。有关如何重启 httpd 服务的更多信息,请参阅 第 14.1.3.3 节 “重启服务”

14.1.7. 设置 SSL 服务器

安全套接字层 (SSL)是一种加密协议,允许服务器和客户端安全地通信。除了称为传输层安全性( TLS)的扩展和改进版本外,它还确保了隐私和数据完整性。Apache HTTP 服务器与 mod_ssl 相结合,此模块使用 OpenSSL 工具包来提供 SSL/TLS 支持,通常称为 SSL 服务器。Red Hat Enterprise Linux 还支持将 Mozilla NSS 用作 TLS 实现。对 Mozilla NSS 的支持由 mod_nss 模块提供。

与能够拦截它的 HTTP 连接的 HTTP 连接不同,通过 HTTP(称为 HTTPS)使用 SSL/TLS 会阻止对传输的内容进行任何检查或修改。本节提供有关如何在 Apache HTTP 服务器配置中启用此模块的基本信息,并指导您完成生成私钥和自签名证书的过程。

14.1.7.1. 证书和安全概述

安全通信基于密钥的使用。在传统或对称加密中,交易两端都有相同的密钥来解码彼此的传输。另一方面,在公钥或非对称加密中 ,两个密钥并存:一个保存机密的私钥,也是通常与公钥 共享的公钥。虽然使用公钥编码的数据只能使用私钥进行解码,但使用私钥编码的数据反过来只能使用公钥解码。

若要使用 SSL 提供安全通信,SSL 服务器必须使用证书颁发机构(CA )签署的数字证书。证书列出了服务器的各种属性(即服务器主机名、公司名称、位置等),以及使用 CA 的私钥生成的签名。此签名可确保特定证书认证机构已签署证书,并且证书没有被以任何方式修改。

Web 浏览器建立新的 SSL 连接时,它将检查 Web 服务器提供的证书。如果证书没有来自可信 CA 的签名,或者证书中列出的主机名与用于建立连接的主机名不匹配,则它将拒绝与服务器通信,并且通常向用户提供相应的错误消息。

默认情况下,大多数 Web 浏览器都配置为信任一组广泛使用的证书颁发机构。因此,设置安全服务器时应选择适当的 CA,以便目标用户信任连接,否则会显示错误消息,并且必须手动接受证书。由于鼓励用户覆盖证书错误可能会允许攻击者拦截连接,所以您应该尽可能使用信任的 CA。详情请查看 表 14.2 “有关常用 Web 浏览器使用的 CA 列表的信息”

表 14.2. 有关常用 Web 浏览器使用的 CA 列表的信息

在设置 SSL 服务器时,您需要生成证书请求和私钥,然后发送证书请求、公司身份证明以及向证书颁发机构付款。当 CA 验证证书请求和您的身份后,它将向您发送签名的证书,您可以将其用于您的服务器。或者,您可以创建一个不包含 CA 签名的自签名证书,因此只用于测试目的。

14.1.8. 启用 mod_ssl 模块

如果您打算使用 mod_ssl 设置 SSL 或 HTTPS 服务器,则无法 具有另一个应用或模块,如 mod_nsss 配置为使用同一端口。端口 443 是 HTTPS 的默认端口。

要使用 mod_ssl 模块和 OpenSSL 工具包设置 SSL 服务器,请安装 mod_sslopenssl 软件包。以 root 用户身份输入以下命令:

~]# yum install mod_ssl openssl

这将 /etc/httpd/conf.d/ssl.conf 中创建 mod_ ssl 配置文件,默认包含在 Apache HTTP 服务器主配置文件中。要加载模块,请重新启动 httpd 服务,如 第 14.1.3.3 节 “重启服务” 所述。

重要

由于 POODLE 中描述的漏洞:SSLv3 漏洞(CVE-2014-3566), 红帽建议禁用 SSL,仅使用 TLSv1.1TLSv1.2。可以使用 TLSv1.0 实现向后兼容性。许多红帽支持的产品都能够使用 SSLv2 或 SSLv3 协议,或者默认启用它们。但是,现在强烈建议使用 SSLv2 或 SSLv3

14.1.8.1. 在 mod_ssl 中启用和禁用 SSL 和 TLS

要禁用并启用 SSL 和 TLS 协议的特定版本,可在全局范围内添加配置文件的" # SSL 全局上下文"部分中的 SSLProtocol 指令,并在所有其他位置将其删除,或者在所有"VirtualHost"部分中编辑"SSL 协议支持"下的默认条目。如果您没有在每个域 VirtualHost 部分中指定,它将继承 global 部分中的设置。为确保协议版本被禁用,管理员应 仅在 "SSL Global Context"部分中指定 SSLProtocol,或者 在所有 域 VirtualHost 部分中指定。

禁用 SSLv2 和 SSLv3

要禁用 SSL 版本 2 和 SSL 版本 3,这意味着在所有 VirtualHost 部分中启用 SSL 版本 2 和 SSL 版本 3 之外的所有内容,如下方所示:

  1. root 身份,打开 /etc/httpd/conf.d/ssl.conf 文件并搜索 SSLProtocol 指令 的所有 实例。默认情况下,配置文件包含一个如下所示的部分:

    ~]# vi /etc/httpd/conf.d/ssl.conf
    #  SSL Protocol support:
    # List the enable protocol levels with which clients will be able to
    # connect. Disable SSLv2 access by default:
    SSLProtocol all -SSLv2

    本节位于 VirtualHost 部分中。

  2. 编辑 SSLProtocol 行,如下所示:

    #  SSL Protocol support:
    # List the enable protocol levels with which clients will be able to
    # connect. Disable SSLv2 access by default:
    SSLProtocol all -SSLv2 -SSLv3

    对所有 VirtualHost 部分重复此操作。保存并关闭该文件。

  3. 验证所有出现 SSLProtocol 指令都已更改,如下所示:

    ~]# grep SSLProtocol /etc/httpd/conf.d/ssl.conf
    SSLProtocol all -SSLv2 -SSLv3

    如果您有一个以上的默认 VirtualHost 部分,则这一步尤为重要。

  4. 重启 Apache 守护进程,如下所示:

    ~]# systemctl restart httpd

    请注意,任何会话都将中断。

禁用所有 SSL 和 TLS 协议,接受 TLS 1 并启动

要禁用除 TLS 版本 1 及更高版本以外的所有 SSL 和 TLS 协议版本,请按如下操作:

  1. root 身份,打开 /etc/httpd/conf.d/ssl.conf 文件并搜索 所有 SSLProtocol 指令实例。默认情况下,该文件包含如下部分:

    ~]# vi /etc/httpd/conf.d/ssl.conf
    #  SSL Protocol support:
    # List the enable protocol levels with which clients will be able to
    # connect. Disable SSLv2 access by default:
    SSLProtocol all -SSLv2
  2. 编辑 SSLProtocol 行,如下所示:

    #  SSL Protocol support:
    # List the enable protocol levels with which clients will be able to
    # connect. Disable SSLv2 access by default:
    SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2

    保存并关闭该文件。

  3. 按如下所示验证更改:

    ~]# grep SSLProtocol /etc/httpd/conf.d/ssl.conf
    SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
  4. 重启 Apache 守护进程,如下所示:

    ~]# systemctl restart httpd

    请注意,任何会话都将中断。

测试 SSL 和 TLS 协议的状态

要检查哪些版本的 SSL 和 TLS 已启用或禁用,请使用 openssl s_client -connect 命令。该命令具有以下格式:

openssl s_client -connect hostname:port -protocol

其中端口是要测试的端口 ,协议是要测试的协议版本。若要测试本地运行的 SSL 服务器,请使用 localhost 作为主机名。例如:要测试安全 HTTPS 连接的默认端口,端口 443 查看是否启用 SSLv3,请发出以下命令:

~]# openssl s_client -connect localhost:443 -ssl3
CONNECTED(00000003)
139809943877536:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1257:SSL alert number 40
139809943877536:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596:
output omitted
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
  Protocol : SSLv3
output truncated

以上输出表明握手失败,因此不会协商任何密码。

~]$ openssl s_client -connect localhost:443 -tls1_2
CONNECTED(00000003)
depth=0 C = --, ST = SomeState, L = SomeCity, O = SomeOrganization, OU = SomeOrganizationalUnit, CN = localhost.localdomain, emailAddress = root@localhost.localdomain
output omitted
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
  Protocol : TLSv1.2
output truncated

以上输出表明没有发生握手失败,并且协商一组密码。

openssl s_client 命令选项记录在 s_client(1) 手册页中。

有关 SSLv3 漏洞以及如何对其进行测试的更多信息,请参阅红帽知识库文章 POODLE:SSLv3 漏洞(CVE-2014-3566 )。

14.1.9. 启用 mod_nss 模块

如果您打算使用 mod_nss 设置 HTTPS 服务器,则无法 安装 mod_ssl 软件包,其默认设置为 mod_ssl,默认情况下 将使用端口 443,但这是默认的 HTTPS 端口。如果可能,删除 软件包。

要删除 mod_ssl,以 root 用户身份输入以下命令:

~]# yum remove mod_ssl
注意

如果需要 mod_ssl 用于其他目的,请修改 /etc/httpd/conf.d/ssl.conf 文件,以使用 443 之外的端口来防止 mod_ssl 在端口被更改为 443 时与 mod_nss 冲突。

只有一个模块可以拥有一个端口,因此 mod_nssmod_ssl 只能同时共存(如果它们使用唯一端口)。因此,默认情况下 mod_nss 使用 8443,但 HTTPS 的默认端口是端口 443。端口由 Listen 指令以及 VirtualHost 名称或地址指定。

NSS 中的所有内容都与"令牌"关联。软件令牌存在于 NSS 数据库中,但您也可以有一个包含证书的物理令牌。使用 OpenSSL 时,离散证书和私钥保存在 PEM 文件中。对于 NSS,这些内容存储在数据库中。每个证书和密钥都与令牌关联,每个令牌都可以有密码保护。此密码是可选的,但是如果使用密码,则 Apache HTTP 服务器需要该密码的副本才能在系统启动时无需用户干预即可打开数据库。

配置 mod_nss

  1. root 用户身份安装 mod_nss:

    ~]# yum install mod_nss

    这将在 /etc/httpd/conf.d/ nss.conf 中创建 mod_ nss 配置文件。默认情况下,/etc/httpd/conf.d/ 目录包含在 Apache HTTP 服务器主配置文件中。要加载模块,请重新启动 httpd 服务,如 第 14.1.3.3 节 “重启服务” 所述。

  2. root 身份,打开 /etc/httpd/conf.d/nss.conf 文件并搜索 Listen 指令 的所有 实例。

    编辑 Listen 8443 行,如下所示:

    Listen 443

    端口 443HTTPS 的默认端口。

  3. 编辑默认 VirtualHost default: 8443 行,如下所示:

    VirtualHost default:443

    编辑任何其他非默认虚拟主机部分(若存在)。保存并关闭该文件。

  4. Mozilla NSS 将证书存储在 /etc/httpd/conf.d/nss.conf 文件中的 NSSCertificateDatabase 指令表示的 服务器证书数据库中。默认情况下,路径设置为 /etc/httpd/alias,这是在安装过程中创建的 NSS 数据库。

    要查看默认 NSS 数据库,请使用以下命令:

    ~]# certutil -L -d /etc/httpd/alias
    
    Certificate Nickname                     Trust Attributes
                                   SSL,S/MIME,JAR/XPI
    
    cacert                            CTu,Cu,Cu
    Server-Cert                         u,u,u
    alpha                            u,pu,u

    在以上命令输出中,Server-Cert 是默认的 NSSNicknameL 选项 会在证书数据库中列出所有证书,或者显示有关指定证书的信息。d 选项指定 包含证书和密钥数据库文件的数据库目录。有关更多命令行选项,请参阅 certutil(1) man page。

  5. 要将 mod_nss 配置为使用其他数据库,请编辑 /etc/httpd/conf.d/nss.conf 文件中的 NSSCertificateDatabase 行。默认 文件在 VirtualHost 部分中具有以下行:

    #  Server Certificate Database:
    #  The NSS security database directory that holds the certificates and
    #  keys. The database consists of 3 files: cert8.db, key3.db and secmod.db.
    #  Provide the directory that these files exist.
    NSSCertificateDatabase /etc/httpd/alias

    在以上命令输出中,alia 是默认 NSS 数据库目录 /etc/httpd/alias/

  6. 要将密码应用到默认 NSS 证书数据库,以 root 用户身份运行以下命令:

    ~]# certutil -W -d /etc/httpd/alias
    Enter Password or Pin for "NSS Certificate DB":
    Enter a password which will be used to encrypt your keys.
    The password should be at least 8 characters long,
    and should contain at least one non-alphabetic character.
    
    Enter new password:
    Re-enter password:
    Password changed successfully.
  7. 在部署 HTTPS 服务器之前,请使用由证书颁发机构(CA)签名的证书创建新证书数据库。

    例 14.3. 在 Mozilla NSS 数据库中添加证书

    certutil 命令用于在 NSS 数据库文件中添加 CA 证书:

    certutil -d /etc/httpd/nss-db-directory/ -A -n "CA_certificate" -t CT,, -a -i certificate.pem

    以上命令添加存储在名为 certificate.pem 的 PEM 格式文件中的 CA 证书。d 选项指定 包含证书和密钥数据库文件的 NSS 数据库目录,-n 选项设置证书的名称 -t CT, 表示证书受信任可用于 TLS 客户端和服务器。A 选项将 现有证书添加到证书数据库。如果数据库不存在,它将被创建。a 选项 允许将 ASCII 格式用于输入或输出,而 -i 选项则将 certificate.pem 输入文件传递到 命令。

    有关更多命令行选项,请参阅 certutil(1) man page。

  8. NSS 数据库应设有密码保护,以保护私钥。

    例 14.4. 为 Mozilla NSS 数据库设置密码

    certutil 工具可以为 NSS 数据库设置密码,如下所示:

    certutil -W -d /etc/httpd/nss-db-directory/

    例如,对于默认数据库,以 root 身份发出命令,如下所示:

    ~]# certutil -W -d /etc/httpd/alias
    Enter Password or Pin for "NSS Certificate DB":
    Enter a password which will be used to encrypt your keys.
    The password should be at least 8 characters long,
    and should contain at least one non-alphabetic character.
    
    Enter new password:
    Re-enter password:
    Password changed successfully.
  9. 通过使用 NSS PassPhraseDialog 指令更改行,将 mod_nss 配置为使用 NSS 内部软件令牌:

    ~]# vi /etc/httpd/conf.d/nss.conf
    NSSPassPhraseDialog file:/etc/httpd/password.conf

    这是为了避免在系统启动时手动输入密码。软件令牌存在于 NSS 数据库中,但您也可以拥有包含您的证书的物理令牌。

  10. 如果 NSS 数据库中包含的 SSL 服务器证书是 RSA 证书,请确保未注释 NSSNickname 参数并与上面第 4 步中显示的 nickname 匹配:

    ~]# vi /etc/httpd/conf.d/nss.conf
    NSSNickname Server-Cert

    如果 NSS 数据库中包含的 SSL 服务器证书是 ECC 证书,请确保 NSSECCNickname 参数未注释,并与上一步 4 中显示的 nickname 匹配:

    ~]# vi /etc/httpd/conf.d/nss.conf
    NSSECCNickname Server-Cert

    确保 NSSCertificateDatabase 参数未注释,并指向在第 4 步中显示的 NSS 数据库目录,或者在上面的步骤 5 中配置:

    ~]# vi /etc/httpd/conf.d/nss.conf
    NSSCertificateDatabase /etc/httpd/alias

    /etc/httpd/alias 替换为要使用的证书数据库的路径。

  11. root 用户身份创建 /etc/httpd/password.conf 文件:

    ~]# vi /etc/httpd/password.conf

    使用以下格式添加一行:

    internal:password

    使用上面步骤 6 中应用到 NSS 安全数据库的密码替换 password

  12. 将适当的所有权和权限应用到 /etc/httpd/password.conf 文件:

    ~]# chgrp apache /etc/httpd/password.conf
    ~]# chmod 640 /etc/httpd/password.conf
    ~]# ls -l /etc/httpd/password.conf
    -rw-r-----. 1 root apache 10 Dec 4 17:13 /etc/httpd/password.conf
  13. 要将 mod_nss 配置为使用 /etc/httpd/password.conf 中的软件令牌,请按如下方式编辑 /etc/httpd/conf.d/nss.conf

    ~]# vi /etc/httpd/conf.d/nss.conf
  14. 重新启动 Apache 服务器以使更改生效,如 所述 第 14.1.3.3 节 “重启服务”
重要

由于 POODLE 中描述的漏洞:SSLv3 漏洞(CVE-2014-3566), 红帽建议禁用 SSL,仅使用 TLSv1.1TLSv1.2。可以使用 TLSv1.0 实现向后兼容性。许多红帽支持的产品都能够使用 SSLv2 或 SSLv3 协议,或者默认启用它们。但是,现在强烈建议使用 SSLv2 或 SSLv3

14.1.9.1. 在 mod_nss 中启用和禁用 SSL 和 TLS

要禁用并启用 SSL 和 TLS 协议的特定版本,或者通过在配置文件的" # SSL 全局上下文"部分中添加 NSSProtocol 指令并在其它位置将其删除,或者在所有"VirtualHost"部分中编辑"SSL 协议"下的默认条目。如果您没有在每个域 VirtualHost 部分中指定,它将继承 global 部分中的设置。为确保协议版本被禁用,管理员应该 仅在 "SSL Global Context"部分中指定 NSSProtocol,或者 在所有 域 VirtualHost 部分中指定它。

在 mod_nss 中禁用所有 SSL 和 TLS 协议覆盖 TLS 1 和 Up

要禁用除 TLS 版本 1 及更高版本以外的所有 SSL 和 TLS 协议版本,请按如下操作:

  1. root 身份,打开 /etc/httpd/conf.d/nss.conf 文件并搜索 NSSProtocol 指令 的所有 实例。默认情况下,配置文件包含一个如下所示的部分:

    ~]# vi /etc/httpd/conf.d/nss.conf
    #  SSL Protocol:
    output omitted
    #  Since all protocol ranges are completely inclusive, and no protocol in the
    #  middle of a range may be excluded, the entry "NSSProtocol SSLv3,TLSv1.1"
    #  is identical to the entry "NSSProtocol SSLv3,TLSv1.0,TLSv1.1".
    NSSProtocol SSLv3,TLSv1.0,TLSv1.1

    本节位于 VirtualHost 部分中。

  2. 编辑 NSSProtocol 行,如下所示:

    #  SSL Protocol:
    NSSProtocol TLSv1.0,TLSv1.1

    对所有 VirtualHost 部分重复此操作。

  3. 编辑 Listen 8443 行,如下所示:

    Listen 443
  4. 编辑默认 VirtualHost default: 8443 行,如下所示:

    VirtualHost default:443

    编辑任何其他非默认虚拟主机部分(若存在)。保存并关闭该文件。

  5. 验证所有 NSSProtocol 指令都已更改,如下所示:

    ~]# grep NSSProtocol /etc/httpd/conf.d/nss.conf
    #  middle of a range may be excluded, the entry "NSSProtocol SSLv3,TLSv1.1"
    #  is identical to the entry "NSSProtocol SSLv3,TLSv1.0,TLSv1.1".
    NSSProtocol TLSv1.0,TLSv1.1

    如果您有多个 VirtualHost 部分,这一步尤为重要。

  6. 重启 Apache 守护进程,如下所示:

    ~]# service httpd restart

    请注意,任何会话都将中断。

测试 mod_nss 中的 SSL 和 TLS 协议的状态

要检查在 mod_nss 中启用或禁用了 SSL 和 TLS 版本,请使用 openssl s_client -connect 命令。以 root 用户身份安装 openssl 软件包:

~]# yum install openssl

openssl s_client -connect 命令有以下格式:

openssl s_client -connect hostname:port -protocol

其中端口是要测试的端口 ,协议是要测试的协议版本。若要测试本地运行的 SSL 服务器,请使用 localhost 作为主机名。例如:要测试安全 HTTPS 连接的默认端口,端口 443 查看是否启用 SSLv3,请发出以下命令:

~]# openssl s_client -connect localhost:443 -ssl3
CONNECTED(00000003)
3077773036:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:337:
output omitted
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
  Protocol : SSLv3
output truncated

以上输出表明握手失败,因此不会协商任何密码。

~]$ openssl s_client -connect localhost:443 -tls1
CONNECTED(00000003)
depth=1 C = US, O = example.com, CN = Certificate Shack
output omitted
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
  Protocol : TLSv1
output truncated

以上输出表明没有发生握手失败,并且协商一组密码。

openssl s_client 命令选项记录在 s_client(1) 手册页中。

有关 SSLv3 漏洞以及如何对其进行测试的更多信息,请参阅红帽知识库文章 POODLE:SSLv3 漏洞(CVE-2014-3566 )。

14.1.10. 使用现有密钥和证书

如果您之前创建了密钥和证书,您可以将 SSL 服务器配置为使用这些文件,而不必生成新的密钥和证书。只有两种情况无法做到这一点:

  1. 您正在更改 IP 地址或域名。

    为特定的 IP 地址和域名对签发证书。如果这些值之一改变,证书就会变得无效。

  2. 您有来自 VeriSign 的证书,并且正在更改服务器软件。

    Verisign 是广泛使用的证书颁发机构,发布特定软件产品、IP 地址和域名的证书。更改软件产品会使证书无效。

在上述任一情形中,您将需要获取新的证书。有关此主题的详情请参考 第 14.1.11 节 “生成新密钥和证书”

如果要使用现有密钥和证书,请将相关文件分别移到 /etc/pki/tls/private//etc/pki/tls/certs/ 目录中。您可以以 root 用户身份运行以下命令:

~]# mv key_file.key /etc/pki/tls/private/hostname.key
~]# mv certificate.crt /etc/pki/tls/certs/hostname.crt

然后,在 /etc/httpd/conf.d/ssl.conf 配置文件中添加以下行:

SSLCertificateFile /etc/pki/tls/certs/hostname.crt
SSLCertificateKeyFile /etc/pki/tls/private/hostname.key

要加载更新的配置,请重新启动 httpd 服务,如 第 14.1.3.3 节 “重启服务” 所述。

例 14.5. 使用来自 Red Hat Secure Web 服务器的密钥和证书

~]# mv /etc/httpd/conf/httpsd.key /etc/pki/tls/private/penguin.example.com.key
~]# mv /etc/httpd/conf/httpsd.crt /etc/pki/tls/certs/penguin.example.com.crt

14.1.11. 生成新密钥和证书

要生成新密钥和证书对,必须在系统上安装 crypto-utils 软件包。要安装它,以 root 用户身份输入以下命令:

~]# yum install crypto-utils

此软件包提供一组工具来生成和管理 SSL 证书和私钥,并包含 genkey,即红帽密钥对生成实用程序,将引导您完成密钥生成过程。

重要

如果服务器已经拥有有效的证书,并且您要用一个新证书替换它,请指定不同的序列号。这样可确保客户端浏览器收到此更改的通知,如预期更新到这个新证书,且不会无法访问该页面。要使用自定义序列号创建新证书,以 root 用户身份使用以下命令而不是 genkey

~]# openssl req -x509 -new -set_serial number -key hostname.key -out hostname.crt
注意

如果系统中已有特定主机名的密钥文件,gen key 将拒绝启动。在这种情况下,以 root 用户身份使用以下命令删除现有文件:

~]# rm /etc/pki/tls/private/hostname.key

要运行实用程序,请以 root 身份输入 genkey 命令,再输入相应的主机名(如 penguin .example.com):

~]# genkey hostname

要完成密钥和证书创建,请执行以下步骤:

  1. 检查将在其中存储密钥和证书的目标位置。

    图 14.1. 运行 genkey 工具

    运行 genkey 工具

    使用 Tab 键选择 下一步按钮,然后按 Enter 键继续下一屏幕

  2. 使用向上和 向下箭头键,选择合适的键大小。请注意,虽然较大的密钥会增加安全性,但也会增加服务器的响应时间。NIST 建议使用 2048 位。请参阅 NIST 特殊出版物 800-131A

    图 14.2. 选择密钥大小

    选择密钥大小

    完成后,使用 Tab 键选择 下一步按钮,然后按 Enter 以启动随机位生成过程。根据所选的密钥大小,这可能需要一些时间。

  3. 决定是否要向证书颁发机构发送证书请求。

    图 14.3. 生成证书请求

    生成证书请求

    使用 Tab 键选择 Yes 来编写证书请求,或者选择 No 来生成自签名证书。然后按 Enter 键确认您的选择

  4. 使用 空格键,启用([*])或禁用([])加密私钥。

    图 14.4. 加密私钥

    加密私钥

    使用 Tab 键选择 下一步按钮,然后按 Enter 键继续下一屏幕

  5. 如果您启用了私钥加密,请输入适当的密码短语。请注意,出于安全原因,它不会显示在您键入时,且长度至少为五个字符。

    图 14.5. 输入密码

    输入密码

    使用 Tab 键选择 下一步按钮,然后按 Enter 键继续下一屏幕

    重要

    需要输入正确的密码短语才能启动服务器。如果丢失,则需要生成新的密钥和证书。

  6. 自定义证书详细信息。

    图 14.6. 指定证书信息

    指定证书信息

    使用 Tab 键选择 下一步按钮,然后按 Enter 键完成密钥生成

  7. 如果您之前启用了证书请求生成,则会提示您将其发送到证书颁发机构。

    图 14.7. 有关如何发送证书请求的说明

    有关如何发送证书请求的说明

    Enter 返回 shell 提示符。

生成后,将密钥和证书位置添加到 /etc/httpd/conf.d/ssl.conf 配置文件:

SSLCertificateFile /etc/pki/tls/certs/hostname.crt
SSLCertificateKeyFile /etc/pki/tls/private/hostname.key

最后,按照 第 14.1.3.3 节 “重启服务” 所述重启 httpd 服务,以便载入更新的配置。

14.1.12. 使用命令行配置 HTTP 和 HTTPS 的防火墙

默认情况下,Red Hat Enterprise Linux 不允许 HTTPHTTPS 流量。要让系统成为 Web 服务器,请使用 firewalld 的支持服务启用 HTTPHTTPS 流量根据需要通过防火墙。

要使用命令行启用 HTTP,以 root 用户身份运行以下命令:

~]# firewall-cmd --add-service http
 success

要使用命令行启用 HTTPS,以 root 用户身份运行以下命令:

~]# firewall-cmd --add-service https
 success

请注意,在系统下次启动后这些更改不会保留。要永久更改防火墙,请重复添加 --permanent 选项的命令。

14.1.12.1. 使用命令行检查网络访问传入 HTTPS 和 HTTPS

要检查防火墙配置为允许哪些服务,请以 root 用户身份 运行以下命令:

~]# firewall-cmd --list-all
public (default, active)
 interfaces: em1
 sources:
 services: dhcpv6-client ssh
output truncated

在这个示例中,防火墙被启用,但 HTTPHTTPS 不允许通过。

启用 HTTPHTTP 防火墙服务后,service 将显示类似如下:

services: dhcpv6-client http https ssh

有关启用防火墙服务或通过 firewalld 打开和关闭端口的更多信息,请参阅 Red Hat Enterprise Linux 7 安全指南

14.1.13. 其它资源

要了解更多有关 Apache HTTP 服务器的信息,请参见以下资源:

安装的文档
  • httpd(8) - httpd 服务的 man page,其中包含其命令行选项的完整列表。
  • genkey(1) - genkey 实用程序的 man page,由 crypto-utils 软件包提供。
  • apachectl(8) - Apache HTTP 服务器控制接口的 man page。
可安装文档
  • http://localhost/manual/ - Apache HTTP 服务器的官方文档,其指令和可用模块的完整描述。请注意,若要访问此文档,您必须安装 httpd-manual 软件包,并且 Web 服务器必须正在运行。

    在访问文档前,以 root 用户身份运行以下命令:

    ~] yum install httpd-manual ~] apachectl graceful
在线文档
  • http://httpd.apache.org/ - 包含所有指令和默认模块文档的 Apache HTTP 服务器的官方网站。
  • http://www.openssl.org/ - OpenSSL 主页,其中包含更多文档、常见问题、邮件列表链接和其他有用的资源。