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/
作者
yqs112358
许可协议