NGINX 引入对 ACME 协议的原生支持

原文作者:Prabhat Dixit - F5 Chief Product Manager
原文链接: NGINX 引入对 ACME 协议的原生支持
原文来源: NGINX 中文官网


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

我们非常高兴地宣布 NGINX 支持 ACME 协议的预览版本发布。ACME通过引入新的 ngx_http_acme_module 模块,提供了内置指令,可以直接在 NGINX 配置中请求、安装和续订证书。ACME 功能利用我们的 NGINX-Rust SDK,并作为基于 Rust 的动态模块提供,适用于 NGINX Open Source 用户以及使用 NGINX Plus 的企业 NGINX One 客户。

NGINX 对 ACME 协议的原生支持带来了多种好处,简化并增强了整体的 SSL/TLS 证书管理过程。通过NGINX 指令直接配置 ACME,可以大幅减少手动错误,并消除传统上与 SSL/TLS 证书管理相关的大量持续开销。它还减少了对 Certbot 等外部工具的依赖,从而构建出更安全、更精简的工作流程,降低漏洞风险并缩小攻击面。此外,与现有的外部工具可能存在的特定平台限制不同,原生实现具备更强的可移植性和平台独立性,使其成为适应现代、不断发展的网络基础架构中一种多功能且可靠的解决方案。

什么是 ACME?

ACME 协议(Automated Certificate Management Environment,自动证书管理环境)是一种通信协议,主要用于自动化数字安全证书(例如 SSL/TLS 证书)的签发、验证、续期和吊销过程。使客户端能够在无需人工干预的情况下与证书颁发机构(CA)进行交互,从而简化了网站以及其他基于 HTTPS 服务的安全部署。

ACME 协议由互联网安全研究组织(ISRG)在 2015 年底,作为 Let's Encrypt 项目的一部分推出。用于提供免费的自动化 SSL/TLS 证书的功能。在 ACME 出现之前,获取 TLS 证书往往是一个手动、昂贵且容易出错的过程。ACME 通过提供开源的自动化证书管理流程,彻底改变了这一现状。

ACMEv2 是 ACME 最初协议的一个更新版本。它增加了对新类型挑战的支持,扩展了认证方式,支持通配符证书,同时做了其他改进,以提升灵活性和安全性。

NGINX ACME 工作流程

NGINX 的 ACME 工作流程可分为四个步骤:

  1. 设置 ACME 服务器
  2. 分配共享内存
  3. 配置挑战(Challenges)
  4. 证书签发与续期

设置 ACME 服务器

要启用 ACME 功能,第一步(也是唯一必须的步骤)是指定 ACME 服务器的目录 URL。

还可以提供额外信息,例如在证书相关问题时如何联系客户端,或模块数据的存储位置,如下所示。

复制代码
acme_issuerletsencrypt { 
    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_zonezone=acme_shared:1M;

配置挑战(Challenges)

当前预览版本实现支持 HTTP-01 挑战,用于验证客户端的域名所有权。需要在 NGINX 配置中定义监听端口 80,以处理 ACME 的 HTTP-01 挑战:

复制代码
server { 
    # listener on port 80 is required to process ACME HTTP-01 challenges 
    listen80;

    location/ { 
        #Serve a basic 404 response while listening for challenges 
        return404;
    } 
}

未来将计划支持其他挑战类型,如 TLS-ALPN 和 DNS-01。

证书签发与续期

在NGINX配置的相应 server 块中使用 acme_certificate 指令,可实现 TLS 证书的自动签发与续期。该指令需要指定要动态签发证书的标识符(域名)列表。标识符列表可通过 server_name 指令进行定义。

下面的示例演示了如何使用之前定义的 letsencrypt ACME 证书颁发者,为 ".example.domain" 域名配置 server 块,从而自动签发和续期 SSL 证书。

复制代码
server { 

listen443ssl;

server_name.example.com;

acme_certificateletsencrypt;

ssl_certificate$acme_certificate;
ssl_certificate_key$acme_certificate_key;
ssl_certificate_cachemax=2;
} 

需要注意的是,并非 server_name 指令接受的所有值都是有效的标识符。初始版本中不支持通配符,也不支持正则表达式。

在该模块中,可使用 acme_certificate 和 acme_certificate_key 变量传递关联域名的 SSL 证书及密钥信息。

为什么这一切如此重要?

ACME 协议推动了全球 HTTPS 的快速普及,使安全的网页连接成为默认标准。它通过自动化整个 TLS/SSL 证书的签发、续期和管理过程,实现了证书管理的现代化,减少了人工操作,并降低了与证书生命周期管理相关的成本。在 web 应用之外,随着物联网设备和边缘计算的兴起,ACME 在自动化保护 API、设备和边缘计算基础设施的安全方面,也将扮演越来越重要的角色。

NGINX 对 ACME 的原生支持凸显了该协议在未来网络安全、自动化和可扩展性方面的重要性。可以预见,ACME 将继续作为互联网及其他领域证书自动化的核心支柱。随着安全成为网络标准的基础,我们将持续看到对部署模型和安全需求不断演进的要求,从而推动 ACME 的改进。

展望未来,我们将致力于不断完善 ACME 的实现,以满足用户和客户的需求,既服务于他们当前的使用场景,也为他们未来的发展构建相应的能力。

如何开始

立即体验 NGINX 原生 ACME 实现吧。如果您是开源用户,可点击获取预编译包。如果您是使用 NGINX Plus 的企业 NGINX One 客户,则可通过 F5 支持的动态模块获取预编译包。

相关推荐
SomeB1oody4 分钟前
【RustyML入门】7.2. 深入模型持久化
开发语言·后端·机器学习·rust·教程
liuyicenysabel18 分钟前
Flask 个人站 iProfile 上线笔记(k3s + Nginx + Let‘s Encrypt)
笔记·nginx·flask
诺伦26 分钟前
Rust 错误处理实战:从 unwrap 到优雅 Result 的进阶之路
开发语言·后端·rust
程序员爱钓鱼4 小时前
Rust Associated Type关联类型详解:为Trait定义内部类型
前端·后端·rust
HumbleSwage13 小时前
Rust 实现可以被 Python 调用的包
开发语言·rust
聪明蛋子哟13 小时前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust
Jimmy_jimi14 小时前
利用nginx代理完成url重定位
运维·nginx
小灰灰搞电子18 小时前
Rust+Slint 实现温度计源码分享
前端·rust·slint
GitLqr18 小时前
2026 Bun 全新姿态:从 Zig 到 Rust 的“暴力”重构与生态大爆发
rust·node.js·bun