Appearance
完整示例
本节提供可按需修改的脚本模板:适用于 nginx、Apache、systemd 与 IIS 的 deploy hook,以及适用于腾讯云、Cloudflare、阿里云的 DCV present / cleanup hook。
示例脚本仅供参考,使用后果由使用者自行承担
这些脚本是参考模板,不是 CertiMan 产品的一部分:
- CertiMan 不会自动安装或调用这些脚本。使用前需将脚本复制到目标机器,并按实际环境修改
- 每份脚本顶部都有
── 改这里 ──段,通常只需修改该段中的路径与凭证 - 请务必根据自身的业务、系统、安全策略充分调整并测试(投入使用前须运行
certiman hook test试运行) - 因使用这些示例脚本导致的任何损失(服务中断、证书泄露、误删记录等)由使用者自行承担,TrustAsia 不承担相关责任
分类
| 分类 | 场景 | 脚本 |
|---|---|---|
| 部署示例 | 证书下载后部署到服务 | nginx / apache / systemd(通用) / Windows IIS |
| DNS 验证示例 | 在 DNS 中添加和删除验证记录(present 与 cleanup 共用一个脚本) | 腾讯云 DNSPod / Cloudflare / 阿里云 DNS / 接新服务商的模板 |
使用方法
bash
# 1. 复制到数据目录下的 hooks/(这个目录 certiman 不会自动建),给执行权限
mkdir -p ~/.certiman/hooks && chmod 700 ~/.certiman/hooks
install -m 700 nginx.sh ~/.certiman/hooks/nginx.sh
# 2. 在证书配置里指向它——写绝对路径
# ~/.certiman/cc/certs/example.com/cert.yaml
# deploy: /home/<用户名>/.certiman/hooks/nginx.sh
# 3. 用模拟数据试运行一遍,避免在自动续期时才发现路径错误
certiman hook test -d example.com --step deploy脚本建议放在数据目录 ~/.certiman/hooks/,与证书一同备份和迁移。~ 解析到哪个 home,取决于执行 hook 的用户:以 root 注册定时任务时,脚本应放在 /root/.certiman/hooks/。DCV 脚本顶部包含 API 凭证,脚本目录与脚本文件的权限均应设为 700。多张证书共用一份脚本的目录规划见 Hook 命令 · 推荐目录规划。
hook test 使用当前证书的真实路径执行脚本,退出码非 0 即判定为失败。以 --step present 试运行时,注入的值带 certiman-hook-test- 前缀,且 present 成功后自动执行一次 cleanup,删除试运行写入 DNS 的记录。
凭证配置
脚本顶部的 ── 改这里 ── 段用于填写凭证,与路径、等待秒数集中在同一处,便于定位需要修改的行。密钥以明文存于文件,须执行 chmod 600。
也可以改为从环境变量读取凭证:
sh
SECRET_ID="${TENCENTCLOUD_SECRET_ID}" # 原本是 SECRET_ID="AKIDxxxx..."注意:cron 触发时不继承登录 shell 的环境变量,这是手动执行正常、自动执行失败的最常见原因。此时应在 crontab 中以行内赋值设置变量,或使用 systemd 的 Environment=;仅在 .bashrc 中 export 不会生效。
编写 hook 的注意事项
CERTIMAN_CERT_PATH是全链,不是叶子证书:该变量名易被误解。若参照部分 nginx 教程改为只含叶子证书的cert.pem,桌面浏览器通常不报错,移动端或旧客户端访问时才会出现握手失败。certiman doctor会将缺链判为 FAIL。- 脚本通过
sh -c执行,而非 bash:Debian / Ubuntu 上的/bin/sh是 dash,不支持[[ ]]与数组。需要 bash 时,在脚本第一行写#!/bin/bash,并确保deploy指向脚本文件本身(而非在cert.yaml中内联命令)。 set -e与[ -f x ] && cmd的组合是常见陷阱:文件不存在时整条语句返回 1,set -e会立即终止脚本,后续还原逻辑不会执行。示例中一律使用if。- 默认 60 秒超时:超时后连同子进程一并终止。耗时操作(等待健康检查、滚动重启)应调整
deploy.timeout,或在脚本中转为后台任务。 - 执行时没有可交互的终端:需要输入口令的操作将一直阻塞至超时。口令应通过环境变量或文件提供。
- 注意执行 hook 的身份:cron 触发时使用注册定时任务时的用户身份。写入
/etc/nginx/ssl或执行systemctl reload通常需要 root 权限,应以 root 注册定时任务,或为该用户配置免密 sudo 并在脚本中显式调用sudo。手动执行正常、自动续期时静默失败通常由执行身份不符导致。 - 先校验后重载:未经校验直接 reload 时,配置或证书中的问题会使服务处于不可用状态。重载前不可省略
nginx -t/apachectl configtest校验。
