由于官方的教程太复杂,所以写了这个稍微简单点的。
作为一个 Docker 爱好者,就算是一个 sh 也要用 Docker 部署!刚好作者提供了镜像,正合我意了。

当然想要直接在宿主机部署也可以啦~只需要把我给的命令中,前面的 docker exec 删掉就好。

Docker Compose

1
2
3
4
5
6
7
8
9
services:
acme:
image: neilpang/acme.sh:latest
container_name: acme.sh
restart: unless-stopped
volumes:
- ./data:/acme.sh
- /path/to/your/SSL:/deploy
command: daemon

其中 /path/to/your/SSL:/deploy 挂载卷,只要把你宿主机放证书的文件夹,和容器内一个自定的文件夹挂一起就好。

然后 docker compose up -d 启动!

注册

ZeroSSL

默认使用 ZeroSSL 签证书,不在他们网站上注册账户也是可以的,不过我推荐注册一个,可以方便的看到自己的所有证书。

注册好后,从 ZeroSSL 开发者控制台,获取 EAB 密钥,是一个 KID 和 KEY 的组合。
然后用下面这行命令,在 acme.sh 注册。

1
copy docker exec acme.sh --register-account --server zerossl --eab-kid xxxx --eab-hmac-key xxxx

可以把 ZeroSSL 固定为默认签发机构,以后就不用指定 server 了。

1
copy docker exec acme.sh --set-default-ca  --server zerossl

Cloudflare DNS API

通过 DNS API 可以让 acme.sh 帮你创建验证域名所有权用的 TXT 记录。
我用 Cloudflare 演示,如果你的域名是其他家的,可以在官方的文档里看看如何获取令牌。

前往用户 API 令牌创建一个 Token,使用默认的编辑区域 DNS 即可。
拿到的Token是一会要用的 CF_Token

然后前往任意一个域名的概述页,找到账户 ID,这个是 CF_Account_ID

签发和吊销

首次签发

Token 和 ID 只第一次运行需要,之后会存到配置文件里。
建议你看一下“之后签发”这部分,自行拼接一个完整的命令。

1
copy docker exec -e CF_Token='xxxx' CF_Account_ID="xxxx" acme.sh --issue -d "*.domain.com" --dns dns_cf

之后签发

这是整合好的一个完整命令,会签发你的根域名和泛域名证书,之后每隔 60 天续签一次,并且存放到你指定的文件夹。

1
docker exec acme.sh --issue -d '*.domain.com' -d domain.com --dns dns_cf --key-file /deploy/key.pem --fullchain-file /deploy/cert.pem

可以用多个 -d ,在一份证书里包含多个域,签发的证书可以在 ZeroSSL 证书控制台看到。

指定的 deploy 文件夹,是刚刚挂载的那个。
如果你想修改证书存放的位置,需要修改 Docker Compose 的挂载目录,而不是这里。

续签

一般情况下,不需要手动续签。acme.sh 会每隔 60 天自动续签一次。

下面是强制续签的命令,注意,这个续签是给你签一张新的,而非续期原来的证书。

1
docker exec acme.sh --renew -d '*.domain.com' --force

吊销

签发的证书虽然可以在 ZeroSSL 控制台看到,但是不能吊销。吊销依然需要 acme.sh。

不过注意,这个吊销的话,会将这个域名所有生效的证书吊销。
例如你连续签发了好几张相同域名的证书,那全都会被吊销。

1
docker exec acme.sh --revoke -d '*.domain.com'

其他

邮件通知

我喜欢用 SMTP 给我发邮件,如果你用想用其他通知服务,可以去官方的文档中看看。
通知配置是可选的,不要也行。

1
docker exec -e SMTP_FROM="MAIL" -e SMTP_TO="MAIL" -e SMTP_HOST="smtp.xxxx.com" -e SMTP_SECURE="ssl" -e SMTP_PORT="465" -e SMTP_USERNAME="MAIL" -e SMTP_PASSWORD="PWD" -e SMTP_TIMEOUT="30" acme.sh --set-notify --notify-hook smtp

还有些自定义字段:
--notify-source:邮件中你的服务器名字,只起到一个展示作用。
--notify-level:0 为不通知,1 为错误时通知,2 为续期和错误时通知,3 为每日 corn 通知。
--notify-mode:0 为所有证书统一到一个邮件里,1 为每个证书一封邮件。

1
docker exec acme.sh --set-notify --notify-level 3 --notify-mode 0 --notify-source "Vanadiry SSL"

服务总览

可以查看你都部署了哪些域名,以及他们什么时候会续期。

1
docker exec acme.sh --list