docker 使用 certbot 经验记录
1. 背景
某些场景下,需要单独的证书文件,没法靠 caddy/nginx 等的插件自动申请。此时使用 certbot 就十分方便
certbot 可以单独运行,会有自动续期机制。另外也可以用 docker 容器化,这种情况下自动续期需要定期重启容器。
2. Docker-Compose 部署
下面是 docker-compose 的例子,使用 cloudflare api 做 DNS-01 challenge,申请 let’s encrypt 证书
services:
certbot:
image: certbot/dns-cloudflare:latest
container_name: certbot-derper
restart: no
volumes:
- "./certbot/etc:/etc/letsencrypt"
- "./certbot/log:/var/log/letsencrypt"
- "./cert:/cert"
command: >
certonly
--non-interactive
--agree-tos
--email '[email protected]'
--dns-cloudflare
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini
--dns-cloudflare-propagation-seconds 10
-d 'xxxxxxxx.com'
--deploy-hook /etc/letsencrypt/copy_certs_out.sh
其中,./certbot/etc/cloudflare.ini
里面存了 cf 的 api token,只有一行:
dns_cloudflare_api_token = co-xxxxxxxxxxxxxxxxx
2.1. 导出证书
--deploy-hook /etc/letsencrypt/copy_certs_out.sh
在申请完证书后会自动执行。此脚本放在宿主机的./certbot/etc/
目录下,内容:
# 复制 privkey.pem
if [ -f "$RENEWED_LINEAGE/privkey.pem" ]; then
cp "$RENEWED_LINEAGE/privkey.pem" "/cert/$RENEWED_DOMAINS.key"
echo "已成功复制 privkey.pem 到 /cert/$RENEWED_DOMAINS.key"
else
echo "源文件 $RENEWED_LINEAGE/privkey.pem 不存在,复制失败。"
fi
# 复制 fullchain.pem
if [ -f "$RENEWED_LINEAGE/fullchain.pem" ]; then
cp "$RENEWED_LINEAGE/fullchain.pem" "/cert/$RENEWED_DOMAINS.crt"
echo "已成功复制 fullchain.pem 到 /cert/$RENEWED_DOMAINS.crt"
else
echo "源文件 $RENEWED_LINEAGE/fullchain.pem 不存在,复制失败。"
fi
将最后存放证书的./cert
目录映射进其他需要使用证书的容器即可
3. 手动生成证书
如果有时候需要手动申请一份 Let’s Encrypt 证书用于测试,可以跑如下一行命令来生成:
sudo docker run -it --rm \
-v "./certs:/etc/letsencrypt" \
-v "./cloudflare.ini:/data/cloudflare.ini" \
certbot/dns-cloudflare:latest certonly --non-interactive --agree-tos --email '[email protected]' \
--dns-cloudflare --dns-cloudflare-credentials /data/cloudflare.ini --dns-cloudflare-propagation-seconds 10 \
-d 'xxxxxxxxxx.com'
同样的,需要准备一份 cloudflare.ini
位于当前目录下,里面只有一行 cloudflare api token:
dns_cloudflare_api_token = co-xxxxxxxxxxxxxxxxx
执行完毕后,证书会生成在当前文件夹的 certs/live/<你的域名> 目录下。其中 privkey.pem
为私钥,fullchain.pem
为完整 crt 证书。
docker 使用 certbot 经验记录
https://blog.openyq.top/posts/37495/