用docker申请letsencrypt通配符证书

用 docker 申请 letsencrypt 证书的好处就是不需要在宿主机上安装依赖,只要用下面的命令即可:

1
2
3
4
5
6
docker run -it --rm \
--name certbot \
-v /mnt/letsencrypt:/etc/letsencrypt \
-v /mnt/bak/letsencrypt:/var/lib/letsencrypt \
certbot/certbot \
certonly --manual --agree-tos --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns -d *.YOUR-DOMAIN.com -d YOUR-DOMAIN.com

具体的命令释义如下:

1
2
3
4
5
6
-v /mnt/letsencrypt:/etc/letsencrypt -v /mnt/bak/letsencrypt:/var/lib/letsencrypt # 挂载目录,certbot申请到的或备份的证书会放在这两个目录
--manual # 交互模式
--agree-tos # 同意服务协议
--server https://acme-v02.api.letsencrypt.org/directory # 指定使用acmev2协议的服务器,因为通配符证书的申请需要这个协议
–preferred-challenges dns # 使用dns检验来证明你拥有这个域名
-d *.YOUR-DOMAIN.com -d YOUR-DOMAIN.com # 指定了需要申请证书的通配符域名,根域名要额外再写一次

然后命令行会出现文字提示,让你输入邮箱,询问是否需要订阅邮件,提醒IP将会被记录之类,最后它会出现一个或多个callenges,让你添加 DNS 的 TXT 记录,这一步是最关键的:

1
2
3
4
5
6
Please deploy a DNS TXT record under the name
_acme-challenge.YOUR-DOMAIN.com with the following value:

-xxxxxxxxxxxx

Before continuing, verify the record is deployed.

一定要到域名提供商那里添加 txt 记录,添加完成之后,可以通过下面的命令检查:

1
dig _acme-challenge.YOUR-DOMAIN.com txt

如果添加成功会出现类似下面的输出:

1
2
3
;; ANSWER SECTION:
_acme-challenge.YOUR-DOMAIN.com. 599 IN TXT "Xsf3ofhs8wodj923hrfwfj9832qW7FxEGJRuA4MTe3w"
_acme-challenge.YOUR-DOMAIN.com. 599 IN TXT "aR8U1fjoDF89sfo3fja89F8OIfs98F7SFJ87fsfF3Sp"

这个时候就可以点击回车了,如果上面一步没完成就点击回车,会出现下面的错误:

1
2
3
4
5
6
Press Enter to Continue
Waiting for verification...
Challenge failed for domain YOUR-DOMAIN.com
dns-01 challenge for YOUR-DOMAIN.com
Cleaning up challenges
Some challenges have failed.

默认情况下,证书只有3个月的有效期,快到期时可以重复执行上面的命令来延期3个月。