万恶的阿里云

你们想象一下,在一个阳光明媚 春意盎然的清明假期,吃着火锅唱着歌,突然就收到阿里云的邮件了

image-20240405142239724

好好好,虽然已经提前知道阿里云把免费证书改为3个月有效期了,但想到每90天都要重新申请大概4个证书并部署就觉得很麻,所以自然的会有以下的需求。

  1. 不是免费的证书我不用
  2. 有效期长一点,或者最好能自动续期
  3. 泛域名证书,让我不用非得申请4 5个证书
  4. 如果还能自动部署,那真是,太酷啦

acme.sh

acme.sh是一个证书管理工具,能自动的帮我们

  • 从证书发行商(CA)那薅过来免费证书
  • 帮我们配置云服务商(阿里云)的dns解析(应该是做所属验证的,毕竟不能随便申请别人服务器的证书)就是一个txt记录,好像验证完就可以删了
  • 安装到服务器(下载证书,部署到机器的指定目录,然后nginx的配置路径不变就可以了)

ZeroSSL

大善人,免费让我们薅三张90天证书和一张1年证书,支持泛域名证书,同时支持给ip加证书。

但这仅存在于理论上,通过acme这个工具我们可以薅无限张自动续期的证书(虽然理论上两张就够了)

为什么说无限呢?看图

image-20240405143550583

可以看到我已经有两张已签发的证书,但订阅量还是0


我也想要,直接来吧!

参考链接:利用 acme.sh 申请 ZeroSSL 泛域名证书的图文教程-腾讯云开发者社区-腾讯云 (tencent.com)

哦,提前说一下,最好用bash来操作(如果你不是很懂的话),zsh在*这里有些小问题zsh: no matches found:

安装acme.sh

1
wget -O - https://get.acme.sh | sh
1
2
[Fri Apr  5 01:42:58 PM CST 2024] OK
[Fri Apr 5 01:42:58 PM CST 2024] Install success!

需要在墙外执行,安装会自动进行,之后目录下会有.acme.sh这个目录。也就是说如果后面出了什么问题,比如换了shell后不想重新alias,可以到这个目录下找到那个可执行。

配置ZeroSSL为默认CA

1
acme.sh --set-default-ca --server zerossl
1
[Fri Apr  5 01:43:57 PM CST 2024] Changed default CA to: https://acme.zerossl.com/v2/DV90

配置云服务商DNS API

官方文档:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
例如我使用阿里云的服务那就找到

image-20240405144529011

按照文档的说明,需要一个阿里云的RAM账号,如果说你在用别人的账号大可以直接化身root战士,但如果是自己的服务那我更推荐按照下面的方式创建专门授权的子账户。

阿里云RAM账户创建

找到RAM用户页面,创建用户

image-20240405144808206

image-20240405144851186

建议写一个有意义的名字,勾选API访问。

创建成功后下载用户登陆密钥(只有一次机会,关了的话只能删了重来了)

对RAM用户授权,能猜到和DNS的操作有关所以只放行dns相关的权限

image-20240405145124684

继续申请证书

按照文档export刚刚下载的key和id

1
2
export Ali_Id="xxxx"
export Ali_Key="xxxx"

链接CA,用自己的zerossl登陆邮箱

1
acme.sh --register-account -m xxx@outlook.com --server zerossl

然后会给一些反馈信息

1
2
[Fri Apr  5 01:45:00 PM CST 2024] Registered
[Fri Apr 5 01:45:00 PM CST 2024] ACCOUNT_THUMBPRINT='A5hxxxQU'

申请证书

1
acme.sh --issue --dns dns_ali -d qianmmo.top -d *.qianmmo.top

这一段看控制台信息,随机应变

反正最后会有

1
[Fri Apr 5 01:55:56 PM CST 2024] Cert success.

自动安装证书

1
2
3
4
./acme.sh --installcert -d *.qianmmo.top \
--key-file /ssl/cert/*.qianmmo.top.key \
--fullchain-file /ssl/cert/qianmmo.full.cer \
--reloadcmd "service nginx reload"

域名改成自己申请的,路径自己设置(和nginx保持一致)

更换nginx配置

把之前的证书换掉,现在只需要配置一个泛域名的证书了

1
2
ssl_certificate      /ssl/cert/qianmmo.full.cer;
ssl_certificate_key /ssl/cert/*.qianmmo.top.key;

最后

检查自己的网页,可以看到证书已经变为了zerossl签发的泛域名证书,结束

image-20240405150315443

一些悬案

安装的时候有下面值得注意的信息

no crontab for root

1
2
3
[Fri Apr  5 01:42:57 PM CST 2024] Installing cron job
no crontab for root
no crontab for root

解决:

没有crontab 会自动更新吗? · Issue #2435 · acmesh-official/acme.sh (github.com)

检查定时任务crontab -l发现已有

1
57 6 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

socat

1
2
3
[Fri Apr  5 01:42:57 PM CST 2024] It is recommended to install socat first.
[Fri Apr 5 01:42:57 PM CST 2024] We use socat for standalone server if you use standalone mode.
[Fri Apr 5 01:42:57 PM CST 2024] If you don't use standalone mode, just ignore this warning.