之前更新 Docker安装Let’sEncrypt SSL证书 文章 , 想通过 docker 来申请和更新证书一劳永逸 , 在初次申请完毕时执行更新只会提示过期时间未到 , 暂不用更新 , 可是当三个月证书即将到期时发现更新会报错 , 无法更新 . 如果在生产上解决这个问题就比较麻烦了 , 这里换成 docker 部署 acme 申请和更新 Let’s Encrypt 证书
安装 Docker
Docker 和 Docker Compose 安装 , 这里不做赘述 , 参考以前文章
部署 Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| version: '3.7' services: nginx: image: nginx:1.25.3 container_name: nginx restart: always logging: driver: "json-file" options: max-size: "500m" environment: - TZ=America/Los_Angeles ports: - 80:80 - 443:443 volumes: - ./conf/nginx.conf:/etc/nginx/nginx.conf - ./conf/custom/:/etc/nginx/conf/ - ./www/:/etc/nginx/html/ - ./logs/:/var/log/nginx/ - /data/apps/letsencrypt:/etc/letsencrypt networks: - ycc
acme: image: neilpang/acme.sh container_name: acme command: /bin/sh -c "while :; do acme.sh --register-account -m 邮箱 && acme.sh --issue --dns dns_ali -d evdances.com -d *.evdances.com --keylength ec-384 --fullchain-file /etc/letsencrypt/fullchain.pem --key-file /etc/letsencrypt/privkey.pem --reloadcmd 'docker exec nginx nginx -s reload'; sleep 1296000; done" environment: - Ali_Key=阿里APIKey - Ali_Secret=阿里APISecret volumes: - /data/apps/letsencrypt:/etc/letsencrypt - /var/run/docker.sock:/var/run/docker.sock networks: - ycc
networks: ycc: driver: bridge
|
这里看实际情况进行修改 , 注意几点
- acme 使用具体哪个 dns 解析申请取决于域名是在哪个平台购买的 . 对应修改相应的配置, 一个是命令中
dns_ali
和 对应的环境变量 Ali_Key
和 Ali_Secret
- 这里公用几个容器的网络为
ycc
可自行调整
- acme.sh –register-account -m 邮箱 这里首次需要加上,更新证书时这条命令会不会报错”已注册”待确认
- 在
acme
service里需要挂在docker套接字,否则更新完证书后无法直接通过宿主的docker更新nginx配置
这里主要是将证书申请存放目录进行共享 , 申请完证书后重启 nginx 服务. 同时启动一个定时任务每15天 (1296000秒) 执行一次更新任务
在启动 Nginx 之前将使用了 SSL 证书的相关域名配置文件先隐藏 ( 否则 Nginx 启动会失败停止 ,接下来无法申请证书)
首次申请证书
1 2 3 4 5 6 7
| docker-compose run --rm acme sh -c " acme.sh --register-account -m 邮箱 && \ acme.sh --issue --dns dns_ali \ -d 域名 -d *.域名 \ --keylength ec-384 \ --fullchain-file /etc/letsencrypt/fullchain.pem \ --key-file /etc/letsencrypt/privkey.pem"
|
这个步骤会相对耗时 , 主要是通过平台 API 增加域名 txt 解析 , 然后申请 SSL 证书. 完成后证书会保存在宿主 /data/apps/letsencrypt
下 , 然后加入之前隐藏的使用 SSL 的 nginx 配置文件重启 Nginx docker nginx nginx -s reload
更新证书
已经配置在 acme
服务定时任务中