acme.sh签发泛域名证书【含签发失败处理方式】

发布时间 2024-01-09 15:14:51作者: 没脚的丛林鸟too22oot

前言

因为项目使用到的子域名比较多,公司没有购买泛域名证书,证书到期后一个个替换太麻烦了,所以使用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.还是用同一个签发服务商更换签发服务器接口 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

3.执行签发命令:acme.sh --issue --dns dns_dp -d xxx.com -d *.xxx.com ## 成功!

4.证书位置:/acme.sh/xxx.com_ecc