【译】NGINX 推出对 ACME 协议的原生支持
原文:https://blog.nginx.org/blog/native-support-for-acme-protocol
我们非常激动地宣布,NGINX 现已推出 ACME 支持的预览版本。此次实现新增了 ngx_http_acme_module 模块,该模块提供内置指令,可直接从 NGINX 配置中请求、安装和更新证书。ACME 支持功能借助我们的 NGINX-Rust SDK 实现,作为基于 Rust 的动态模块提供,既适用于 NGINX 开源版用户,也适用于使用 NGINX Plus 的企业级 NGINX One 客户。
NGINX 对 ACME 的原生支持带来了诸多优势,简化并增强了整体 SSL/TLS 证书管理流程。通过 NGINX 指令直接配置 ACME,可大幅减少人工错误,消除传统 SSL/TLS 证书管理过程中大量的持续运维工作。这也降低了对 Certbot 等外部工具的依赖,打造出更安全、更高效的工作流程,减少了漏洞和攻击面。此外,与易受平台特定限制的现有外部工具不同,原生实现确保了更强的可移植性和平台独立性,使其成为现代不断发展的 Web 基础设施的通用且可靠的解决方案。
什么是 ACME?
ACME 协议(自动化证书管理环境)是一种通信协议,主要用于自动化数字安全证书(如 SSL/TLS 证书)的签发、验证、更新和吊销流程。它允许客户端与证书颁发机构(CA)交互,无需人工干预,从而简化了依赖 HTTPS 的安全网站和其他服务的部署。
ACME 协议最初由互联网安全研究小组(ISRG)在 2015 年末作为“让我们加密”(Let’s Encrypt)计划的一部分开发,提供免费、自动化的 SSL/TLS 证书。在 ACME 出现之前,获取 TLS 证书往往是一个手动、昂贵且容易出错的过程。ACME 通过提供开源、自动化的证书管理工作流,彻底改变了这一局面。
ACMEv2 是原始 ACME 协议的更新版本,新增了对新挑战的支持、扩展了认证方法、支持通配符证书以及其他增强功能,以提高灵活性和安全性。
NGINX ACME 工作流程
NGINX 的 ACME 工作流程可分为 4 个步骤:
- 设置 ACME 服务器
- 分配共享内存
- 配置挑战
- 证书签发与更新
设置 ACME 服务器
要启用 ACME 功能,第一步(也是唯一的必填步骤)是指定 ACME 服务器的目录 URL。
还可以提供其他信息,例如在出现证书相关问题时如何联系客户端,或模块数据的存储位置,如下所示:
acme_issuer letsencrypt {
uri https://acme-v02.api.letsencrypt.org/directory;
# contact admin@example.test;
state_path /var/cache/nginx/acme-letsencrypt;
accept_terms_of_service;
}
分配共享内存
该实现还提供了一个可选指令 acme_shared_zone,用于存储所有已配置证书颁发机构的证书、私钥和挑战数据。该区域的默认大小为 256K,可根据需要增大。
acme_shared_zone zone=acme_shared:1M;
配置挑战
当前预览版本支持通过 HTTP-01 挑战来验证客户端的域名所有权。这需要在 nginx 配置中定义一个 80 端口的监听器,以处理 ACME HTTP-01 挑战:
server {
# 需要 80 端口的监听器来处理 ACME HTTP-01 挑战
listen 80;
location / {
# 监听挑战时返回基本的 404 响应
return 404;
}
}
未来计划支持其他挑战方式(TLS-ALPN、DNS-01)。
证书签发与更新
在 NGINX 配置的相应服务器块中使用 acme_certificate 指令,可自动签发/更新 TLS 证书。该指令需要指定需要动态签发证书的标识符(域名)列表。标识符列表可通过 server_name 指令定义。
以下代码片段展示了如何配置服务器块,以使用之前定义的 letsencrypt ACME 证书颁发机构为 “.example.domain” 域签发/更新 SSL 证书:
server {
listen 443 ssl;
server_name .example.com;
acme_certificate letsencrypt;
ssl_certificate $acme_certificate;
ssl_certificate_key $acme_certificate_key;
ssl_certificate_cache max=2;
}
请注意,并非 server_name 指令接受的所有值都是有效的标识符。此初始版本不支持通配符,也不支持正则表达式。
使用模块中的 $acme_certificate 和 $acme_certificate_key 变量传递相关域名的 SSL 证书和密钥信息。
重要意义
ACME 协议极大地推动了全球 HTTPS 的采用,使安全的 Web 连接成为一种标准期望。ACME 通过自动化整个流程,革新了 TLS/SSL 证书的签发、更新和管理方式,减少了人工操作并降低了证书生命周期管理的相关成本。除了 Web 领域,物联网设备和边缘计算的发展也使 ACME 在为 API、设备和边缘计算基础设施自动化安全保障方面发挥关键作用。
NGINX 对 ACME 的原生支持凸显了该协议在未来 Web 安全、自动化和可扩展性方面的重要性。在可预见的未来,ACME 有望继续作为互联网及其他领域证书自动化的核心。随着安全性成为 Web 标准的基准,我们将继续看到对不断发展的部署模式和安全需求的要求,这将推动 ACME 的改进。
展望未来,我们致力于不断完善我们的实现,以满足用户和客户的需求,既服务于他们当前的状况,也为他们未来的发展构建所需功能。
如何开始使用
立即开始使用 NGINX 中的原生 ACME 实现吧。如果您是开源用户,可在此处获取预构建包。如果您是使用 NGINX Plus 的企业级 NGINX One 客户,预构建包将作为 F5 支持的动态模块提供。有关该模块的更多信息,请参阅 NGINX 文档。
社区反馈
与往常一样,您的反馈对 NGINX 未来的发展至关重要。如果您有建议、遇到问题或想请求额外功能,请通过 GitHub Issues 与我们分享。我们迫不及待地期待您的尝试。

浙公网安备 33010602011771号