OpenResty Edge 端到端自动化 Let’s Encrypt SSL 证书的续期:在到期前约一个月自动调度下一次续期,将新证书推送到每一个网关集群而无需 reload 或 restart,并在证书快过期(有效期少于等于 30 天)时在控制台给出提醒——无需 cron 任务,无需 shell 脚本。本文将完整演示从添加域名到在真实网关上验证 HTTPS 的全流程。

Let’s Encrypt 证书颁发机构 logo

为你的 Edge 应用添加域名

像往常一样,让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们的控制台的样本部署。每个用户都有自己的本地部署。

这一次我们继续使用 test-edge.com 域名的样本应用。

OpenResty Edge 管理控制台中列出的样本应用

我们可以看到,它已经在 443 端口为 SSL 进行监听。

样本应用在 443 端口上监听 SSL

进入这个应用。

在 OpenResty Edge 管理控制台中进入样本应用

这里我们想要用子域名来做演示,所以需要先调整应用的设置。

OpenResty Edge 中的应用设置页面

让我们为这个应用添加一个新的通配符域名。

为 Edge 应用添加新的通配符域名

Edge 应用的通配符域名表单已填写

保存。

通配符域名已保存到 Edge 应用

然后推送给我们的网关服务器。因为 Let’s Encrypt 服务器将会需要验证我们的域名所有权。

准备将域名变更推送到网关服务器

发布更改。

在 OpenResty Edge 管理控制台中发布待处理的变更

发布!

将域名变更推送到所有网关服务器

签发并自动续期 Let’s Encrypt SSL 证书

转到 SSL 页面。

导航到 OpenResty Edge 的 SSL 证书页面

我们可以看到,目前还没有定义 SSL 证书。

签发任何 Let’s Encrypt 证书之前,SSL 证书列表为空

让我们添加一个新的证书。

在 OpenResty Edge 中添加新的 SSL 证书

我们支持各种不同的方式来颁发新的 SSL 证书。

OpenResty Edge 支持的 SSL 证书签发方式

如果你已经拥有其他 CA 签发的证书,也可以直接上传现有的 SSL 证书到 Edge,跳过整个签发流程。

这里就只演示 Let’s Encrypt 的方式。

选择 Let’s Encrypt 作为 SSL 证书签发方式

将顶级域名 test-edge.com 添加到该证书中。

在 Let’s Encrypt 证书表单中输入顶级域名 test-edge.com

添加更多的子域名称。

向 Let’s Encrypt 证书添加更多子域名

输入我们的 api 子域。它可以是任何东西。

为 Let’s Encrypt 证书输入 api 子域

也可以添加更多子域名。

向 Let’s Encrypt 证书添加更多子域名

如果有很多域名,还可以使用批量输入模式。

切换到批量输入模式一次性输入多个域名

可以在这里逐行输入所需要的域名。

在批量输入模式中逐行输入多个域名

先退出批量输入模式。

输入完域名后退出批量输入模式

这里的所有域名必须被解析到这个 OpenResty Edge 部署的网关服务器上。

提示所有域名必须解析到 Edge 网关服务器

这个要求也在这里提到了。

再次提醒域名必须解析到 Edge 网关服务器

在终端上,我们可以使用 dig 命令来测试域名是否已经解析到我们的网关服务器。

dig test-edge.com

可以看到有效的 DNS 答案。

dig 输出确认 test-edge.com 解析到 Edge 网关

也可以测试一下 api 子域。

dig api.test-edge.com

同样也得到了有效的 DNS 答案。

dig 输出确认 api.test-edge.com 解析到 Edge 网关

Let’s Encrypt 服务器需要通过这些域名访问我们的网关服务器。这是因为他们必须确保我们确实拥有这些域名。

Let’s Encrypt 校验流程访问 Edge 网关服务器

对于通配符域名,你还必须使用 OpenResty Edge 作为域名的权威性 DNS 名称服务器。

OpenResty Edge 作为通配符域名的权威 DNS 服务器

同意 Lets’ Encrypt 订阅者协议。

同意 Let’s Encrypt 订阅者协议

保存。

保存新的 Let’s Encrypt 证书配置

就可以看到新的 Let’s Encrypt 证书了。

SSL 页面出现新的 Let’s Encrypt 证书行

证书来源是 Let’s Encrypt。

证书来源列显示颁发者为 Let’s Encrypt

它有两个域名,正如预期的那样。

证书行显示配置的两个域名

我们可以在这里查看实时状态。

Let’s Encrypt 证书签发的实时状态

通过点击这个状态图标来查看详细的进度。

还可以在这里观察有关 Let’s Encrypt 证书签发过程的详细日志。

Let’s Encrypt 证书签发过程的详细日志

现在可以看到证书已经被签发。

确认 Let’s Encrypt 证书已成功签发

让我们先退出这个状态页面。

退出证书状态页面

可以在这一栏中查看新证书的到期时间。

新 Let’s Encrypt 证书的到期时间列

该证书将在 3 个月后过期。

证书将在三个月后过期,即 Let’s Encrypt 标准有效期

OpenResty Edge 会在将来证书即将过期时自动更新。

OpenResty Edge 已计划在到期前自动续期证书

