之前更新 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 # 挂载 Docker 套接字
networks:
- ycc

networks:
ycc:
driver: bridge

这里看实际情况进行修改 , 注意几点

  • acme 使用具体哪个 dns 解析申请取决于域名是在哪个平台购买的 . 对应修改相应的配置, 一个是命令中 dns_ali 和 对应的环境变量 Ali_KeyAli_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服务定时任务中