如何在 Apache 中配置 TLS 安全性

默认情况下,Apache 将通过不安全的 HTTP 以明文形式提供网络内容。
我们可以通过使用 HTTPS 来提高客户端和 Web 服务器之间的安全性。
这将加密两者之间传输的数据,并通过配置 TLS 来完成。

在这里,我们将为我们的测试域 www.example.com 添加 HTTPS 支持,这是我们之前在我们的虚拟主机配置教程中配置的。

由于 SSLv2 和 SSLv3 现在被认为是不安全的,我们不会在这里配置 SSL,只使用 TLS。

测试 HTTPS

在执行任何测试之前,我们必须通过重新启动或者重新加载 httpd 来应用在 Apache 配置文件中所做的任何更改。

systemctl reload httpd

现在我们的配置更改已经生效,我们将使用 curl 命令对 HTTP 和 HTTPS 进行测试。
我们将在测试 HTTPS 时使用 -k 标志,因为这允许 curl 执行“不安全”的 SSL/TLS 连接和传输,这被视为不安全的原因是因为我们使用了自签名证书。

[jack@onitroad ~]# curl http://www.example.com
example.com website
[jack@onitroad ~]# curl -k https://www.example.com
example.com website

由于从我们的 /var/www/html/example1/index.html 页面正确提供了相同的输出,这确认我们修改后的虚拟主机通过安全的 HTTPS 连接成功地为网站提供服务。

我们可以选择使用如下所示的 openssl 命令查看证书信息,该命令将通过端口 443 连接到 Apache。

openssl s_client -showcerts -connect www.example.com:443

防火墙配置

为了允许 HTTPS 流量通过防火墙,请运行以下命令。

[jack@onitroad ~]# firewall-cmd --permanent --add-service=https
success
[jack@onitroad ~]# firewall-cmd --reload
success

配置Apache

现在证书和密钥已准备就绪,是时候配置 Apache 了。
为了让 Apache 能够使用 TLS,我们必须安装 mod_ssl 包,如下所示。

yum install mod_ssl -y

安装后,这将在 /etc/http/conf.d/ssl.conf 中创建默认配置文件,该文件指定 Apache 将在 TCP 端口 443 上侦听 HTTPS 请求以及其他默认值,例如协议和密码套件以用。

接下来,我们将修改我们现有的 /etc/httpd/conf.d/example1.conf 配置文件,该文件是在我们的虚拟主机配置教程中创建的,如果我们需要了解虚拟主机的工作原理,请务必查看该文件。

下面是 /etc/httpd/conf.d/example1.conf 的内容,注意 VirtualHost*:80 配置已经到位。

<VirtualHost *:80>
    DocumentRoot "/var/www/html/example1"
    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin jack@onitroad
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" combined
</VirtualHost>
<VirtualHost *:443>
    DocumentRoot "/var/www/html/example1"
    ServerName www.example.com
    ServerAlias example.com
    ServerAdmin jack@onitroad
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" combined
    SSLEngine on
    SSLCertificateFile /etc/pki/tls/certs/www.example.com.crt
    SSLCertificateKeyFile /etc/pki/tls/private/www.example.com.key
</VirtualHost>

本质上,端口 80 的虚拟主机配置被复制和粘贴,端口被修改为 443,因为这是默认情况下 HTTPS 请求使用的端口。
要全面了解虚拟主机中所有这些行的实际作用,请参阅我们的虚拟主机配置教程。

接下来我们将介绍出现在 *:443 虚拟主机中的新配置行。

  • SSLEngine on - 这只是说明 SSL 引擎已开启,并且此虚拟主机将用于提供安全连接。
  • SSLCertificateFile /etc/pki/tls/certs/www.example.com.crt - 这指定了要使用的证书的位置,这是用上面的 genkey 创建的。
  • SSLCertificateKeyFile /etc/pki/tls/private/www.example.com.key - 这指定了要使用的私钥的位置,这是用上面的 genkey 创建的。

这就是真正需要的所有内容,/etc/httpd/conf.d/ssl.conf 文件中的所有其他默认配置将用于虚拟主机中未指定的任何内容。

如果我们已与第三方 CA 签署了我们的证书,我们还将使用“SSLCertificateChainFile”并指定 CA 提供的链文件,但是由于我们使用的是自签名证书,因此不需要这样做。

生成密钥对

HTTPS 使用我们必须首先生成的 X.509 证书工作。
在这个例子中,我们将生成一个自签名证书,即创建密钥的服务器本身正在创建公钥。
通常,对于可通过 Internet 访问的生产网站,我们将向受信任的证书颁发机构 (CA) 提供证书签名请求 (CSR),例如 GeoTrust 将签署证书,该过程通常需要花钱且不需要测试。

要创建我们的证书,我们将使用 genkey 命令,它是 crypto-utils 包的一部分。
尽管还有其他创建证书的方法,例如使用 OpenSSL,genkey 会引导我们完成整个过程的文本用户界面 (TUI),因此我们无需记住各种琐碎的命令标志。
只需输入 genkey 命令,后跟证书要覆盖的域名(通用名称)。
在本例中,我们为 www.example.com 创建证书,因为我们希望通过 HTTPS 安全地访问 https://www.example.com。

[jack@onitroad ~]# genkey www.example.com

此时将出现文本用户界面,引导我们完成整个过程。
第一个屏幕会建议创建密钥对后证书和密钥文件的存储位置,选择下一步继续。

现在将提示我们选择密钥的大小,密钥越小,响应时间越快,但安全性越低。
建议使用 2048 位的密钥大小,因为这在速度和安全性之间提供了公平的权衡。
突出显示要使用的密钥大小后,选择下一步继续。

等待随机位生成。

随机数据将用于生成密钥,我们可以输入随机密钥并在控制台中移动鼠标以加快此过程。

如果我们将使用 CA 签署证书,我们可以选择生成 CSR,在这种情况下,我们正在创建本地自签名证书,因此我们将在此处选择 no。

我们可以选择在私钥上设置密码短语,以对其进行加密并防止其被盗,建议在生产环境中使用此密码,以免密钥轻易被盗。
出于测试目的,我们不会加密密钥。

输入证书的详细信息,这些将显示给连接到网站的用户。
将公用名 (FQDN) 设置为证书将涵盖的域很重要,在这种情况下,我们使用 www.example.com 并且这已经在我们使用初始 genkey 命令指定此公用名时填写。

完成此过程后,我们将看到根据我们在 genkey 中的选择运行的实际命令,它还应列出可以找到证书和密钥的位置。

output will be written to /etc/pki/tls/certs/www.example.com.crt
output key written to /etc/pki/tls/private/www.example.com.key

默认情况下,证书将存储在 /etc/pki/tls/certs/ 目录中,密钥存储在 /etc/pki/tls/private/ 目录中,我们可以选择将这些文件移动到其他地方,但我们暂时将它们留在原处。

尽管 genkey 对用户非常友好且易于记忆,但密钥确实需要一些时间来生成,如果我们处于考试情况,这可能并不理想,我们可以使用 OpenSSL 代替 genkey 更快地创建证书和密钥,该命令用于这如下所示。

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout www.exmaple.com.key -out www.example.com.crt
日期:2020-07-07 20:56:13 来源:oir作者:oir