我们非常激动地宣布,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协议 (Automated Certificate Management Environment) 是一种通信协议,主要设计用于自动化数字安全证书(如SSL/TLS证书)的签发、验证、续订和吊销流程.该协议使得客户端能够与证书颁发机构(CA)进行自动交互,无需人工干预,从而显著简化了依赖HTTPS的安全网站及其他服务的部署流程.

ACME协议最初由互联网安全研究小组(ISRG) 作为 Let's Encrypt 倡议的重要组成部分于2015年底开发完成,首次实现了免费自动化SSL/TLS证书的发放.在ACME协议问世之前,获取TLS证书往往需要经历繁琐的手工操作、支付高昂费用且容易出错.ACME通过提供开源的证书管理自动化工作流,彻底革新了这一领域.

ACMEv2 是原始ACME协议的升级版本,新增了对新型挑战类型的支持,扩展了身份验证方法,增加了通配符证书功能,并通过其他多项增强措施提升了协议的灵活性与安全性.

NGINX ACME 工作流程

NGINX 的 ACME 工作流程可分为以下四个步骤:
1. 设置 ACME 服务器
2. 分配共享内存
3. 配置挑战验证
4. 证书签发与续订

设置 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,用于为所有已配置的证书颁发机构存储证书、私钥和质询数据.该区域默认大小为256KB,可根据需要增加容量.

acme_shared_zone zone=acme_shared:1M; 

配置挑战验证

当前预览版实现支持通过 HTTP-01 挑战验证客户端的域名所有权.需要在 nginx 配置中定义一个监听端口 80 的监听器来处理 ACME HTTP-01 挑战,配置示例如下:

server { 
    # listener on port 80 is required to process ACME HTTP-01 challenges 
    listen 80; 

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

未来版本 计划支持其他类型的挑战验证(TLS-ALPN、DNS-01).

证书签发与续订

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

以下代码片段展示了如何使用先前定义的letsencrypt ACME证书颁发者,为".example.domain"域名配置SSL证书签发与续订的server块示例:

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的快速普及,使安全网络连接成为标准配置.ACME通过全流程自动化现代化了TLS/SSL证书的颁发、续订和管理方式,消除了人工操作,降低了证书生命周期管理相关的成本.不仅限于Web领域,随着物联网设备和边缘计算的发展,ACME将在API、设备及边缘计算基础设施的安全自动化方面发挥关键作用.

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

展望未来,我们致力于持续优化实现方案,以满足用户和客户的需求,既满足他们当前的使用场景,也为他们未来的发展方向构建所需能力.

如何开始使用

立即开始 使用NGINX中的原生ACME实现.如果您是开源用户,预构建的软件包可在此处 获取.如果您是使用NGINX Plus的企业NGINX One客户,预构建的软件包可作为F5支持的动态模块 获取.有关该模块的更多信息,请参阅NGINX文档 .

社区反馈

一如既往,您的反馈对于塑造NGINX的未来发展至关重要.如果您有任何建议、遇到问题或想要请求其他功能,请通过GitHub Issues 与我们分享.我们期待您尽快尝试使用.

原文:https://blog.nginx.org/blog/native-support-for-acme-protocol