前一阵子比较忙,想开通阿里云的CDN迁移图片一类的东西,但是又因为比较忙所以一直拖延。今天终于下定决心打算迁移。
其他的东西式比较好弄的,主要是CDN要启用https的话需要TLS证书。虽然可以买DV证书,但是那也是钱啊。因此还是打算能省则省。
阿里云的个人测试证书是免费的,但是有效期只有几个月,每隔几个月手动生成然后上传新证书显然是极累人的。作为一个懒狗,需要一个跑起来除了出错至少一年不用管的方法。
接着我想到了Caddy
服务器,可以自动为域名在Let's Encrypt
下签发证书,而且支持通配符域名。虽然cdn域名并不映射到caddy服务器所在机器,但是通配符域名的证书仍然支持cdn子域名,从而间接满足我的需求。这或许是一个很好的解决方法,值得一试。
创建专用于本情况的具有有限权限的RAM用户
阿里云具有比较完备的访问控制系统,可以在主账户下创建多种子用户和角色,为他们分配不同的权限从而更好地适配细分场景。
而在这里,由于我们需要:
- Caddy通过DNS质询来签发通配符域名证书
- 为CDN上传域名证书
- 删除旧的域名证书
因此我们需要新建一个子用户,为他分配以下权限:
- AliyunDNSFullAccess
- AliyunCDNFullAccess
- AliyunYundunCertFullAccess
然后,记得备份AccessKey
和AccessKey Secret
。
接下来我们需要让Caddy能向阿里云进行DNS质询,从而签发证书。
使用拓展了模块的Caddy服务端
Caddy默认不支持对阿里云进行DNS质询,因此需要添加模块caddy-dns/alidns,但是我的caddy是通过docker容器部署的,写构建镜像虽然也不长,但是感觉还是有点麻烦了。所以我搜了一下,找到了一个用户制作的带alidns模块的caddy镜像:Xm798/docker-caddy。
修改caddy配置
1 |
|
其他部分省略。为了能用到通配符域名,如上文需要添加一个*.example.com
的配置(替换成你自己的域名)。
如果权限配置正确且没有别的错误的话,在启动容器然后等几分钟后应该能看到以下消息
1 |
|
此时随便访问一个解析到这个服务器的,通配符能匹配到的子域名(仍然要在阿里云配置DNS解析记录),然后在浏览器中,就应该能查看到证书被颁发给了通配符域名。
将通配符域名证书部署到CDN
阿里云有CLI客户端和openapi,我们可以通过这种方式来上传证书。
我实现了一个脚本,它会进行:
- 从指定文件读取公钥和私钥
- 上传给CDN
- 删除不是今天上传的证书
使用前需要安装阿里云的CLI和jq,并在root用户下运行aliyun configure
来配置,以确保配置路径生成正确。其中,推荐区域设置为cn-hangzhou
。(不能理解为什么有的地区能用openapi,有的地区不能。)
配置crontab
接下来在root下执行crontab -e
编辑crontab以实现定期上传证书。由于我记得caddy的配置是在到期前30天开始更新证书,因此我的设置是每半个月上传一次,以避免某些极限的情况下证书过期。
1 |
|
接下来就等个几个月测试一下它能不能正常工作了,如果出现什么问题我还会更新这篇文章。
其实可以不用root用户,但是我图省事了,可以自行研究。