前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用CentOS 7上的Let's Encrypt来保护Apache

如何使用CentOS 7上的Let's Encrypt来保护Apache

原创
作者头像
独钓寒江雪_Ly
修改2018-10-22 11:34:35
1.9K0
修改2018-10-22 11:34:35
举报

介绍

本教程将向您展示如何在运行Apache作为Web服务器的CentOS 7服务器上设置来自Let's Encrypt的TLS / SSL证书。此外,我们将介绍如何使用cron作业自动执行证书续订过程。

Web服务器中使用SSL证书来加密服务器和客户端之间的流量,为访问应用程序的用户提供额外的安全性。让我们的加密提供了一种免费获取和安装可信证书的简便方法。

先决条件

要完成本指南,您需要:

  • 具有非root sudo权限用户的CentOS 7服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 使用ACNAME记录为您的服务器配置的至少一个域名。具体过程取决于您的域名注册商或托管服务。如果你没有域名,建议您先去这里注册一个域名,如果你只是使用此配置进行测试或个人使用,则可以使用自签名证书,不需要购买域名。自签名证书提供了相同类型的加密,但没有域名验证公告。关于自签名证书,你可以参考为Apache创建自签名SSL证书如何为Nginx创建自签名SSL证书这两篇文章。

出于本指南的目的,我们将为域example.com安装Let's Encrypt证书。这将在整个指南中引用,但您应该在跟随时将其替换为您自己的域。

当您准备好继续前进时,请使用您的sudo帐户登录您的服务器。

第1步 - 安装所需的软件

在我们安装certbotLet的加密客户端并生成SSL证书之前,我们需要安装Apache Web服务器(如果它尚不可用)。我们还需要安装mod_ssl模块以正确提供加密流量。最后,我们需要启用EPEL存储库,它为CentOS提供了额外的包,包括我们需要的certbot包。

首先键入以下命令启用EPEL存储库:

代码语言:javascript
复制
sudo yum install epel-release

现在您可以访问额外的存储库,通过键入以下命令安装所有必需的包:

代码语言:javascript
复制
sudo yum install httpd mod_ssl python-certbot-apache

您现在应该拥有保护站点所需的所有软件包。

第2步 - 配置对Apache的访问

在我们申请证书之前,我们需要确保Apache在我们的服务器上运行并且可以被外界访问。

要确保Apache已启动并运行,请键入:

代码语言:javascript
复制
sudo systemctl start httpd

通过检查服务的状态来验证Apache是否正在运行:

代码语言:javascript
复制
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防火墙,则可以通过键入以下命令打开这些端口:

代码语言:javascript
复制
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --runtime-to-permanent

如果运行iptables防火墙,则需要运行的命令高度依赖于当前的规则集。对于基本规则集,您可以通过键入以下内容来添加HTTP和HTTPS访问:

代码语言:javascript
复制
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检查您的站点是否可访问:

代码语言:javascript
复制
curl example.com

应显示主页面的HTML。由于mod_ssl软件包默认配置自签名SSL证书,因此如果您使用该-k标志允许不受信任的证书,则可以使用HTTPS检查您的域:

代码语言:javascript
复制
curl -k https://example.com

这应该允许您查看相同的输出并验证SSL端口是否已打开。

第3步 - 从Let的加密请求SSL证书

现在Apache已经准备就绪,我们可以为我们的域申请SSL证书。

使用certbotLet’s Encrypt的客户端为Apache生成SSL证书非常简单。客户端将自动获取并安装新的SSL证书,该证书对作为参数提供的域有效。

如果要安装对多个域或子域有效的单个证书,可以将它们作为附加参数传递给该命令。参数列表中的第一个域名将是Let's Encrypt用于创建证书的基本域,因此我们建议您将最简单的顶级域名作为列表中的第一个,然后是任何其他子域名或别名:

代码语言:javascript
复制
sudo certbot --apache -d example.com -d www.example.com

对于此示例,基本域将是example.com

要执行交互式安装并获取仅涵盖单个域的证书,请运行以下certbot命令:

代码语言:javascript
复制
sudo certbot --apache -d example.com

certbot实用程序还可以在证书申请过程中提示您输入域信息。要使用此功能,请在不使用任何域的情况下调用certbot

代码语言:javascript
复制
sudo certbot --apache

