本教程将向您展示如何在运行Apache作为Web服务器的CentOS 7服务器上设置来自Let's Encrypt的TLS / SSL证书。此外,我们将介绍如何使用cron作业自动执行证书续订过程。
Web服务器中使用SSL证书来加密服务器和客户端之间的流量,为访问应用程序的用户提供额外的安全性。让我们的加密提供了一种免费获取和安装可信证书的简便方法。
要完成本指南,您需要:
出于本指南的目的,我们将为域example.com
安装Let's Encrypt证书。这将在整个指南中引用,但您应该在跟随时将其替换为您自己的域。
当您准备好继续前进时,请使用您的sudo
帐户登录您的服务器。
在我们安装certbot
Let的加密客户端并生成SSL证书之前,我们需要安装Apache Web服务器(如果它尚不可用)。我们还需要安装mod_ssl
模块以正确提供加密流量。最后,我们需要启用EPEL存储库,它为CentOS提供了额外的包,包括我们需要的certbot
包。
首先键入以下命令启用EPEL存储库:
sudo yum install epel-release
现在您可以访问额外的存储库,通过键入以下命令安装所有必需的包:
sudo yum install httpd mod_ssl python-certbot-apache
您现在应该拥有保护站点所需的所有软件包。
在我们申请证书之前,我们需要确保Apache在我们的服务器上运行并且可以被外界访问。
要确保Apache已启动并运行,请键入:
sudo systemctl start httpd
通过检查服务的状态来验证Apache是否正在运行:
systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2017-01-05 16:47:06 UTC; 1h 7min ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 9531 (httpd)
Status: "Total requests: 10; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─9531 /usr/sbin/httpd -DFOREGROUND
├─9532 /usr/sbin/httpd -DFOREGROUND
├─9533 /usr/sbin/httpd -DFOREGROUND
├─9534 /usr/sbin/httpd -DFOREGROUND
├─9535 /usr/sbin/httpd -DFOREGROUND
└─9536 /usr/sbin/httpd -DFOREGROUND
Jan 05 16:47:05 centos-512mb-nyc3-01 systemd[1]: Starting The Apache HTTP Server...
Jan 05 16:47:05 centos-512mb-nyc3-01 httpd[9531]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using ::1. Set the 'ServerName' directive globally to suppress this message
Jan 05 16:47:06 centos-512mb-nyc3-01 systemd[1]: Started The Apache HTTP Server.
它应该说active
指向顶部。
接下来,确保防火墙中的端口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
使用curl检查您的站点是否可访问:
curl example.com
应显示主页面的HTML。由于mod_ssl
软件包默认配置自签名SSL证书,因此如果您使用该-k
标志允许不受信任的证书,则可以使用HTTPS检查您的域:
curl -k https://example.com
这应该允许您查看相同的输出并验证SSL端口是否已打开。
现在Apache已经准备就绪,我们可以为我们的域申请SSL证书。
使用certbot
Let’s Encrypt的客户端为Apache生成SSL证书非常简单。客户端将自动获取并安装新的SSL证书,该证书对作为参数提供的域有效。
如果要安装对多个域或子域有效的单个证书,可以将它们作为附加参数传递给该命令。参数列表中的第一个域名将是Let's Encrypt用于创建证书的基本域,因此我们建议您将最简单的顶级域名作为列表中的第一个,然后是任何其他子域名或别名:
sudo certbot --apache -d example.com -d www.example.com
对于此示例,基本域将是example.com
。
要执行交互式安装并获取仅涵盖单个域的证书,请运行以下certbot
命令:
sudo certbot --apache -d example.com
该certbot
实用程序还可以在证书申请过程中提示您输入域信息。要使用此功能,请在不使用任何域的情况下调用certbot
sudo certbot --apache
您将看到自定义证书选项的分步指南。系统会要求您提供丢失密钥恢复和通知的电子邮件地址。如果您未在命令行中指定域,则系统也会提示您输入域。如果您的虚拟主机文件未指定使用该ServerName
指令显式提供的域,则会要求您选择虚拟主机文件(默认ssl.conf
文件应该有效)。
您还可以选择同时启用http
和https
访问,还是强制所有重定向的https
请求。为了更好的安全性,如果您没有任何特殊需要允许未加密的连接,建议选择安全选项。
安装成功完成后,您应该看到类似这样的消息:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert
will expire on 2016-04-21. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- If you lose your account credentials, you can recover through
e-mails sent to user@example.com.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
生成的证书文件应该在目录/etc/letsencrypt/live
中以基域命名的子目录中。
在我们检查SSL证书之前,我们应该修改CentOS的默认SSL配置,以使其更安全。
CentOS的Apache版本附带的默认SSL配置有点过时,因此很容易受到一些更新的安全问题的影响。
要配置更安全的SSL相关选项,请打开ssl.conf
文件(或在Let的加密请求过程中提示时选择的任何虚拟主机文件):
sudo nano /etc/httpd/conf.d/ssl.conf
在里面,我们应该先找到SSLProtocol
和SSLCipherSuite
行,然后删除它们或将它们注释掉。我们暂时粘贴的配置将提供比CentOS Apache所包含的默认设置更安全的设置:
. . .
# SSLProtocol all -SSLv2
. . .
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
接下来,为了更安全地设置Apache SSL,我们将使用Remy van Elst在Cipherli.st站点上的建议。此站点旨在为流行软件提供易于使用的加密设置。您可以在此处阅读有关Apache选择的更多信息。
注意:链接到上述网站的建议设置提供了强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击标记为“是的,给我一个与旧版/旧版软件一起使用的密码套件”的页面上的链接来访问该列表。该列表可以替换下面复制的项目。
您使用哪种配置的选择在很大程度上取决于您需要支持的内容。它们都将提供很大的安全性。
出于我们的目的,我们可以完整地复制提供的设置。我们只做两个小改动。
花点时间阅读HTTP严格传输安全性或HSTS,特别是关于“预加载”功能。预加载HSTS可提高安全性,但如果意外启用或启用错误,可能会产生深远的影响。在本指南中,我们不会预先加载设置,但如果您确定了解其含义,则可以对其进行修改。
我们将做的另一个更改是注释掉该SSLSessionTickets
指令,因为在CentOS 7附带的Apache版本中没有这个指令。
在VirtualHost
块结束后粘贴到站点的设置中:
. . .
</VirtualHost>
. . .
# Begin copied text
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
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"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off
完成这些更改后,您可以保存并关闭该文件。
接下来,键入以下命令检查配置是否存在语法错
sudo apachectl configtest
Syntax OK
只要最后一行读取Syntax OK
,您就可以继续使用。如果您没有看到此内容,请在继续之前检查文件是否存在拼写错误。
现在,键入以下命令重新启动Apache服务:
sudo systemctl restart httpd
您的服务器现在应配置为使用安全SSL设置为您的页面提供服务。
您可以使用以下链接验证SSL证书的状态(不要忘记将example.com替换为您的基本域):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
您现在应该可以使用https
前缀访问您的网站。在撰写本文时,这些设置给出了A +评级。
我们的加密证书有效期为90天,但建议您每60天续订一次证书以允许误差限度。该certbot
Let's Encrypt客户端有一个自动检查当前已安装的证书的renew
命令,如果他们的到期日已不足30天了,该命令会为他们自动续约。
要触发所有已安装域的续订过程,您应该运行:
sudo certbot renew
由于我们最近安装了证书,因此该命令仅检查到期日期并打印一条消息,通知该证书尚未进行续订。输出应该类似于:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
请注意,如果您创建了具有多个域的捆绑证书,则只会在输出中显示基本域名,但续订应对此证书中包含的所有域有效。
确保证书不会过时的实用方法是创建一个cron作业,该作业将定期为您执行自动续订命令。由于续订首先检查到期日期,并且仅在证书距离到期不到30天时才执行续订,因此可以安全地创建每周或甚至每天运行的cron作业。
让我们编辑crontab来创建一个每天都会运行续订命令的新作业。要为root用户编辑crontab,请运行:
sudo crontab -e
全部包括以下内容:
30 2 * * * /usr/bin/certbot renew >> /var/log/le-renew.log
保存并退出。这将创建一个新的cron作业,每天凌晨2:30 执行certbot renew
命令。该命令生成的输出将通过管道传送到位于/var/log/le-renew.log
的日志文件。由于该命令在本地检查证书的到期时间,因此不会强调Let's Encrypt的基础结构,但允许您在证书到期后的30天内更新证书。如果续订任何证书,Apache将自动重新启动。
在本指南中,我们了解了如何从Cent的加密中安装免费的SSL证书,以便在CentOS 7服务器上保护使用Apache托管的网站。我们建议您不时查看官方的Let's Encrypt博客以获取重要更新。
更多CentOS教程请前往腾讯云+社区学习更多知识。
参考文献:《How to Secure Apache with Let's Encrypt on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。