我们可以看到预定的下次更新时间将在 2 个月后。也就是说,在过期前一个月。

计划两个月后续期,即证书到期前一个月

现有的 Let’s Encrypt 证书也是可以编辑的。

在 OpenResty Edge 中编辑现有的 Let’s Encrypt 证书

我们在这里不做任何改动。

证书编辑对话框未做任何更改

或者也可以删除这个证书。

Let’s Encrypt 证书的删除选项

我们现在不想删除它。

取消证书删除

但可以在不删除的情况下禁用它。

禁用 Let’s Encrypt 证书而不删除

然后,它也可以被重新启用。

重新启用先前禁用的 Let’s Encrypt 证书

我们需要发布一个新版本来推送我们的新证书,就像往常一样。

准备发布新版本以推送证书变更

点击这个按钮。

用于将证书推送到所有网关的发布按钮

发布!

将证书变更推送到所有网关集群

现在已经完成了!

证书变更已成功推送到所有网关

现在,新的证书已经被推送到所有的网关集群和服务器上。

新 Let’s Encrypt 证书已部署到每一个网关集群

我们的配置更改不需要重新加载服务器、重启或二进制升级服务器进程。所以它是非常有效和可扩展的。

OpenResty Edge 配置同步在无 reload 情况下推送证书

然后,OpenResty Edge 将在这些证书过期前再次自动更新来自 Let’s Encrypt 的证书。

OpenResty Edge 在到期前自动续期 Let’s Encrypt 证书

如果由于某些原因,一些证书未能更新,当证书快过期(有效期少于等于 30 天)时,用户会在控制台看到类似这样的提醒。

证书快过期(有效期少于等于 30 天)时的控制台提醒

续期机制概览: OpenResty Edge 会在管理界面中保存证书的到期时间和下次续期时间,在到期前约一个月自动向 Let’s Encrypt 发起新的签发请求,并将新证书推送到每一个网关集群,全程无需 reload、restart 或二进制升级。当证书快过期(有效期少于等于 30 天)时,控制台会给出提醒,避免证书悄无声息地过期。

在网关上验证 HTTPS 和 Let’s Encrypt 证书

让我们打开一个新的浏览器标签,通过 https 访问 test-edge.com 网站。

浏览器标签使用 Let’s Encrypt 证书通过 HTTPS 加载 test-edge.com

它成功了!

同时测试 api 子域。

浏览器标签使用 Let’s Encrypt 证书通过 HTTPS 加载 api.test-edge.com

它也能工作!

我们也可以用一个网关集群服务器,在终端上测试我们的新证书。

挑选一台网关集群服务器在终端上测试证书

在旧金山附近选择一个网关服务器。

选择旧金山附近的网关服务器进行测试

复制它的公共 IP 地址,以 133 结尾。

复制网关服务器以 133 结尾的公共 IP 地址

在终端上,我们可以向这个网关服务器发送一个 HTTPS 请求。

curl -I --resolve 'test-edge.com:443:138.68.231.133' https://test-edge.com/

curl -I 响应确认 HTTPS 在 Edge 网关服务器上可用

成功了!

我们也可以使用 -v 选项获取更多细节信息。

curl -I --resolve 'test-edge.com:443:138.68.231.133' https://test-edge.com/ -v

运行这个命令。

curl -v 输出显示与 Edge 网关的完整 HTTPS 握手

我们确实可以在这里看到我们的服务器证书。还可以看到该证书确实是由 Let’s Encrypt 颁发的。

curl -v 输出显示服务器证书由 Let’s Encrypt 颁发

浏览器和网关上的 HTTPS 都已经正常工作,接下来自然的一步是通过 Edge 页面规则将所有明文 HTTP 请求重定向到 HTTPS,让访客永远不会落到未加密的站点上。

常见问题

OpenResty Edge 什么时候续期 Let’s Encrypt 证书?

Edge 在证书到期日前约一个月自动调度下一次续期。由于 Let’s Encrypt 证书有效期为三个月,签发到计划续期之间大约会留出两个月的时间,这一时间点可以在证书行的“下次更新”列中看到。

我需要 cron 任务或脚本来续期证书吗?

不需要。续期由 Edge 内部完成——无需配置 cron 任务,无需调度 certbot 二进制文件,也无需编写 shell 钩子。续期时间戳就保存在管理控制台中,紧挨着证书本身。如果你需要从 ZeroSSL、DigiCert、Google Trust Services 等其他 CA 签发证书,Edge 更完整的 基于 ACME 协议的 SSL 证书自动化 采用同样的免运维方式。

续期证书需要重新加载或重启网关吗?

不需要。当 Edge 续期一张 Let’s Encrypt 证书时,会通过 Edge 的配置同步层将更新推送到每一个网关集群和服务器,全程无需 reload、restart 或二进制升级。文章末尾的 SSL 章节完整演示了这个“发布”步骤。

自动续期失败时会发生什么?

Edge 目前不会针对单次续期失败发送通知,但当证书快过期(有效期少于等于 30 天)时,控制台会给出提醒,从而避免证书悄无声息地过期。如果续期一直失败——例如 Let’s Encrypt 无法再访问其中某个域名——你可以在同一页面上编辑证书、调整域名,或删除后重新签发。

关于 OpenResty Edge

OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!