引言

Let’s Encrypt 是一个开放和自动的证书颁发机构,它使用 ACME (自动证书管理环境)协议向任何兼容的客户机提供免费的 tls / ssl 证书。 这些证书可以用来加密 web 服务器和用户之间的通信。 有许多用不同编程语言编写的客户机,以及许多与流行管理工具、服务和服务器的集成。

最受欢迎的 ACME 客户,Certbot,现在由电子前哨基金会开发。 除了验证域所有权和获取证书,Certbot 还可以在 Apache 和 Nginx web 服务器上自动配置 tls / ssl。

本教程将简要讨论证书权威以及 Let’s Encrypt 如何工作,然后回顾一些流行的 ACME 客户机。

什么是证书颁发机构?

证书颁发机构(Certificate authorities,ca)是对 tls / ssl 证书进行加密签名以保证其真实性的实体。 浏览器和操作系统有一个用于验证站点证书的受信任 ca 列表。

直到最近,大多数核证机关还是收取验证和签名服务费用的商业运营机构。 Let’s Encrypt 完全自动化了过程,并依靠赞助和捐赠为必要的基础设施提供资金,从而为用户免费提供了这个过程。

有关证书和不同类型的证书颁发机构的详细信息,可以阅读“ Let’s Encrypt、 Commercial and Private Certificate Authorities 和 Self-Signed SSL Certificates 的比较”

接下来,我们将了解 Let’s Encrypt 是如何进行自动域验证的。

如何让我们加密工作

让我们加密的 ACME 协议定义了客户机如何与其服务器通信以请求证书、验证域所有权和下载证书。 它目前正处于成为官方 IETF 标准的过程中。

Let’s Encrypt 提供了域验证的证书,这意味着它们必须检查证书请求是否来自实际控制该域的人。 他们通过向客户端发送一个唯一的令牌,然后发出一个 web 或 DNS 请求来检索从该令牌派生的密钥。

例如,使用基于 http 的挑战,客户机将从唯一的令牌和帐户令牌计算密钥,然后将结果放在一个文件中,由 web 服务器提供。 Let’s Encrypt 服务器然后在 http: / / example.com / 检索文件。 著名的 / 顶点挑战 / 令牌。 如果密钥是正确的,客户机已经证明它可以控制 example.com 上的资源,服务器将签署并返回一个证书。

Acme 协议定义了客户机可以用来证明域所有权的多种挑战。 Https 挑战类似于 HTTP,只是客户机将提供一个包含密钥的自签名证书,而不是文本文件。 Dns 挑战在 DNS TXT 记录中寻找密钥。

让我们加密客户端

Certbot 是目前最流行的 Let’s Encrypt 客户机。 它包含在大多数主要的 Linux 发行版中,并且包含了方便的针对 Apache 和 Nginx 的自动配置功能。 一旦安装完毕,获取证书和更新 Apache 配置可以这样做:

  • sudo certbot --apache -d www.example.com

Certbot 会询问一些问题,运行挑战,下载证书,更新 Apache 配置,并重新加载服务器。 然后你就可以用你的网页浏览器导航到 https: / / www.example. com。 将出现一个绿色锁,指示证书是有效的,并且连接是加密的。

因为 Let’s Encrypt 证书的有效期只有90天,所以设置一个自动更新过程非常重要。 下面的命令将更新机器上的所有证书:

  • sudo certbot renew

将上面的命令放在 crontab 中每天运行一次,证书将在过期前自动更新三十天。 如果最初使用 -- apache 或 -- nginx 选项创建证书,Certbot 将在成功续订后重新加载服务器。

如果您想了解关于 Cron 和 crontabs 的更多信息,请参考教程“如何使用 Cron 来自动化任务”

其他客户

由于 ACME 协议是开放的并且有很好的文档说明,因此已经开发了许多替代客户机。 Let’s Encrypt 在其网站上维护一个 ACME 客户端列表。 大多数其他客户端没有 Certbot 的自动 web 服务器配置功能,但是他们有其他一些可能吸引你的功能:

  • 几乎每种编程语言都有一个客户端,包括 shell 脚本、 Go 和 Node.js。 如果您在一个受约束的环境中创建证书,并且不希望包含 Python 和其他 Certbot 依赖项,那么这一点可能很重要
  • 有些客户机可以在没有 root 权限的情况下运行。 一般来说,运行尽可能少的特权代码是个好主意
  • 许多客户机可以通过使用 DNS 提供者的 API 自动创建适当的 TXT 记录来自动化基于 DNS 的挑战。 Dns 挑战启用了一些更复杂的用例,例如加密不可公开访问的 web 服务器。
  • 有些客户机实际上集成到 web 服务器、反向代理或负载均衡器中,使得配置和部署变得格外容易

一些更受欢迎的客户包括:

  • Lego: 编写在 Go 中,lego 是一个单文件的二进制安装,并且在使用 DNS 时支持许多 DNS 提供程序
  • Sh: acme.sh 是一个简单的 shell 脚本,可以在非特权模式下运行,还可以与30 + DNS 提供程序交互
  • Caddy: Caddy 是一个完整的 web 服务器,用 Go 编写,内置了对 Let’s Encrypt 的支持。

还有许多客户机可用,许多其他服务器和服务通过集成 Let’s Encrypt 支持自动化 tls / ssl 设置。

总结

我们已经了解了 Let’s Encrypt 工作原理的基本知识,并讨论了一些可用的客户端软件。 如果你想了解更多关于使用 Let’s Encrypt 和各种软件的详细说明,下面的教程是一个很好的开始:

  • 如何在 Ubuntu 16.04上使用 Let’ s Encrypt 来保护 Apache
  • 如何在 Ubuntu 16.04上使用 Let’ s Encrypt 来保护 Nginx
  • 如何在 Ubuntu 16.04上使用 Caddy 管理网站