APISIX证书自动化

Wanjiongming 于 2022-02-13 发布

最近在做一个 SASS 服务,为了防止用户上传违法信息导致域名被封,需要用户主动绑定自己的域名。绑定域名后,系统需要自动添加路由,自动申请 ssl 证书。

调研下来发现 apisix 这个开源的网关刚好支持通过调用 api 去动态添加路由和证书。对于申请 免费的 ssl 证书一般都是使用acme.sh

证书申请

acme 生成证书分为两种方式

上述过程可以通过acme.sh去一键完成

实现

  1. 调用 APISIX 接口添加文件验证路由绑定到域名

    router

  2. 调用acme.sh

    注意这里最好指定服务为letsencrypt,在国内调用会比较快

    这里是自己启动 http 验证,需要指定-w参数。生成的验证文件会放在${web_root}/.well-known/acme-challenge/,需要写一个路由去去处理http://xxx/.well-known/*(.*)*这个请求

    sh acme.sh --issue -m ${email} --server letsencrypt -d ${domain} -w ${web_root}
    sh acme.sh --install-cert -d ${domain}  --key-file ${ssl_key} --fullchain-file ${ssl_cer}
    
  3. 调用 APISIX 接口删除文件验证路由

  4. 调用 APISIX 接口导入 SSL 证书

    注意这里有个坑,导入证书接口文档没有说明需要传入证书的start_timeend_time,但是Models里面又有,最好还是传下这两个参数,否则在 APISIX Dashboard 中查看证书会看不到过期时间时间。

    可以使用openssl x509 -text -noout -in xxx.cer命令解析出证书的 sni 和有效时间

因此可以写一个 RESTful 服务和 APISIX 部署在一个网络内,在服务启动时把自己的注册到 APISIX 中,然后实现以上功能即可

偷个懒

上述过程已经封装程一个 Docker 镜像 apisix-acme,直接使用即可

参考

apisix 基于 acme.sh 自动更新 HTTPS 证书