自动化 SSL 证书申请及分发

现在在国内的机器上一旦部署点需要申请域名证书的服务,那证书简直叫一个难产。

时间长了我也受够了,就决定动手解决下这个问题。

解决思路

证书难产的原因核心还是在于网络问题,因为我使用 acme.sh 来申请证书,网络稍微不顺畅证书就下不来。

但这个问题在国外的云服务主机上就不存在,那么思路很显而易见了:在国外的机器上申请需要的证书,然后将证书送到国内需要部署服务的机器上。

开始动手

申请证书

很明显,需要有一台国外的机器。

刚好我手上有白嫖的 Oracle Cloud 东京的机器,上面只跑了点 docker,这次就拿它吧。

首先安装 acme.sh:

1
curl https://get.acme.sh | sh -s email=your_email@example.com

因为 acme.sh 被收购后默认 CA 为 ZeroSSL,所以这里要输入邮箱进行注册。

当然,也可以选择将默认 CA 切换回 Let’s Encrypt:

1
acme.sh --set-default-ca  --server  letsencrypt

具体申请证书方式就不赘述了,详情见 文档,我使用了 Cloudflare API token 方式来申请。

不出意外,证书会顺利申请下来。

分发证书

由于我这台东京的机器国内直连实在是很堪忧,使用 scp 或 rsync 担心稳定性,于是上了个重量级的轮子,我的老朋友 Syncthing

安装以前说过,就不再重复了,详情看 这里

不过我懒得去处理用户之间的权限问题,这次就直接用 root 用户来跑了。

在 root 用户目录下创建一个新的文件夹:

1
mkdir ssl

然后将 acme.sh 申请的证书安装到该目录下:

1
2
3
acme.sh --install-cert -d neko7ina.com \
--key-file /home/ssl/key.pem \
--fullchain-file /home/ssl/cert.pem

因为我只用 Nginx,所以就安装了这两个证书,有其他需求的建议仔细对照上文 acme.sh 文档。

然后上国内的机器,一样安装 Syncthing,不过这台就不需要使用 root 用户了。

切换到 Syncthing 用户,在目录下创建一个新的文件夹:

1
mkdir ssl

这时候打开两边的 Syncthing Web 管理页面,添加远程设备(另外一方同意),创建文件夹,路径指向刚创建好的 ssl 目录,分享给另一台设备,另一台设备接受分享,路径指向刚创建好的 ssl 目录,保存。

好了,收工。

使用

Nginx 里直接用就完事了,例如:

1
2
ssl_certificate /home/syncthing/ssl/cert.pem;
ssl_certificate_key /home/syncthing/ssl/key.pem;

acme.sh 开启自动更新,证书更新后 Syncthing 会自动把证书发到对应的设备上。

就这么一简单证书,非得整个大炮来打蚊子。

肯定有更好的办法,但我懒,不想动脑子,就这样吧。