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

介绍

本教程将向您展示如何在运行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存储库:

sudo yum install epel-release

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

sudo yum install httpd mod_ssl python-certbot-apache

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

第2步 - 配置对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端口是否已打开。

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

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

使用certbotLet’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文件应该有效)。

您还可以选择同时启用httphttps访问,还是强制所有重定向的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配置,以使其更安全。

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

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

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

sudo nano /etc/httpd/conf.d/ssl.conf

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

. . .
# 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块结束粘贴到站点的设置中:

    . . .
</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设置为您的页面提供服务。

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

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

https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest

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

第6步 - 设置自动续订

我们的加密证书有效期为90天,但建议您每60天续订一次证书以允许误差限度。该certbotLet'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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿

SSL 证书部署过程

本文演示环境 操作系统(64位):Ubuntu 16.04 CentOS 7.3 服务器软件:Nginx和Apache SSL证书:DV SSL 域名:19...

1.4K6
来自专栏云计算教程系列

如何在Debian 9上为Nginx创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

3773
来自专栏张善友的专栏

Jexus 配置ssl

第一步:登记SSL库。 首先查看“/lib”文件夹中SSL库文件名,该文件名应该是“libssl.so.版本号”,如果没有列出文件名,就证明你的系统还没有安装...

2295
来自专栏FreeBuf

linux下利用一次性口令实现安全管理

作者 黑狐 [译自vpsboard] Linux服务器一直就是以稳定、高效、安全而著称。安全是比较重要的一个环节,这关系到商业机密,更关系到企业的存亡。本文...

2617
来自专栏腾讯云API

腾讯云 API 最佳实践:保护你的密钥

使用腾讯云 API 时,你需要用密钥来签名你的 API 请求。腾讯云接收到你的请求后,会比对你的签名串和实际请求参数。

8.7K11
来自专栏技术博文

ssh password and passphrase

ssh password and passphrase 1、ssh-keygen -t rsa     采用默认路径,输入passphrase。  2、scp ...

4276
来自专栏电光石火

tengine+tomcat+php安装

在安装tengine之前,确认centos环境中有无gcc、pcre、openssl,如果没有按以下命令进行安装

2487
来自专栏散尽浮华

Pupet自动化管理环境部署记录

废话不多说了,下面记录下Puppet在Centos下的部署过程: puppet是什么 puppet是一种基于ruby语言开发的Lnux、Unix、windows...

2286
来自专栏菩提树下的杨过

IIS7.5中神秘的ApplicationPoolIdentity

IIS7.5中(仅win7,win2008 SP2,win2008 R2支持),应用程序池的运行帐号,除了指定为LocalService,LocalSystem...

22610
来自专栏FreeBuf

CVE-2017-3085:Adobe Flash泄漏Windows用户凭证

早前我写了一篇文章讲述Flash沙盒逃逸漏洞最终导致Flash Player使用了十年之久的本地安全沙盒项目破产。从之前爆出的这个漏洞就可以看出输入验证的重要性...

3076

扫码关注云+社区

领取腾讯云代金券