3.7 KiB
使用阿里云 DNS 实现 Certbot 自动续签证书的 Docker 镜像
构建镜像
cd derper
git clone https://github.com/hotwa/certbot-dns-aliyun
cd certbot-dns-aliyun
docker build -t hotwa/certbot:latest .
手动续期
- 续期证书 适用于你已经用 certbot/letsencrypt 申请过,想自动脚本化续期的场景。
docker run --rm \
-e REGION=YOUR_REGEION \
-e ACCESS_KEY_ID=YOUR_ACCESS_KEY \
-e ACCESS_KEY_SECRET=YOUR_ACCESS_SECRET \
-e DOMAIN=YOUR_DOMAIN \
-e EMAIL=YOUR_NOTIFICATION_EMAIL \
-e CRON_SCHEDULE="0 0 * * *" \
-v "$PWD/letsencrypt:/etc/letsencrypt" \
-v "$PWD/certs:/app/certs" \
-v "$PWD/logs:/var/log/certbot" \
hotwa/derper-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
- 首次申请证书 适用于第一次为一个新域名/通配符域名申请 SSL 证书
docker run --rm \
-e REGION=YOUR_REGEION \
-e ACCESS_KEY_ID=YOUR_ACCESS_KEY \
-e ACCESS_KEY_SECRET=YOUR_ACCESS_SECRET \
-e DOMAIN=YOUR_DOMAIN \
-e EMAIL=YOUR_NOTIFICATION_EMAIL \ // 证书刷新通知邮箱
-e CRON_SCHEDULE="0 0 * * *" \ // 自定义证书刷新间隔
-v "$PWD/derper/letsencrypt:/etc/letsencrypt" \
-v "$PWD/derper/certs:/app/certs" \
-v "$PWD/derper/logs:/var/log/certbot" \
hotwa/derper-certbot:latest \
certbot certonly \
-d "*.headscale.jmsu.top" \
--manual \
--preferred-challenges dns \
--manual-auth-hook "alidns" \
--manual-cleanup-hook "alidns clean" \
--email your@email.com \
--agree-tos \
--non-interactive \
-v
定时续期
chmod +x renew_restart.sh
ln -s ${PWD}/renew_restart.sh /usr/local/bin/renew-restart.sh
crontab -e
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 客户端向 Let’s Encrypt 申请证书并在到期前自动续期。但它有两个重要前提:
**必须使用 ACME 支持的端口进行验证。**Let’s Encrypt 的 HTTP‑01 挑战只能通过公网上的 80 端口完成,TLS‑ALPN‑01 挑战只能通过 443 端口完成 community.letsencrypt.org 。因此,derper 必须监听 443(默认)并且允许 Let’s Encrypt 的验证服务器访问 80 或 443,才能自动完成申请和续期。
**域名需要直接解析到运行 derper 的服务器。**只有这样 Let’s Encrypt 的验证请求才能到达 derper。
当你把 derper 改为监听 3477 这类高端口时,Let’s Encrypt 无法再通过 80/443 进行验证。国内博文也指出,如果自建 DERP 服务器使用高位端口,就无法通过自动验证,只能手动申请证书 alampy.com 。所以在这种情况下,derper 自身的自动证书功能会失效,需要自行管理证书并挂载进容器。
总结:
如果能让 derper 监听 443,并开放 80/443 两个端口,你可以启用 -certmode letsencrypt,derper 会自动申请并定期续期证书,完全不需要手动管理。
如果不能开放 80/443(例如用的是 3477 端口或服务器 behind NAT),Let’s Encrypt 的 HTTP/TLS‑ALPN 挑战无法完成,derper 就不能自动续期。你需要使用 DNS‑01 挑战通过 certbot 等工具申请证书,并在续期后重启 derper,或手动申请更新证书然后挂载到容器