如何使用 Let's Encrypt Staging 环境测试续签脚本而不占用正式配额?

文章导读
在自动化脚本中启用 Staging 参数是测试续签逻辑最安全的做法,既能跑通流程又不会浪费正式环境的签发配额。
📋 目录
  1. 命令速用版
  2. 核心原理
  3. 实操步骤
  4. 验证方法
  5. 常见坑
  6. 参考来源
A A

在自动化脚本中启用 Staging 参数是测试续签逻辑最安全的做法,既能跑通流程又不会浪费正式环境的签发配额。

先说结论:Staging 环境专为测试设计,证书不受浏览器信任,且严禁部署到生产环境,但不会计入正式配额限制。

  • 适合:调试 ACME 客户端配置、验证 hooks 脚本、检查端口连通性
  • 先看:确认客户端支持 `--staging``--server` 参数切换
  • 注意:测试生成的证书文件路径可能与正式环境不同,务必检查命令输出
  • 建议:测试完成后务必切换回生产环境,否则网站会报安全警告

命令速用版

以常用的 Certbot 为例,在原有命令基础上增加 `--staging``--test-cert` 参数即可。

certbot certonly `--webroot` -w /var/www/html -d example.com `--staging`

如果是 acme.sh,则需要指定 `--server` 参数为 Let's Encrypt 的测试接口。

acme.sh `--issue` -d example.com `--webroot` /var/www/html `--server` letsencrypt_test

核心原理

Let's Encrypt 对正式环境(Production)有严格的速率限制,例如每周每个注册域名只能签发 50 张证书。如果在调试脚本时频繁失败重试,很容易触发限制导致正式域名暂时无法申请证书。

Staging 环境使用独立的接口和根证书,速率限制宽松得多,专门用于解决调试过程中可能遇到的网络、验证或脚本错误,而不用担心被封禁。

如何使用 Let's Encrypt Staging 环境测试续签脚本而不占用正式配额?

实操步骤

1. 备份现有配置:在修改脚本前,备份当前的 crontab 或 systemd timer 配置,防止误操作影响线上服务。

2. 修改签发参数:找到调用 ACME 客户端的命令,添加测试环境标志。不要手动修改 API 地址,除非客户端不支持标准参数。

3. 执行手动测试:先在命令行手动运行一次修改后的命令,观察输出日志,确认挑战(challenge)验证通过。

4. 记录证书路径:命令执行成功后,终端会输出证书保存路径(如 /etc/letsencrypt/live/example.com/~/.acme.sh/example.com/),请记录该路径用于后续验证。

5. 恢复生产参数:测试无误后,去掉 `--staging` 参数,确保下次自动运行使用的是正式环境。

如何使用 Let's Encrypt Staging 环境测试续签脚本而不占用正式配额?

验证方法

测试环境下签发的证书不受浏览器信任。验证分为“本地文件验证”和“服务端验证”两种场景。

1. 本地证书文件验证(推荐)

这是测试脚本最直接的验证方式,无需部署证书即可确认签发环境。使用 openssl 查看本地生成的证书文件:

openssl x509 -in /path/to/fullchain.pem -noout -issuer

/path/to/fullchain.pem 替换为上一步记录的實際路径。如果返回结果中包含 Fake LESTAGING 字样,说明当前使用的是测试环境证书;正式环境通常显示 ISRG Root X1

2. 服务端验证(仅限测试服务器)

如果你将测试证书部署到了测试服务器(切勿部署到生产服务器),可以通过以下命令确认服务端提供的证书:

如何使用 Let's Encrypt Staging 环境测试续签脚本而不占用正式配额?
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -issuer

若返回结果中包含 Fake LESTAGING 字样,说明服务端正在提供测试环境证书。

常见坑

1. 误部署到生产环境:这是最高风险操作。Staging 证书会导致用户浏览器报红色安全警告。务必确认 Web 服务器(Nginx/Apache)配置的证书路径指向正式环境文件。

2. 忘记切回正式环境:测试完成后未移除 `--staging` 参数,导致自动续签继续获取不受信任的证书。建议在脚本注释里醒目提醒。

3. 证书路径混淆:部分客户端会将正式和测试证书存放在不同目录,或者在同一目录下覆盖。检查脚本中引用的证书路径是否随环境切换而变化,避免正式证书被测试证书覆盖。

4. 速率限制误解:虽然 Staging 限制宽松,但并非无限。如果短时间内发起成千上万次请求,仍可能被暂时拦截。

参考来源

  • Let's Encrypt, "Rate Limits", https://letsencrypt.org/docs/rate-limits/
  • Let's Encrypt, "Staging Environment", https://letsencrypt.org/docs/staging-environment/
  • Certbot Documentation, "Staging and Testing", https://eff-certbot.readthedocs.io/en/stable/using.html#staging-and-testing