如何在 Ubuntu 16.04 上使用 Let's Encrypt 保护 Nginx
介绍
Let's Encrypt 是一个证书颁发机构 (CA),它提供了一种获取和安装免费 TLS/SSL 证书的简便方法,从而在 Web 服务器上启用加密的 HTTPS。它通过提供一个软件客户端 Certbot 来简化流程,该客户端尝试自动执行大部分(如果不是全部)所需的步骤。目前,获取和安装证书的整个过程在 Apache 和 Nginx 上都是完全自动化的。
在本教程中,您将使用 Certbot 为 Ubuntu 16.04 上的 Nginx 获取免费的 SSL 证书,并将您的证书设置为自动续订。
本教程使用默认的 Nginx 配置文件而不是单独的服务器块文件。这个 Nginx 服务器阻塞了 Let's Encrypt 教程。
先决条件
要学习本教程,您需要:
- 按照 Ubuntu 16.04 初始服务器设置教程设置一台 Ubuntu 16.04 服务器,包括 sudo 非根用户和防火墙。
- 一个完全注册的域名。本教程将始终使用
example.com
。您可以在 Freenom 上购买域名,或使用您选择的域名注册商。 - 为您的服务器设置了以下两个 DNS 记录。您可以按照此主机名教程了解有关如何添加它们的详细信息。
- 带有
example.com
的 A 记录指向您服务器的公共 IP 地址。 - 带有
www.example.com
的 A 记录指向您服务器的公共 IP 地址。
第 1 步 — 安装 Certbot
使用 Let's Encrypt 获取 SSL 证书的第一步是在您的服务器上安装 Certbot 软件。
Certbot 的开发非常活跃,因此 Ubuntu 提供的 Certbot 包往往已经过时。但是,Certbot 开发人员维护一个具有最新版本的 Ubuntu 软件存储库,因此我们将改用该存储库。
首先,添加存储库。
- sudo add-apt-repository ppa:certbot/certbot
您需要按
ENTER
接受。然后,更新包列表以获取新存储库的包信息。- sudo apt-get update
最后,使用
apt-get
安装 Certbot 的 Nginx 包。- sudo apt-get install python-certbot-nginx
Certbot 现在可以使用了,但是为了让它为 Nginx 配置 SSL,我们需要验证 Nginx 的一些配置。
第 2 步 — 设置 Nginx
Certbot 可以为 Nginx 自动配置 SSL,但它需要能够在您的配置中找到正确的
server
块。它通过查找与您为其请求证书的域匹配的server_name
指令来实现。如果您开始全新安装 Nginx,则可以更新默认配置文件。使用
nano
或您最喜欢的文本编辑器打开它。- sudo nano /etc/nginx/sites-available/default
找到现有的
server_name
行并将下划线_
替换为您的域名:. . . server_name example.com www.example.com; . . .
保存文件并退出编辑器。
然后,验证配置编辑的语法。
- sudo nginx -t
如果出现任何错误,请重新打开文件并检查拼写错误,然后再次测试。
一旦配置的语法正确,重新加载 Nginx 以加载新配置。
- sudo systemctl reload nginx
Certbot 现在将能够找到正确的
server
块并更新它。接下来,我们将更新防火墙以允许 HTTPS 流量。第 3 步 — 允许 HTTPS 通过防火墙
如果您按照先决条件指南的建议启用了
ufw
防火墙,则需要调整设置以允许 HTTPS 流量。幸运的是,Nginx 在安装时使用ufw
注册了一些配置文件。您可以通过键入以下内容来查看当前设置:
- sudo ufw status
它可能看起来像这样,这意味着只允许 HTTP 流量到达 Web 服务器:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)为了另外让 HTTPS 流量进入,我们可以允许 Nginx Full 配置文件,然后删除多余的 Nginx HTTP 配置文件许可:
- sudo ufw allow 'Nginx Full'
- sudo ufw delete allow 'Nginx HTTP'
你的状态现在应该是这样的:
- sudo ufw status
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)我们现在已准备好运行 Certbot 并获取我们的证书。
第 4 步 — 获取 SSL 证书
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 or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. ------------------------------------------------------------------------------- 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://
重新加载您的网站并注意浏览器的安全指示器。它应该表明该站点已得到妥善保护,通常带有绿色锁图标。如果您使用 SSL Labs 服务器测试来测试您的服务器,它将获得 A 级。让我们通过测试续订过程来结束。
第 5 步 — 验证 Certbot 自动续订
Let's Encrypt 的证书有效期只有九十天。这是为了鼓励用户自动化他们的证书更新过程。我们安装的
certbot
包通过 systemd 计时器每天运行两次“certbot renew”来帮我们解决这个问题。在非 systemd 发行版上,此功能由放置在/etc/cron.d
中的脚本提供。此任务每天运行两次,并将更新任何在三十天内到期的证书。要测试续订过程,您可以使用
certbot
进行试运行:- sudo certbot renew --dry-run
如果您没有看到任何错误,则一切就绪。必要时,Certbot 将更新您的证书并重新加载 Nginx 以获取更改。如果自动续订过程失败,Let's Encrypt 将向您指定的电子邮件发送一条消息,在您的证书即将过期时警告您。
结论
在本教程中,您安装了 Let's Encrypt 客户端
certbot
,为您的域下载了 SSL 证书,将 Nginx 配置为使用这些证书,并设置了自动证书更新。如果您对使用 Certbot 有更多疑问,他们的文档是一个很好的起点。 - 带有