update 自动更新证书脚本

This commit is contained in:
mm644706215
2025-08-02 15:52:49 +08:00
parent 49cc28ab0a
commit a3adf38a86
2 changed files with 85 additions and 0 deletions

View File

@@ -63,3 +63,35 @@ docker run --rm \
-v
```
## 定时续期
```shell
chmod +x renew_restart.sh
ln -s ${PWD}/renew_restart.sh /usr/local/bin/renew-restart.sh
crontab -e
```
```shell
0 3 * * * root /usr/local/bin/renew-cert.sh >> /var/log/certbot/renew.log 2>&1
```
## 自动管理证书
Tailscale 自带的derper在设计上确实有一个「自动获取与续期证书」的模式参数是-certmode letsencrypt对应环境变量 DERP_CERT_MODE=letsencrypt。这种模式会使用内置的 ACME 客户端向 Lets Encrypt 申请证书并在到期前自动续期。但它有两个重要前提:
**必须使用 ACME 支持的端口进行验证。**Lets Encrypt 的 HTTP01 挑战只能通过公网上的 80 端口完成TLSALPN01 挑战只能通过 443 端口完成
community.letsencrypt.org
。因此derper 必须监听 443默认并且允许 Lets Encrypt 的验证服务器访问 80 或 443才能自动完成申请和续期。
**域名需要直接解析到运行derper的服务器。**只有这样 Lets Encrypt 的验证请求才能到达derper。
当你把derper改为监听 3477 这类高端口时Lets Encrypt 无法再通过 80/443 进行验证。国内博文也指出,如果自建 DERP 服务器使用高位端口,就无法通过自动验证,只能手动申请证书
alampy.com
。所以在这种情况下derper 自身的自动证书功能会失效,需要自行管理证书并挂载进容器。
总结:
如果能让 derper 监听 443并开放 80/443 两个端口,你可以启用 -certmode letsencryptderper 会自动申请并定期续期证书,完全不需要手动管理。
如果不能开放 80/443例如用的是 3477 端口或服务器 behind NATLets Encrypt 的 HTTP/TLSALPN 挑战无法完成derper 就不能自动续期。你需要使用 DNS01 挑战通过 certbot 等工具申请证书,并在续期后重启 derper或手动申请更新证书然后挂载到容器

53
renew_derper.sh Normal file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
# 检查参数
if [ $# -lt 2 ]; then
echo "用法: $0 <工作目录> <域名>"
exit 1
fi
WORKDIR="$1" # 第一个参数:工作目录,比如 /opt/caddy/certbot-aliyun-docker/derper
DOMAIN="$2" # 第二个参数:域名,比如 derper.jmsu.top
# 可选你可以将阿里云AK/SK/邮箱也作为参数或放到环境变量/配置文件
REGION="cn-hangzhou"
ACCESS_KEY_ID="LTAI5tP1yWFMMJhF6nrGYEit" # 推荐写到外部变量,或传参数
ACCESS_KEY_SECRET="LTAI5tP1yWFMMJhF6nrGYEit" # 推荐写到外部变量,或传参数
EMAIL="pylyzeng@gmail.com"
cd "$WORKDIR" || exit 1
echo ">>> 停止 derper 服务"
docker compose down
echo ">>> 续期证书 $DOMAIN"
docker run --rm \
-e REGION="$REGION" \
-e ACCESS_KEY_ID="$ACCESS_KEY_ID" \
-e ACCESS_KEY_SECRET="$ACCESS_KEY_SECRET" \
-e DOMAIN="$DOMAIN" \
-e EMAIL="$EMAIL" \
-v "$PWD/letsencrypt:/etc/letsencrypt" \
-v "$PWD/certs:/app/certs" \
-v "$PWD/logs:/var/log/certbot" \
hotwa/certbot:latest \
certbot renew \
--manual \
--preferred-challenges dns \
--manual-auth-hook "alidns" \
--manual-cleanup-hook "alidns clean" \
--deploy-hook "/app/scripts/webhook.sh" \
--no-random-sleep-on-renew \
-v
echo ">>> 启动 derper 服务"
docker compose up -d
echo "crontab 添加任务选项(请根据实际需求选择,复制到 crontab 即可):"
echo
echo "【每周一凌晨 2 点执行】"
echo "0 2 * * 1 $WORKDIR/renew_derper.sh $WORKDIR $DOMAIN >> /var/log/renew_derper.log 2>&1"
echo
echo "【每月 1 号凌晨 2 点执行】"
echo "0 2 1 * * $WORKDIR/renew_derper.sh $WORKDIR $DOMAIN >> /var/log/renew_derper.log 2>&1"