第 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 初始化脚本迁出后,服务器管理员应切换
为使用 apachectl
和systemctl
命令来控制服务(代替service
命令)。以下示例专用于httpd
服务。该命令:
service httpd graceful
替换为
apachectl graceful
httpd
的systemd
单元文件与初始化脚本有不同的行为,如下所示:- 在重新加载服务时,默认使用正常重启。
服务停止时,默认使用正常停止。
该命令:
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
文件。默认配置中不再明确配置许多常用配置设置,如Timeout
或KeepAlive
;默认情况下,将使用硬编码的设置。所有配置指令的硬编码默认设置在 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_html 和 mod_xml2enc 在新的子软件包 mod_proxy_html 中提供。这些软件包都位于可选频道中。
注意在订阅 Optional 和 Supplementary 频道前,请查看覆盖范围详情。如果您决定从这些频道安装软件包,请按照红帽客户门户网站中名为 How to access Optional 和 Supplementary 频道以及 -devel 软件包(RHSM)中的步骤进行操作。
- 打包文件系统布局
不再提供
/var/cache/mod_proxy/
目录,而是使用proxy
和ssl
子目录打包/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 中提供
。
-
- 身份验证、授权和访问控制
-
用于控制身份验证、授权和访问控制的配置指令已显著变化。使用
Order
、Deny
和Allow
指令的现有配置文件应改编为使用新的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.4 在 mod_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 更新配置文件,请执行以下步骤:
-
确保所有模块名称都正确,因为它们可能已更改。调整已重命名的每个模块的
LoadModule
指令。 - 重新编译所有第三方模块,然后尝试载入它们。这通常意味着身份验证和授权模块。
-
如果您使用
mod_userdir
模块,请确保提供了指明目录名称(通常是public_html
)的UserDir
指令。 - 如果您使用 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
服务有三种不同的方法:
要完全重启该服务,以
root
用户身份输入以下命令:~]# systemctl restart httpd.service
这将停止正在运行的
httpd
服务,并立即重新启动它。安装或删除动态加载的模块(如 PHP)后,请使用此命令。要只重新载入配置,以
root
用户身份输入:~]# systemctl reload httpd.service
这会导致正在运行的
httpd
服务重新加载其配置文件。当前处理的任何请求都将中断,这可能会导致客户端浏览器显示错误消息或呈现部分页面。要在不影响活跃请求的情况下重新载入配置,以
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 服务配置文件” 中列出的位置读取配置。
路径 | 描述 |
---|---|
| 主配置文件。 |
| 主配置文件中包含的配置文件的辅助目录。 |
虽然默认配置应该适合大多数情况,但最好至少熟悉一些更重要的配置选项。请注意,要使任何更改生效,必须首先重新启动 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@@ 和
占位符值。根据 例 14.2 “虚拟主机配置示例” 中所示的要求自定义选项。
@@
ServerRoot@
例 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 列表的信息”。
Web 浏览器 | link |
---|---|
Mozilla Firefox | |
opera | |
Internet Explorer | |
chromium |
在设置 SSL 服务器时,您需要生成证书请求和私钥,然后发送证书请求、公司身份证明以及向证书颁发机构付款。当 CA 验证证书请求和您的身份后,它将向您发送签名的证书,您可以将其用于您的服务器。或者,您可以创建一个不包含 CA 签名的自签名证书,因此只用于测试目的。
14.1.8. 启用 mod_ssl 模块
如果您打算使用 mod_ssl
设置 SSL 或 HTTPS 服务器,则无法 具有另一个应用或模块,如 mod_nsss
配置为使用同一端口。端口 443
是 HTTPS 的默认端口。
要使用 mod_ssl
模块和 OpenSSL 工具包设置 SSL 服务器,请安装 mod_ssl 和 openssl 软件包。以 root
用户身份输入以下命令:
~]# yum install mod_ssl openssl
这将 在
配置文件,默认包含在 Apache HTTP 服务器主配置文件中。要加载模块,请重新启动 /etc/httpd/conf.d/ssl.conf 中创建 mod_
sslhttpd
服务,如 第 14.1.3.3 节 “重启服务” 所述。
由于 POODLE 中描述的漏洞:SSLv3 漏洞(CVE-2014-3566), 红帽建议禁用 SSL
,仅使用 TLSv1.1
或 TLSv1.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 之外的所有内容,如下方所示:
以
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 部分中。
编辑
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 部分重复此操作。保存并关闭该文件。
验证所有出现
SSLProtocol
指令都已更改,如下所示:~]# grep SSLProtocol /etc/httpd/conf.d/ssl.conf SSLProtocol all -SSLv2 -SSLv3
如果您有一个以上的默认 VirtualHost 部分,则这一步尤为重要。
重启 Apache 守护进程,如下所示:
~]# systemctl restart httpd
请注意,任何会话都将中断。
禁用所有 SSL 和 TLS 协议,接受 TLS 1 并启动
要禁用除 TLS 版本 1 及更高版本以外的所有 SSL 和 TLS 协议版本,请按如下操作:
以
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
编辑
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
保存并关闭该文件。
按如下所示验证更改:
~]# grep SSLProtocol /etc/httpd/conf.d/ssl.conf SSLProtocol -all +TLSv1 +TLSv1.1 +TLSv1.2
重启 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_nss
和 mod_ssl
只能同时共存(如果它们使用唯一端口)。因此,默认情况下 mod_nss
使用 8443
,但 HTTPS 的默认端口是端口 443
。端口由 Listen
指令以及 VirtualHost 名称或地址指定。
NSS 中的所有内容都与"令牌"关联。软件令牌存在于 NSS 数据库中,但您也可以有一个包含证书的物理令牌。使用 OpenSSL 时,离散证书和私钥保存在 PEM 文件中。对于 NSS,这些内容存储在数据库中。每个证书和密钥都与令牌关联,每个令牌都可以有密码保护。此密码是可选的,但是如果使用密码,则 Apache HTTP 服务器需要该密码的副本才能在系统启动时无需用户干预即可打开数据库。
配置 mod_nss
以
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 节 “重启服务” 所述。以
root
身份,打开/etc/httpd/conf.d/nss.conf
文件并搜索Listen
指令 的所有 实例。编辑
Listen 8443
行,如下所示:Listen 443
端口
443
是HTTPS
的默认端口。编辑默认
VirtualHost default: 8443
行,如下所示:VirtualHost default:443
编辑任何其他非默认虚拟主机部分(若存在)。保存并关闭该文件。
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
是默认的NSSNickname
。L 选项
会在证书数据库中列出所有证书,或者显示有关指定证书的信息。d 选项指定
包含证书和密钥数据库文件的数据库目录。有关更多命令行选项,请参阅certutil(1)
man page。要将 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/
。要将密码应用到默认 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.
在部署 HTTPS 服务器之前,请使用由证书颁发机构(CA)签名的证书创建新证书数据库。
例 14.3. 在 Mozilla NSS 数据库中添加证书
certutil
命令用于在 NSS 数据库文件中添加 CA 证书:certutil -d
/etc/httpd/nss-db-directory/
-A -n "CA_certificate" -tCT,,
-a -icertificate.pem
以上命令添加存储在名为 certificate.pem 的 PEM 格式文件中的 CA 证书。
d 选项指定
包含证书和密钥数据库文件的 NSS 数据库目录,-n
选项设置证书的名称-t
CT,
表示证书受信任可用于 TLS 客户端和服务器。A 选项将
现有证书添加到证书数据库。如果数据库不存在,它将被创建。a选项
允许将 ASCII 格式用于输入或输出,而-i
选项则将certificate.pem
输入文件传递到 命令。有关更多命令行选项,请参阅
certutil(1)
man page。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.
通过使用 NSS
PassPhraseDialog 指令更改行,将
内部软件令牌:mod_nss
配置为使用 NSS~]# vi /etc/httpd/conf.d/nss.conf NSSPassPhraseDialog file:/etc/httpd/password.conf
这是为了避免在系统启动时手动输入密码。软件令牌存在于 NSS 数据库中,但您也可以拥有包含您的证书的物理令牌。
如果 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
替换为要使用的证书数据库的路径。以
root
用户身份创建/etc/httpd/password.conf
文件:~]# vi /etc/httpd/password.conf
使用以下格式添加一行:
internal:password
使用上面步骤 6 中应用到 NSS 安全数据库的密码替换 password。
将适当的所有权和权限应用到
/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
要将
mod_nss
配置为使用/etc/httpd/password.conf
中的软件令牌,请按如下方式编辑/etc/httpd/conf.d/nss.conf
:~]# vi /etc/httpd/conf.d/nss.conf
- 重新启动 Apache 服务器以使更改生效,如 所述 第 14.1.3.3 节 “重启服务”
由于 POODLE 中描述的漏洞:SSLv3 漏洞(CVE-2014-3566), 红帽建议禁用 SSL
,仅使用 TLSv1.1
或 TLSv1.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 协议版本,请按如下操作:
以
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 部分中。
编辑
NSSProtocol
行,如下所示:# SSL Protocol: NSSProtocol TLSv1.0,TLSv1.1
对所有 VirtualHost 部分重复此操作。
编辑
Listen 8443
行,如下所示:Listen 443
编辑默认
VirtualHost default: 8443
行,如下所示:VirtualHost default:443
编辑任何其他非默认虚拟主机部分(若存在)。保存并关闭该文件。
验证所有
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 部分,这一步尤为重要。
重启 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 服务器配置为使用这些文件,而不必生成新的密钥和证书。只有两种情况无法做到这一点:
您正在更改 IP 地址或域名。
为特定的 IP 地址和域名对签发证书。如果这些值之一改变,证书就会变得无效。
您有来自 VeriSign 的证书,并且正在更改服务器软件。
Verisign 是广泛使用的证书颁发机构,发布特定软件产品、IP 地址和域名的证书。更改软件产品会使证书无效。
在上述任一情形中,您将需要获取新的证书。有关此主题的详情请参考 第 14.1.11 节 “生成新密钥和证书”。
如果要使用现有密钥和证书,请将相关文件分别移到 /etc/pki/tls/private/
和 /etc/pki/tls/certs/
目录中。您可以以 root
用户身份运行以下命令:
~]# mvkey_file.key
/etc/pki/tls/private/hostname.key
~]# mvcertificate.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
要完成密钥和证书创建,请执行以下步骤:
检查将在其中存储密钥和证书的目标位置。
图 14.1. 运行 genkey 工具
使用 Tab 键选择 下一步按钮,然后按 Enter 键继续下一屏幕。
使用向上和 向下箭头键,选择合适的键大小。请注意,虽然较大的密钥会增加安全性,但也会增加服务器的响应时间。NIST 建议使用
2048 位
。请参阅 NIST 特殊出版物 800-131A。图 14.2. 选择密钥大小
完成后,使用 Tab 键选择 下一步按钮,然后按 Enter 以启动随机位生成过程。根据所选的密钥大小,这可能需要一些时间。
决定是否要向证书颁发机构发送证书请求。
图 14.3. 生成证书请求
使用 Tab 键选择
来编写证书请求,或者选择 来生成自签名证书。然后按 Enter 键确认您的选择。使用 空格键,启用(
[*]
)或禁用([
])加密私钥。图 14.4. 加密私钥
使用 Tab 键选择 下一步按钮,然后按 Enter 键继续下一屏幕。
如果您启用了私钥加密,请输入适当的密码短语。请注意,出于安全原因,它不会显示在您键入时,且长度至少为五个字符。
图 14.5. 输入密码
使用 Tab 键选择 下一步按钮,然后按 Enter 键继续下一屏幕。
重要需要输入正确的密码短语才能启动服务器。如果丢失,则需要生成新的密钥和证书。
自定义证书详细信息。
图 14.6. 指定证书信息
使用 Tab 键选择 下一步按钮,然后按 Enter 键完成密钥生成。
如果您之前启用了证书请求生成,则会提示您将其发送到证书颁发机构。
图 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 不允许 HTTP
和 HTTPS
流量。要让系统成为 Web 服务器,请使用 firewalld
的支持服务启用 HTTP
和 HTTPS
流量根据需要通过防火墙。
要使用命令行启用 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
在这个示例中,防火墙被启用,但 HTTP
和 HTTPS
不允许通过。
启用 HTTP
和 HTTP
防火墙服务后,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 主页,其中包含更多文档、常见问题、邮件列表链接和其他有用的资源。