acme.sh签发泛域名证书【含签发失败处理方式】
前言
使用acme.sh原由:因为项目使用到的子域名比较多,公司没有购买泛域名证书,证书到期后一个个替换太麻烦了,所以使用acme.sh来生成泛域名证书,虽然有效周期较短,但是可以自动续期,还是比较完美的。
环境:docker swarm集群,使用docker stack来部署应用
反向代理:traefik
生成证书的方式
方式一:通过http方式,该种方式是通过访问.well-known目录下的文件来实现,也就是说需要再单独搭建一个服务供acme访问
方式二:通过dns方式,需要自动添加dns txt记录来进行验证,该种方式需要提供操作dns的secret key 和secret id。比如使用的是阿里云,那么可以在控制台获取到id 和key
在本文中,采用第二种部署方式【dnspod解析】。
部署过程
docker network create --driver=overlay my_proxy
vim acme.yaml
version: '3'
services:
acme:
image: neilpang/acme.sh:3.0.0
volumes:
- ./nginx:/var/www
- ./acme.sh:/acme.sh # dns方式生辰的证书所在目录/acme.sh/域名/证书文件
command: daemon
environment:
HTTP_PROXY: "http://192.168.1.77:7890" # 因为需要访问墙外所以设置了代理
HTTPS_PROXY: "http://192.168.1.77:7890"
networks:
- my_proxy
networks:
my_proxy:
external: true
获取dnspod域名解析id和Key
注册账号+生成证书
进入acme.sh容器内部,执行以下命令
/ # acme.sh --register-account -m xxx@163.com
/ # export DP_Id="一串数字"
/ # export DP_Key="xxx"
acme.sh --issue --dns dns_dp -d xxx.com -d *.xxx.com
有如下输出,表示证书签发成功
更新证书失败?不要慌,有方法!
遇到的问题:证书到期了,重新签发的时候一直提示sleep 10 and retry
排查思路:
1.acme.sh服务器是否能正常使用魔法
2.acme.sh调用证书签发服务器接口是否正常
3.域名token和id是否正确
故障确认:由于【排查思路中的第二种情况】无法正常更新证书
解决思路:
1.还是用同一个服务商但需要更换签发服务器接口地址(如从https://a-01.abc.com/qi换到https://a-02.abc.com/qi)
2.直接更换成可用的签发服务商
方案选择:第二种【直接更换签发服务商】,从zerossl换成letsencrypt
acme.sh支持的所有服务商:Server · acmesh-official/acme.sh Wiki (github.com)
具体更换步骤:
1.acme.sh更新:acme.sh upgrade
2.切换默认签发服务商为letsencrypt:acme.sh --set-default-ca --server letsencrypt
或者在注册账号时指定签发服务:acme.sh --register-account -m 邮箱地址 --server letsencrypt
3.执行签发命令:acme.sh --issue --dns dns_dp -d xxx.com -d *.xxx.com ## 成功!
4.证书位置:/acme.sh/xxx.com_ecc
别走,还有其他内容你也需要了解
- 在acme.sh容器中,我们配置了dns解析的id和key,以及注册的账号,这些信息都在【account.conf】文件中
- 域名签发相关信息的配置文件:/acme.sh/域名/【域名.conf】,如:我的域名是aaa.com,那么该配置文件是:/acme.sh/aaa.com/aaa.com.conf
大致内容如下:
Le_Domain='xxx.com'
Le_Alt='*.xxx.com'
Le_Webroot='dns_dp'
Le_PreHook=''
Le_PostHook=''
Le_RenewHook=''
Le_API='https://acme-v02.api.letsencrypt.org/directory'
Le_Keylength='ec-256'
Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/15067723dd6/235ccd027676'
Le_LinkOrder='https://acme-v02.api.letsencrypt.org/acme/order/15067723dd6/2d30ff27676'
Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/03f26088e2d4ae1eb08a89053e32ff731a'
Le_CertCreateTime='1704769093'
Le_CertCreateTimeStr='2024-01-09T02:58:13Z'
Le_NextRenewTimeStr='2024-03-08T02:58:13Z'
Le_NextRenewTime='1709866693'
从配置文件中我们可以确认该域名使用的具体签发接口以及使用的算法等
欢迎交流:waqingwa01