系统极客一直在努力
专注操作系统及软件使用技能

NGINX 原生 ACME 协议配置指南

Nginx

NGINX 官方发布了 ACME 协议原生支持的预览版本。这次更新的核心是——新增了ngx_http_acme_module模块,它内置了一套指令,可以直接在 NGINX 配置文件中,完成证书的申请、部署和续期。该功能基于 NGINX-Rust SDK 构建,以基于 Rust 的「动态模块」形式提供。

NGINX 原生 ACME 支持的出现,为 SSL/TLS 证书管理带来了巨大改进——不仅操作更简单,整体体验也更加顺畅:

  1. 现在,你可以直接通过 NGINX 指令配置 ACME,不用再手动折腾那些繁琐的流程。不仅能减少人为失误,还能彻底摆脱传统证书管理中令人头疼的运维工作。
  2. 它减少了对 Certbot 等外部工具的依赖。工作流更精简,安全性也更高,潜在漏洞和攻击面自然也更小。
  3. 相比容易受限于「特定平台」的外部工具,这种原生实现更具可移植性和平台独立性,非常适合现代快速演进的 Web 基础架构,十分灵活可靠。

01. 什么是 ACME?

ACME 协议可以说是全球 HTTPS 普及率飞速提升的幕后功臣。通过自动化整个流程,它彻底改变了 TLS/SSL 证书的签发、续期和管理方式。消除了繁琐的人工步骤,降低了证书「全生命周期」的运维成本。

  • ACME 自动化证书管理环境协议,是一种用来自动化处理数字安全证书(比如 SSL/TLS 证书)申请、验证、续期和吊销的通信协议。
  • 它允许客户端直接与证书颁发机构(CA)交互,全程无需人工参与,大大降低了部署 HTTPS 网站或其他安全服务的复杂度。

ACME 协议最早由互联网安全研究小组(ISRG)在 2015 年末开发,并作为 Let’s Encrypt 项目的一部分推出,目标是提供免费的自动化 SSL/TLS 证书。

在 ACME 出现之前,申请 TLS 证书不仅「花钱」,而且步骤繁琐,还很容易出错。而 ACME 则用开源、自动化的方式,让证书管理变得简单高效。

后来,ACMEv2 的发布对「初代协议」进行了升级。引入了更多类型的质询、扩展认证方法、支持通配符证书,在安全性和灵活性方面也做了多项增强。

02. NGINX 原生 ACME 配置

要在 NGINX 中使用 ACME,主要分为 4 个配置流程:

  1. 配置 ACME 服务器
  2. 分配共享内存
  3. 配置质询
  4. 进行证书签发与续期

2.1 配置 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; 
}

2.2 分配共享内存

ACME 模块还提供了一个可选指令acme_shared_zone,用来在「共享内存」中,保存所有「证书颁发者」的证书、私钥和质询数据。默认大小是 256K,如果有需要,你也可以根据需要调整:

acme_shared_zone zone=acme_shared:1M; 

2.3 配置质询

当前的预览版本支持 HTTP-01 质询,用来验证你对某个域名的所有权。这需要你在 NGINX 配置中,定义一个监听 80 端口的server块,用来处理 ACME 的 HTTP-01 质询请求:

server { 
    # 监听 80 端口是处理 ACME HTTP-01 质询的必要条件
    listen 80; 

    location / { 
        # 在监听质询请求时,返回一个基本的 404 响应
        return 404; 
    } 
}

在未来版本中(开发计划),NGINX 还会支持其他质询方式,比如 TLS-ALPNDNS-01 等。

2.4 证书签发与续期

在 NGINX 配置中,你可以在对应的server块里用acme_certificate指令,实现 TLS 证书的自动签发和续期。

  • 这个指令需要一个域名列表(标识符),证书就会根据这些域名动态生成。域名列表通常用server_name指令来定义。
  • 以下示例演示了如何使用(前面)定义好的letsencrypt颁发者,为.example.com域名申请或续期 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 模块提供了$acme_certificate$acme_certificate_key两个变量,你可以直接用它们来引用对应域名的 SSL 证书和私钥。

赞(0)
分享到

评论 抢沙发