缘起
最近搭建博客和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
- 创建目录
mkdir ~/acme-ssl && cd ~/acme-ssl
- docker-compose 编写 (docker-compose介绍我有专门文章介绍,不了解可以看下)
vim docker-compose.yml
- 脚本
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
- 安装运行
docker-compose up -d
- 执行命令 注册ZeroSSL邮箱
docker exec acme-chainfin --register-account -m guangyi.ding@outlook.com
- 申请泛域名
docker exec acme-chainfin --issue --dns dns_ali -d ycdr.fun -d '*.ycdr.fun' --keylength ec-384
- 查看生成文件
生成的文件 默认都在 /root/acme-ssl/chainfin.online 我们指定的目录下,我们最后不要直接使用这个目录,而是把文件复制出去使用
- 自动续约
我写了一个自动续约脚本,你可以参考一下
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