如何在Apache上为CentOS7创建SSL证书
介绍
TLS 或传输层安全性及其前身 SSL 代表安全套接字层,是用于将正常流量包装在受保护的加密包装器中的 Web 协议。
使用这项技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外界截获消息。 证书系统还帮助用户验证他们正在连接的站点的身份。
在本指南中,您将设置一个自签名 SSL 证书,以便在 CentOS 7 服务器上与 Apache Web 服务器一起使用。
注意: 自签名证书将加密您的服务器和任何客户端之间的通信。 但是,由于它没有由 Web 浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用该证书自动验证您的服务器的身份。 因此,用户在访问您的网站时会看到安全错误。
由于此限制,自签名证书不适用于为公众服务的生产环境。 它们通常用于测试或保护由单个用户或一小组用户使用的非关键服务,这些用户可以通过备用通信渠道建立对证书有效性的信任。
如需更适合生产的证书解决方案,请查看免费证书颁发机构 Let's Encrypt。 您可以在 在 CentOS 7 上使用 Let's Encrypt 证书设置 Apache 教程中了解如何下载和配置 Let's Encrypt 证书。
先决条件
在开始阅读本指南之前,需要先完成几个步骤。
- 您需要使用具有
sudo
权限的非 root 用户访问 CentOS 7 服务器。 如果你还没有配置这个,你可以通过运行CentOS 7初始服务器设置指南来创建这个帐户。 - 您还需要按照 如何在 CentOS 7 上安装 Apache Web 服务器教程 的步骤 1 中的说明安装 Apache。 完成这些步骤后,您可以通过 SSH 以非 root 用户帐户登录并继续本教程。
第 1 步 — 安装 mod_ssl
为了设置自签名证书,您首先必须确保在服务器上安装了 mod_ssl
,一个提供 SSL 加密支持的 Apache 模块。 您可以使用 yum
命令安装 mod_ssl
:
sudo yum install mod_ssl
该模块将在安装过程中自动启用,Apache 将能够在重新启动后开始使用 SSL 证书。 您无需采取任何额外步骤即可使 mod_ssl
可供使用。
第 2 步 — 创建新证书
现在 Apache 已准备好使用加密,您可以继续生成新的 SSL 证书。 TLS/SSL 通过使用公共证书和私钥的组合来工作。 SSL 密钥在服务器上是保密的。 它用于加密发送给客户端的内容。 SSL 证书与任何请求内容的人公开共享。 它可用于解密由相关 SSL 密钥签名的内容。
可用于保存公共证书的 /etc/ssl/certs
目录应该已经存在于服务器上。 您还需要创建一个 /etc/ssl/private
目录来保存私钥文件。 由于此密钥的保密性对于安全性至关重要,因此锁定权限以防止未经授权的访问非常重要:
sudo mkdir /etc/ssl/private sudo chmod 700 /etc/ssl/private
现在,您可以通过键入以下命令在单个命令中使用 OpenSSL 创建自签名密钥和证书对:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
您将被问到一系列问题。 在讨论之前,让我们看一下命令中发生了什么:
- openssl:这是用于创建和管理 OpenSSL 证书、密钥和其他文件的基本命令行工具。
- req:此子命令指定您要使用 X.509 证书签名请求 (CSR) 管理。 “X.509”是 SSL 和 TLS 遵循的公钥基础设施标准,用于其密钥和证书管理。 您想创建一个新的 X.509 证书,因此您正在使用此子命令。
- -x509:这进一步修改了前面的子命令,告诉实用程序您要制作自签名证书,而不是像通常发生的那样生成证书签名请求。
- -nodes:这告诉 OpenSSL 跳过使用密码保护您的证书的选项。 当服务器启动时,您需要 Apache 能够读取文件,而无需用户干预。 密码可以防止这种情况发生,因为您必须在每次重新启动后输入密码。
- -days 365:此选项设置证书将被视为有效的时间长度。 你在这里设置了一年。
- -newkey rsa:2048:指定要同时生成新证书和新密钥。 您没有在上一步中创建签署证书所需的密钥,因此您需要将其与证书一起创建。
rsa:2048
部分告诉它生成一个 2048 位长的 RSA 密钥。 - -keyout:这一行告诉 OpenSSL 将您正在创建的生成的私钥文件放在哪里。
- -out:这告诉 OpenSSL 在哪里放置您正在创建的证书。
如上所述,这些选项将创建密钥文件和证书。 为了将信息正确嵌入到证书中,您将被问到一些关于您的服务器的问题。
适当地填写提示。
注意:当提示您输入Common Name (e.g. server FQDN or YOUR name)
时,请务必输入您的域名或服务器的公共IP地址。 这里的值应该与您的用户访问您的服务器的方式相匹配。
整个提示将如下所示:
OutputCountry Name (2 letter code) [XX]:US State or Province Name (full name) []:Example Locality Name (eg, city) [Default City]:Example Organization Name (eg, company) [Default Company Ltd]:Example Inc Organizational Unit Name (eg, section) []:Example Dept Common Name (eg, your name or your server's hostname) []:your_domain_or_ip Email Address []:webmaster@example.com
您创建的两个文件都将放置在 /etc/ssl
目录的相应子目录中。
当您使用 OpenSSL 时,您还应该创建一个强大的 Diffie-Hellman 组,用于与客户端协商 Perfect Forward Secrecy。
您可以通过键入以下内容来执行此操作:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但完成后,您将在 /etc/ssl/certs/dhparam.pem
处拥有一个强大的 DH 组,您可以在配置中使用它。
第 3 步 — 设置证书
您现在拥有完成界面的所有必需组件。 接下来要做的是设置虚拟主机以显示新证书。
在/etc/httpd/conf.d
目录下打开一个新文件:
sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf
粘贴以下最小 VirtualHost 配置:
/etc/httpd/conf.d/your_domain_or_ip.conf
<VirtualHost *:443> ServerName your_domain_or_ip DocumentRoot /var/www/html SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key </VirtualHost>
请务必将 ServerName
行更新为您打算对服务器进行寻址的方式。 这可以是主机名、完整域名或 IP 地址。 确保您选择的任何内容与您在制作证书时选择的 Common Name
匹配。
设置安全 SSL 参数
接下来,您将添加一些额外的 SSL 选项,以提高您网站的安全性。 您将使用的选项是来自 Cipherlist.eu 的建议。 该站点旨在为流行软件提供易于使用的加密设置。
注意: Cipherlist.eu 上的默认建议设置提供了强大的安全性。 有时,这是以更高的客户端兼容性为代价的。 如果您需要支持老客户,可以通过单击标有“是的,给我一个适用于旧版/旧软件的密码套件”的链接访问一个替代列表。
可以在两个注释块之间使用兼容性列表代替上述配置中的默认建议。 您使用哪种配置的选择很大程度上取决于您需要支持什么。
您可能希望修改一些配置。 首先,您可以将上游请求的首选 DNS 解析器添加到 resolver
指令。 您在本指南中使用了 Google,但如果您有其他偏好,可以更改此设置。
最后,您应该花点时间阅读 HTTP Strict Transport Security 或 HSTS,特别是 “预加载”功能 。 预加载 HSTS 可提高安全性,但如果意外启用或启用不正确,可能会产生深远的影响。 在本指南中,您不会预加载设置,但如果您确定了解其中的含义,您可以对其进行修改。
您将进行的其他更改是删除 +TLSv1.3
并注释掉 SSLSessionTickets
和 SSLOpenSSLConfCmd
指令,因为这些指令在 CentOS 7 附带的 Apache 版本中不可用。
在 VirtualHost
块结束后粘贴站点中的设置:
/etc/httpd/conf.d/your_domain_or_ip.conf
. . . </VirtualHost> . . . # Begin copied text # from https://cipherli.st/ SSLCipherSuite EECDH+AESGCM:EDH+AESGCM # Requires Apache 2.4.36 & OpenSSL 1.1.1 SSLProtocol -all +TLSv1.2 # SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1 # Older versions # SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On # Disable preloading HSTS for now. You can use the commented out header line that includes # the "preload" directive if you understand the implications. #Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains" # Requires Apache >= 2.4 SSLCompression off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" # Requires Apache >= 2.4.11 # SSLSessionTickets Off
完成这些更改后,您可以保存并关闭文件。
创建从 HTTP 到 HTTPS 的重定向(可选)
就目前而言,服务器将提供未加密的 HTTP 和加密的 HTTPS 流量。 为了更好的安全性,建议在大多数情况下自动将 HTTP 重定向到 HTTPS。 如果您不想要或不需要此功能,您可以安全地跳过本节。
要将所有流量重定向到 SSL 加密,请在 /etc/httpd/conf.d
目录中创建并打开一个以 .conf
结尾的文件:
sudo vi /etc/httpd/conf.d/non-ssl.conf
在里面,创建一个 VirtualHost
块来匹配端口 80 上的请求。 在里面,使用 ServerName
指令再次匹配您的域名或 IP 地址。 然后,使用 Redirect
匹配任何请求并将它们发送到 SSL VirtualHost
。 确保包含尾部斜杠:
/etc/httpd/conf.d/non-ssl.conf
<VirtualHost *:80> ServerName your_domain_or_ip Redirect "/" "https://your_domain_or_ip/" </VirtualHost>
完成后保存并关闭此文件。
第 4 步 — 应用 Apache 配置更改
到目前为止,您已经创建了一个 SSL 证书并配置了您的 Web 服务器以将其应用到您的站点。 要应用所有这些更改并开始使用 SSL 加密,您可以重新启动 Apache 服务器以重新加载其配置和模块。
首先,通过键入以下命令检查配置文件中的语法错误:
sudo apachectl configtest
只要输出以 Syntax OK
结尾,您就可以安全地继续。 如果这不是您的输出的一部分,请检查文件的语法并重试:
Output. . . Syntax OK
通过键入以下命令重新启动 Apache 服务器以应用您的更改:
sudo systemctl restart httpd.service
接下来,确保在防火墙中打开端口 80 和 443。 如果您没有运行防火墙,则可以跳过。
如果您正在运行 firewalld
防火墙,您可以通过键入以下命令打开这些端口:
sudo firewall-cmd --add-service=http sudo firewall-cmd --add-service=https sudo firewall-cmd --runtime-to-permanent
如果您正在运行 iptables
防火墙,您需要运行的命令高度依赖于您当前的规则集。 对于基本规则集,您可以通过键入以下内容添加 HTTP 和 HTTPS 访问:
sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
第 5 步 — 测试加密
现在,您已准备好测试您的 SSL 服务器。
打开您的网络浏览器并在地址栏中输入 https://
,然后是您的服务器的域名或 IP:
https://your_domain_or_ip
由于您创建的证书未由浏览器的受信任证书颁发机构之一签名,因此您可能会看到一个看起来很吓人的警告,如下所示:
这是预期和正常的。 您只对证书的加密方面感兴趣,而不是对主机真实性的第三方验证。 单击“高级”,然后单击提供的链接以继续访问您的主机:
您应该被带到您的网站。 如果您查看浏览器地址栏,您会看到一些部分安全的迹象。 这可能是一个带有“x”的锁或带有感叹号的三角形。 在这种情况下,这仅意味着无法验证证书。 它仍在加密您的连接。
如果您将 Apache 配置为将 HTTP 请求重定向到 HTTPS,您还可以检查重定向功能是否正确:
http://your_domain_or_ip
如果这导致相同的图标,这意味着您的重定向工作正常。
结论
您已将 Apache 服务器配置为同时处理 HTTP 和 HTTPS 请求。 这将帮助您安全地与客户沟通,并避免外部各方能够读取您的流量。
如果您计划将 SSL 用于公共网站,您可能应该从受信任的证书颁发机构购买 SSL 证书,以防止向每个访问者显示可怕的警告。