ACME自动领SSL证:NGINX新模块让HTTPS部署零痛苦


NGINX终于学会自己"领SSL证"了:ACME支持预览版震撼登场

说到ACME(自动化证书管理环境),这玩意儿简直就是SSL数字证书界的"外卖小哥"——专门负责在证书颁发机构(CA)和你那台可怜的服务器之间跑腿送文件。

在2015年之前,获取TLS证书就像是在政府部门办手续:填表、排队、交钱、等审批,最后还可能因为写错了一个字母被打回来重来。那时候的运维人员个个都是"盖章达人",手上没几个被证书折磨出来的老茧都不好意思说自己是搞IT的。

然后Let's Encrypt带着ACME协议横空出世,就像给证书管理界送来了自助火锅——虽然还是要自己动手,但至少不用看服务员脸色了。

现在NGINX这个"老顽固"终于开窍,直接把ACME功能内置,相当于把火锅食材都给你涮好端上桌了。

ACMEv2更是升级成了"火锅外卖机器人",连蘸料都给你调好了。不得不说,这进步速度比某些政府网站从IE6升级到现代浏览器的速度快多了!

NGINX的"自助领证"服务:从入门到放弃)
NGINX的ACME工作流程被官方很贴心地分成了四个步骤——是的,就像把大象装进冰箱的步骤一样清晰明了。

第一步设置ACME服务器,就像是告诉NGINX:"喂,你要去这个民政局领证";
第二步分配共享内存,相当于给新婚夫妇准备婚房;
第三步配置挑战,活脱脱就是民政局大妈问你"真的考虑好了吗"的灵魂拷问;
最后才是领证环节。

让我们来细细品味这个"数字结婚证"办理全流程:

2.1 配置ACME:比相亲还复杂的四个步骤

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

nginx
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_shared_zone指令堪称神来之笔——默认256K的内存空间,大概只够存个结婚证和两把钥匙。要是你的网站像海王一样拥有无数个域名,这点空间恐怕连情书都放不下。所以官方很贴心地告诉你:"可以根据需要增加"

nginx
acme_shared_zone zone=acme_shared:1M;  # 1MB内存,终于可以多存几个"前女友"的证书了

2.3 HTTP挑战:NGINX的"真心测试"

当前的预览实现支持HTTP-01质询,以验证客户端的域所有权。它需要在nginx配置中的80端口上定义一个监听器来处理ACME HTTP-01:

现在的预览版只支持HTTP-01挑战,这相当于让NGINX在80端口开个"真心话大冒险"直播间。配置简单得令人发指——就一个返回404的监听器,活像相亲时回答"我没谈过恋爱"一样标准。不过官方画了个大饼,说未来会支持TLS-ALPN和DNS-01挑战,让我们拭目以待这个"海王认证系统"何时能升级。

nginx
server { 
    listen 80;  # 必须开80端口,就像结婚必须领证一样没得商量
    
    location / { 
        return 404;  # 用最冷漠的态度迎接ACME挑战
    } 
}

三、领证时刻:当NGINX遇上Let's Encrypt

终于到了最激动人心的领证环节!现在你只需要在server块里加几行配置,NGINX就会自动去"民政局"把证领回来。

注意看那个$acme_certificate变量,这简直就是数字世界的结婚证编号啊!

不过目前这个系统还有点"直男思维"——不支持通配符,也不认正则表达式,就像个死板的民政局工作人员:"先生,您这个.*的域名不符合规范!"

下面的代码片段显示了如何配置服务器块,以便使用前面定义的letsencrypt ACME证书颁发者为“.example.domain”域颁发/续订SSL证书。

nginx
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证书和关联域的密钥信息。

HTTP-01的工作原理

  1. 发起:当您的NGINX服务器向CA(如Let's Encrypt)申请证书时,CA会说:"要证明你确实控制example.com这个域名?那你在http://example.com/.well-known/acme-challenge/这个路径下放个特定文件给我看看!"
  2. 放置令牌:您的ACME客户端会在指定路径创建一个包含特定内容的文本文件,比如名叫XYZ123的文件,内容为ABC456。这相当于在小区公告栏贴了张"今日暗号"。
  3. 验证身份:CA会化身"侦探",亲自访问这个URL(必须通过80端口!)。如果侦探能在指定位置找到完全匹配的文件内容,就确认您确实是域名的合法控制者。
# 典型HTTP-01挑战的验证过程:
CA访问 => http://example.com/.well-known/acme-challenge/XYZ123
期望看到 =>
"ABC456"

与其他挑战方式的对比:

  • HTTP-01:    通过HTTP访问特定文件    必须开放80端口    常规Web服务器
  • DNS-01  :  添加特定TXT记录    不需要    无法开放端口的服务器
  • TLS-ALPN :   通过特殊TLS扩展验证    必须开放443端口    需要全端口HTTPS的环境


如何开始
立即开始在NGINX中实现原生ACME。如果你是一个开源用户,可以在这里获得预构建的软件包。如果您是使用NGINX Plus的企业NGINX One客户,则预构建包可作为F5支持的动态模块提供。有关该模块的更多信息,请参阅NGINX文档


未来展望:ACME会如何继续"折腾"我们?

虽然现在这个预览版还像个刚学会走路的孩子——功能有限、时不时可能摔一跤,但官方信誓旦旦表示会持续改进。我们可以预见未来的NGINX ACME支持会越来越完善,就像婚恋网站的功能从简单的匹配发展到现在的"AI智能推荐"、"大数据分析"一样。说不定哪天NGINX还能帮你自动处理证书吊销、密钥轮换这些高难度动作,彻底把运维人员宠成"甩手掌柜"。

不过以IT界的一贯作风,今天吹得天花乱坠的功能,明天可能就会冒出各种意想不到的bug。所以建议各位在拥抱这个新功能的同时,还是要把Certbot放在随手可及的地方——毕竟,就算是再完美的自助婚介系统,也难免会有匹配失败的时候,对吧?