自动化 SSL 证书申请及分发
现在在国内的机器上一旦部署点需要申请域名证书的服务,那证书简直叫一个难产。
时间长了我也受够了,就决定动手解决下这个问题。
解决思路
证书难产的原因核心还是在于网络问题,因为我使用 acme.sh 来申请证书,网络稍微不顺畅证书就下不来。
但这个问题在国外的云服务主机上就不存在,那么思路很显而易见了:在国外的机器上申请需要的证书,然后将证书送到国内需要部署服务的机器上。
开始动手
申请证书
很明显,需要有一台国外的机器。
刚好我手上有白嫖的 Oracle Cloud 东京的机器,上面只跑了点 docker,这次就拿它吧。
首先安装 acme.sh:
1 |
|
因为 acme.sh 被收购后默认 CA 为 ZeroSSL,所以这里要输入邮箱进行注册。
当然,也可以选择将默认 CA 切换回 Let’s Encrypt:
1 |
|
具体申请证书方式就不赘述了,详情见 文档,我使用了 Cloudflare API token 方式来申请。
不出意外,证书会顺利申请下来。
分发证书
由于我这台东京的机器国内直连实在是很堪忧,使用 scp 或 rsync 担心稳定性,于是上了个重量级的轮子,我的老朋友 Syncthing。
安装以前说过,就不再重复了,详情看 这里。
不过我懒得去处理用户之间的权限问题,这次就直接用 root 用户来跑了。
在 root 用户目录下创建一个新的文件夹:
1 |
|
然后将 acme.sh 申请的证书安装到该目录下:
1 |
|
因为我只用 Nginx,所以就安装了这两个证书,有其他需求的建议仔细对照上文 acme.sh 文档。
然后上国内的机器,一样安装 Syncthing,不过这台就不需要使用 root 用户了。
切换到 Syncthing 用户,在目录下创建一个新的文件夹:
1 |
|
这时候打开两边的 Syncthing Web 管理页面,添加远程设备(另外一方同意),创建文件夹,路径指向刚创建好的 ssl
目录,分享给另一台设备,另一台设备接受分享,路径指向刚创建好的 ssl
目录,保存。
好了,收工。
使用
Nginx 里直接用就完事了,例如:
1 |
|
acme.sh 开启自动更新,证书更新后 Syncthing 会自动把证书发到对应的设备上。
就这么一简单证书,非得整个大炮来打蚊子。
肯定有更好的办法,但我懒,不想动脑子,就这样吧。