acme.sh泛域名https-ssl证书申请与自动续约

acme.sh泛域名https-ssl证书申请与自动续约

左岸 308 2021-09-08

缘起

最近搭建博客和wiki 需要配置多个域名,但是腾讯云免费https 只支持单个域名,所以就想在网上找个免费的支持泛域名的https ssl 证书

文档

https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_dp

let’s encrypt

Let’s Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。

Let’s Encrypt由互联网安全研究小组(缩写ISRG)提供服务。主要赞助商包括电子前哨基金会、Mozilla基金会、Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。

用以实现新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。GitHub上有这一规范的草案,且提案的一个版本已作为一个Internet草案发布。

Let’s Encrypt宣称这一过程将十分简单、自动化并且免费

ZeroSSL

ZeroSSL在2016年就已经推出,和Let’s Encrypt一样,证书有效期只有90天,支持泛域名SSL证书。和Let’s Encrypt不同的是,ZeroSSL API没有速率限制,不存在同一IP多次申请SSL证书被限制的问题,ZeroSSL还提供了WEB界面可在后台管理SSL证书,相比Let’s Encrypt功能更加丰富。

acme 与 ZeroSSL

acme 目前默认申请已经改为 ZeroSSL,所以申请的话提前注册 ZeroSSL 帐号

acme-sh 是什么

简单来说acme-sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。

acme-sh 有以下特点:

  • 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
  • 完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
  • 简单,功能强大且易于使用。你只需要3分钟就可以学习它。
  • Let’s Encrypt免费证书客户端最简单的shell脚本。
  • 纯粹用Shell编写,不依赖于python或官方的Let’s Encrypt客户端。
  • 只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。
  • 支持在Docker内使用,支持IPv6

acme 安装

说明我使用的是docker 配合 阿里云api安装管理 acme,acme支持很多种使用方式,其他可以查看官网博客,acme

  1. 创建目录
mkdir ~/acme-ssl && cd ~/acme-ssl
  1. docker-compose 编写 (docker-compose介绍我有专门文章介绍,不了解可以看下)
vim docker-compose.yml
  1. 脚本
version: "3"
services:
  acme.sh:
    image: neilpang/acme.sh
    container_name: acme-chainfin
    restart: always
    command: daemon
    environment:
      - Ali_Key=LAtJ12gnBfaKpGrHD2N5e
      - Ali_Secret=hT79N12OkFYl12EsdJ4sB12sdfdqaOkcvb1to
    volumes:
      - /root/acme-ssl/chainfin.online:/acme.sh
    network_mode: host
  1. 安装运行
docker-compose up -d
  1. 执行命令 注册ZeroSSL邮箱
docker exec acme-chainfin --register-account -m guangyi.ding@outlook.com
  1. 申请泛域名
docker exec acme-chainfin --issue --dns dns_ali -d ycdr.fun -d '*.ycdr.fun' --keylength ec-384
  1. 查看生成文件

生成的文件 默认都在 /root/acme-ssl/chainfin.online 我们指定的目录下,我们最后不要直接使用这个目录,而是把文件复制出去使用

  1. 自动续约
    我写了一个自动续约脚本,你可以参考一下
docker exec acme-chainfin --cron
## 删除https
rm -rf /root/nginx/conf.d/https
## 创建 https
mkdir /root/nginx/conf.d/https
## 赋值 key crt 到 nginx
cp -r /root/acme-ssl/chainfin.online/ycdr.fun_ecc/. /root/nginx/conf.d/https/
## sleep 5 s
sleep 5
## 重启nginx
docker restart yc_nginx
echo "完成-ycdr.fun ssl续约"

9 设置定时任务

  • 打开定时任务
crontab -e 
  • 写定时脚本 每天晚上23:55执行一次续约脚本,日志打印在 acme-ssl.log
55 23 * * * /root/shell/acme-ssl-cron.sh 2>&1 |tee acme-ssl.log