在自动化脚本中启用 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 环境使用独立的接口和根证书,速率限制宽松得多,专门用于解决调试过程中可能遇到的网络、验证或脚本错误,而不用担心被封禁。
实操步骤
1. 备份现有配置:在修改脚本前,备份当前的 crontab 或 systemd timer 配置,防止误操作影响线上服务。
2. 修改签发参数:找到调用 ACME 客户端的命令,添加测试环境标志。不要手动修改 API 地址,除非客户端不支持标准参数。
3. 执行手动测试:先在命令行手动运行一次修改后的命令,观察输出日志,确认挑战(challenge)验证通过。
4. 记录证书路径:命令执行成功后,终端会输出证书保存路径(如 /etc/letsencrypt/live/example.com/ 或 ~/.acme.sh/example.com/),请记录该路径用于后续验证。
5. 恢复生产参数:测试无误后,去掉 `--staging` 参数,确保下次自动运行使用的是正式环境。
验证方法
测试环境下签发的证书不受浏览器信任。验证分为“本地文件验证”和“服务端验证”两种场景。
1. 本地证书文件验证(推荐)
这是测试脚本最直接的验证方式,无需部署证书即可确认签发环境。使用 openssl 查看本地生成的证书文件:
openssl x509 -in /path/to/fullchain.pem -noout -issuer
将 /path/to/fullchain.pem 替换为上一步记录的實際路径。如果返回结果中包含 Fake LE 或 STAGING 字样,说明当前使用的是测试环境证书;正式环境通常显示 ISRG Root X1。
2. 服务端验证(仅限测试服务器)
如果你将测试证书部署到了测试服务器(切勿部署到生产服务器),可以通过以下命令确认服务端提供的证书:
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -issuer
若返回结果中包含 Fake LE 或 STAGING 字样,说明服务端正在提供测试环境证书。
常见坑
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