您将看到自定义证书选项的分步指南。系统会要求您提供丢失密钥恢复和通知的电子邮件地址。如果您未在命令行中指定域,则系统也会提示您输入域。如果您的虚拟主机文件未指定使用该ServerName指令显式提供的域,则会要求您选择虚拟主机文件(默认ssl.conf文件应该有效)。

您还可以选择同时启用httphttps访问,还是强制所有重定向的https请求。为了更好的安全性,如果您没有任何特殊需要允许未加密的连接,建议选择安全选项。

安装成功完成后,您应该看到类似这样的消息:

代码语言:javascript
复制
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配置,以使其更安全。

第4步 - 为Apache选择更安全的SSL设置

CentOS的Apache版本附带的默认SSL配置有点过时,因此很容易受到一些更新的安全问题的影响。

要配置更安全的SSL相关选项,请打开ssl.conf文件(或在Let的加密请求过程中提示时选择的任何虚拟主机文件):

代码语言:javascript
复制
sudo nano /etc/httpd/conf.d/ssl.conf

在里面,我们应该先找到SSLProtocolSSLCipherSuite行,然后删除它们或将它们注释掉。我们暂时粘贴的配置将提供比CentOS Apache所包含的默认设置更安全的设置:

代码语言:javascript
复制
. . .
# SSLProtocol all -SSLv2
. . .
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

接下来,为了更安全地设置Apache SSL,我们将使用Remy van ElstCipherli.st站点上的建议。此站点旨在为流行软件提供易于使用的加密设置。您可以在此处阅读有关Apache选择的更多信息。

注意:链接到上述网站的建议设置提供了强大的安全性。有时,这是以更高的客户端兼容性为代价的。如果您需要支持较旧的客户端,可以通过单击标记为“是的,给我一个与旧版/旧版软件一起使用的密码套件”的页面上的链接来访问该列表。该列表可以替换下面复制的项目。

您使用哪种配置的选择在很大程度上取决于您需要支持的内容。它们都将提供很大的安全性。

出于我们的目的,我们可以完整地复制提供的设置。我们只做两个小改动。

花点时间阅读HTTP严格传输安全性或HSTS,特别是关于“预加载”功能。预加载HSTS可提高安全性,但如果意外启用或启用错误,可能会产生深远的影响。在本指南中,我们不会预先加载设置,但如果您确定了解其含义,则可以对其进行修改。

我们将做的另一个更改是注释掉该SSLSessionTickets指令,因为在CentOS 7附带的Apache版本中没有这个指令。

VirtualHost块结束粘贴到站点的设置中:

代码语言:javascript
复制
    . . .
</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

完成这些更改后,您可以保存并关闭该文件。

接下来,键入以下命令检查配置是否存在语法错

代码语言:javascript
复制
sudo apachectl configtest
Syntax OK

只要最后一行读取Syntax OK,您就可以继续使用。如果您没有看到此内容,请在继续之前检查文件是否存在拼写错误。

现在,键入以下命令重新启动Apache服务:

代码语言:javascript
复制
sudo systemctl restart httpd

您的服务器现在应配置为使用安全SSL设置为您的页面提供服务。

第5步 - 检查您的证书状态

您可以使用以下链接验证SSL证书的状态(不要忘记将example.com替换为您的基本域):

代码语言:javascript
复制
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest

您现在应该可以使用https前缀访问您的网站。在撰写本文时,这些设置给出了A +评级。

第6步 - 设置自动续订

我们的加密证书有效期为90天,但建议您每60天续订一次证书以允许误差限度。该certbotLet's Encrypt客户端有一个自动检查当前已安装的证书的renew命令,如果他们的到期日已不足30天了,该命令会为他们自动续约。

要触发所有已安装域的续订过程,您应该运行:

代码语言:javascript
复制
sudo certbot renew

由于我们最近安装了证书,因此该命令仅检查到期日期并打印一条消息,通知该证书尚未进行续订。输出应该类似于:

代码语言:javascript
复制
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,请运行:

代码语言:javascript
复制
sudo crontab -e

全部包括以下内容:

代码语言:javascript
复制
​
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 先决条件
  • 第1步 - 安装所需的软件
  • 第2步 - 配置对Apache的访问
  • 第3步 - 从Let的加密请求SSL证书
  • 第4步 - 为Apache选择更安全的SSL设置
  • 第5步 - 检查您的证书状态
  • 第6步 - 设置自动续订
  • 结论
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档