Let’s Encrypt 是一个开放且自动化的证书颁发机构,它使用 ACME(Automatic Certificate Management Environment,自动证书管理环境)协议为兼容的客户端提供免费的 TLS/SSL 证书。这些证书可以用来加密您的 web 服务器(如 Droplet)和用户之间的通信。有数十种客户端可供选择,它们使用不同的编程语言编写,并且与流行的管理工具、服务和服务器有许多集成。
最受欢迎的 ACME 客户端 Certbot,现在由 Electronic Frontier Foundation 开发。Certbot 不仅可以验证域名所有权和获取证书,还可以自动配置 Apache 和 Nginx web 服务器上的 TLS/SSL。
本教程将简要讲解证书颁发机构以及 Let’s Encrypt 的工作原理,然后分享一些流行的 ACME 客户端。
什么是证书颁发机构?
证书颁发机构(CAs)是加密签署 TLS/SSL 证书以证明其真实性的实体。浏览器和操作系统有一个受信任的 CA 列表,它们用来验证站点证书。
直到最近,大多数 CA 都属于商业运营,它们的验证和签名服务需要收费。Let’s Encrypt 通过完全自动化流程,并通过依赖赞助和捐款来资助必要的基础设施,所以它可以为用户提供免费的服务。
有关证书和不同类型的证书颁发机构的更多信息,您可以阅读DigitalOcean 官网的《Let’s Encrypt、商业和私有证书颁发机构以及自签名 SSL 证书的比较》。
接下来,我们将看看 Let’s Encrypt 如何进行自动化域名验证。
Let’s Encrypt 的工作原理
Let’s Encrypt 的 ACME 协议定义了客户端如何与其服务器通信以请求证书、验证域名所有权和下载证书。它目前正在成为官方 IETF 标准的过程中。
Let’s Encrypt 提供域名验证证书,这意味着它们必须检查证书请求来自实际控制该域名的人。它们通过向客户端发送一个唯一令牌,然后发出 web 或 DNS 请求来检索从该令牌派生的密钥来实现这一点。
例如,使用基于 HTTP 的挑战,客户端将从唯一令牌和帐户令牌计算出一个密钥,然后将结果放在 web 服务器要提供的文件中。Let’s Encrypt 服务器然后检索文件 http://example.com/.well-known/acme-challenge/token。如果密钥正确,客户端已证明它可以控制 example.com 上的资源,服务器将签署并返回证书。
ACME 协议定义了多个挑战,您的客户端可以使用这些挑战来证明域名所有权。HTTPS 挑战与 HTTP 类似,只不过不是文本文件,客户端将提供包含密钥的自签名证书。DNS 挑战在 DNS TXT 记录中查找密钥。
Certbot Let’s Encrypt 客户端
Certbot 是迄今为止最受欢迎的 Let’s Encrypt 客户端。它包含在大多数主要的 Linux 发行版中,并且为 Apache 和 Nginx 包括方便的自动配置功能。安装后,获取证书和更新您的 Apache 配置可以这样做:
sudo certbot --apache -d www.example.com
Certbot 会问几个问题,回答,下载证书,更新您的 Apache 配置,并重新加载服务器。然后您应该能够使用 web 浏览器导航到 https://www.example.com。会出现一个绿色锁标志,表明证书有效且连接已加密。
由于 Let’s Encrypt 证书仅在九十天内有效,因此设置自动续订过程非常重要。以下命令将续订机器上的所有证书:
sudo certbot renew
将上述命令放入 crontab 中每天运行,证书将在到期前三十天内自动续订。如果证书最初是使用 –apache 或 –nginx 选项创建的,Certbot 在成功续订后将重新加载服务器。
如果您想更多了解 cron 和 crontab,请参考DigitalOcean 官网的教程《如何使用 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 提供商。
- acme.sh:acme.sh 是一个简单的 shell 脚本,可以以非特权模式运行,并且还可以与 30 多个 DNS 提供商交互。
- Caddy:Caddy 是一个用 Go 编写的完整 web 服务器,内置支持 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 托管网站
关于如何解析域名
在你的Droplet控制台,会提供服务器的IP。访问你的域名注册机构控制台,例如Godaddy,使用A记录解析,将你的域名指向Droplet IP。