Skip to main content

如何在CentOS 7上用 Let's Encrypt 保护 Nginx?

作者 Mitchell Anicas

导言

Let’s Encrypt 是一个新兴的证书颁发机构(Certificate Authority,缩写为CA),它提供了一种获得和安装免费 TLS/SSL 证书的方法,从而可以在网络服务器上实现加密的 HTTPS。它提供了软件客户端 Certbot 来简化这个过程,该客户端会努力自动化进行大部分(如果不是全部)所需步骤。目前,在 Apache 和 Nginx 网络服务器上获取和安装证书的整个过程是完全自动化的。 在本教程中,我们将为您展示如何使用 certbot Let’s Encrypt 客户端获得 SSL 证书,并在 CentOS7 上用它保护 Nginx。我们还将为您展示如何设置证书为自动更新。

前期准备

学习本教程将需要:

  • 一台 CentOS7 服务器,以及一个具有 sudo 权限的非 root 用户。
  • 必须拥有或控制你想要对其使用证书的那个注册域名。如果你还没有注册域名,可以在域名注册商中选择一个注册。
  • 一个DNS A记录,该记录将你的域名指向你服务器的公共IP地址。这是必需的,因为 Let’s Encrypt 通过这个来验证你确实拥有它所签发的证书的域名。例如,如果你想获得 example.com 的证书,该域名必须解析到你的服务器,以使验证过程顺利进行。举例来说,我们的教程将使用 example.comwww.example.com 作为域名,所以这两个 DNS 记录都是必需的。 做好以上准备后,让我们继续安装 Let's Encrypt 客户端软件。

第一步:安装 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 是新安装的,可以使用 vi 或你喜欢的文本编辑器更新默认配置文件:

$ sudo vi /etc/nginx/nginx.conf

找到现有的 server_name 代码行: /etc/nginx/nginx.conf

server_name _;

用你的域名替换 server_name后面的 _: /etc/nginx/nginx.conf

server_name example.com www.example.com;

保存该文件并退出编辑器。如果你使用的是 vi,就输入 :x,然后在提示下输入 y,以保存并退出。用以下代码验证你的编辑的配置的语法:

$ 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 服务器通信,然后运行一个“挑战”,以验证你确实控制着你所申请证书的域名。之后,配置将被更新,Nginx 将重新加载以接受新的设置。certbot将以一条消息结束,告诉你这个过程是成功的,以及你的证书存放在哪里。

Output
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your certificate will expire on 2022-10-20. 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"
- 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:// 重新加载你的网站,并注意你的浏览器的安全指示灯。通常有一个绿色的锁形图标来表示网站是被妥善保护的。### 第五步:验证 Certbot 自动更新 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 将每天运行这个命令。所有已安装的证书在距离过期三十天或更近的时间内将被自动更新和重新加载。

结语

在本教程中,你安装了 Let's Encrypt 客户端 certbot,为你的域名下载了 SSL 证书,配置了 Nginx 以使用这些证书,并设置了自动证书更新。如果对使用 Certbot 有进一步的疑问,可以参考它们的官方文档