如何在CentOS7上使用Let'sEncrypt保护Nginx

来自菜鸟教程
跳转至:导航、​搜索

介绍

Let's Encrypt 是一个新的证书颁发机构 (CA),它提供了一种简单的方法来获取和安装免费的 TLS/SSL 证书,从而在 Web 服务器上启用加密的 HTTPS。 它通过提供软件客户端 Certbot 来简化流程,该客户端尝试自动化大部分(如果不是全部)所需步骤。 目前,获取和安装证书的整个过程在 Apache 和 Nginx Web 服务器上都是完全自动化的。

在本教程中,我们将向您展示如何使用 certbot Let's Encrypt 客户端获取免费的 SSL 证书并在 CentOS 7 上与 Nginx 一起使用。 我们还将向您展示如何自动更新您的 SSL 证书。

先决条件

在学习本教程之前,您需要做一些事情。

  • 具有 sudo 权限的非 root 用户的 CentOS 7 服务器。 您可以按照我们的 CentOS 7 初始服务器设置教程 中的步骤 1-3 学习如何设置此类用户帐户。
  • 您必须拥有或控制您希望使用证书的注册域名。 如果您还没有注册域名,您可以在众多域名注册商之一注册一个(例如 Namecheap、GoDaddy 等)。
  • DNS A 记录 将您的域指向您服务器的公共 IP 地址。 这是必需的,因为 Let's Encrypt 如何验证您是否拥有它为其颁发证书的域。 例如,如果您想获得 example.com 的证书,则该域必须解析到您的服务器,验证过程才能正常工作。 我们的设置将使用 example.comwww.example.com 作为域名,因此需要 两个 DNS 记录

完成所有先决条件后,让我们继续安装 Let's Encrypt 客户端软件。

第 1 步 — 安装 Certbot Let's Encrypt 客户端

使用 Let's Encrypt 获取 SSL 证书的第一步是在您的服务器上安装 certbot 软件。 目前,安装它的最佳方式是通过 EPEL 存储库。

通过键入以下内容启用对服务器上 EPEL 存储库的访问:

sudo yum install epel-release

启用存储库后,您可以通过键入以下内容获取 certbot-nginx 包:

sudo yum install certbot-nginx

certbot Let's Encrypt 客户端现已安装并可以使用。

第 2 步 — 设置 Nginx

如果你还没有安装 Nginx,你现在可以安装。 EPEL 存储库应该已经从上一节中启用,因此您可以通过键入以下命令安装 Nginx:

sudo yum install nginx

然后,使用 systemctl 启动 Nginx:

sudo systemctl start nginx

Certbot 可以为 Nginx 自动配置 SSL,但它需要能够在您的配置中找到正确的 server 块。 它通过查找与您请求证书的域匹配的 server_name 指令来做到这一点。 如果您刚开始安装 Nginx,您可以更新默认配置文件:

sudo vi /etc/nginx/nginx.conf

找到现有的 server_name 行:

/etc/nginx/sites-available/default

server_name _;

_ 下划线替换为您的域名:

/etc/nginx/nginx.conf

server_name example.com www.example.com;

保存文件并退出编辑器。 使用以下命令验证配置编辑的语法:

sudo nginx -t

如果运行没有错误,请重新加载 Nginx 以加载新配置:

sudo systemctl reload nginx

Certbot 现在将能够找到正确的 server 块并对其进行更新。 现在我们将更新防火墙以允许 HTTPS 流量。

第 3 步 — 更新防火墙

如果您启用了防火墙,请确保端口 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

我们现在已准备好运行 Certbot 并获取我们的证书。

第 4 步 — 获得证书

Certbot 通过各种插件提供了多种获取 SSL 证书的方法。 Nginx 插件将负责重新配置 Nginx 并在必要时重新加载配置:

sudo certbot --nginx -d example.com -d www.example.com

这将使用 --nginx 插件运行 certbot,使用 -d 指定我们希望证书有效的名称。

如果这是您第一次运行 certbot,系统将提示您输入电子邮件地址并同意服务条款。 完成此操作后,certbot 将与 Let's Encrypt 服务器通信,然后运行质询以验证您是否控制了要为其请求证书的域。

如果成功,certbot 将询问您希望如何配置 HTTPS 设置:

OutputPlease choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

选择您的选择,然后点击 ENTER。 配置将被更新,Nginx 将重新加载以获取新设置。 certbot 将以一条消息结束,告诉您该过程已成功以及您的证书存储在哪里:

OutputIMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2017-10-23. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again with the
   "certonly" option. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   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 Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

您的证书已下载、安装和加载。 尝试使用 https:// 重新加载您的网站,并注意浏览器的安全指示器。 它应该表示该站点已得到适当保护,通常带有绿色锁定图标。

第 5 步 — 更新 Diffie-Hellman 参数

如果您现在使用 SSL Labs Server Test 测试您的服务器,由于 Diffie-Hellman 参数较弱,它只会获得 B 等级。 这会影响我们的服务器与其用户之间初始密钥交换的安全性。 我们可以通过创建一个新的 dhparam.pem 文件并将其添加到我们的 server 块来解决此问题。

使用 openssl 创建文件:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

这将需要一段时间,最多几分钟。 完成后,打开包含 server 块的 Nginx 配置文件。 在我们的示例中,它是默认配置文件:

sudo vi /etc/nginx/nginx.conf

将以下行粘贴到 server 块中的任意位置:

/etc/nginx/nginx.conf

. . .
ssl_dhparam /etc/ssl/certs/dhparam.pem;

保存文件并退出编辑器,然后验证配置:

sudo nginx -t

如果没有错误,请重新加载 Nginx:

sudo systemctl reload nginx

您的网站现在更加安全,应该获得 A 评级。

第 6 步 — 设置自动续订

Let's Encrypt 的证书有效期只有九十天。 这是为了鼓励用户自动化他们的证书更新过程。 我们需要设置一个定期运行的命令来检查过期证书并自动更新它们。

为了每天运行更新检查,我们将使用 cron,这是一种用于运行定期作业的标准系统服务。 我们通过打开和编辑一个名为 crontab 的文件来告诉 cron 要做什么。

sudo crontab -e

您的文本编辑器将打开默认的 crontab,此时它是一个空文本文件。 粘贴以下行,然后保存并关闭它:

crontab

. . .
15 3 * * * /usr/bin/certbot renew --quiet

该行的 15 3 * * * 部分表示“每天凌晨 3:15 运行以下命令”。 您可以随时选择。

Certbot 的 renew 命令将检查系统上安装的所有证书,并更新任何设置为在 30 天内到期的证书。 --quiet 告诉 Certbot 不要输出信息或等待用户输入。

cron 现在将每天运行此命令。 所有已安装的证书将在到期前三十天或更短的时间内自动更新和重新加载。

有关如何创建和安排 cron 作业的更多信息,您可以在 VPS 指南中查看我们的 How to Use Cron to Automate Tasks。


结论

在本教程中,我们安装了 Let's Encrypt 客户端 certbot,为我们的域下载 SSL 证书,配置 Nginx 以使用这些证书,并设置自动证书更新。 如果您对使用 Certbot 有其他疑问, 他们的文档 是一个很好的起点。