多服务同步证书方案

Scroll Down

当前问题

多台服务器,不同的应用,通用同一套证书,没钱买证书。
确实想买一套证书,奈何兜里没银子。

方案所用技术

简单说一下实现方法

由其中一台服务器通过 Certbot 颁发证书,Certbot会自动续期,而其他服务器通过定时脚本自动拉取更新过的证书,并reload本地相关服务。

部署certbot

安装certbot

sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install core
# 可能出现 error: too early for operation, device not yet seeded or device model not acknowledged,稍等1分钟再执行即可
sudo snap refresh core
snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

配置certbot

从dns服务商获取token,这里我使用cloudflare 配置如下,其他服务商参考certbot dns文档

vim /opt/certbot/cloudflare.ini
dns_cloudflare_api_token = 3123124askjfla234j2l3j41lj

颁发证书

certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /opt/certbot/cloudflare.ini \
-d wintewu.com \
-d *.wintewu.com 

此时证书存放在 /etc/letsencrypt/live/下面

其他服务器更新证书

配置证书任务

这里需要做密钥认证
如果本地没有公钥私钥对,先在本地机器上使用ssh-keygen生产一下,需要填写的默认即可

ssh-copy-id -i .ssh/id_rsa.pub  [email protected](颁发过证书的服务地址)

编写本地同步脚本和刷新服务脚本

vim reload-ssl.sh

rsync -avL --delete [email protected]:/etc/letsencrypt/live/ /etc/letsencrypt/live/ && \
/bin/cp -rfL /etc/letsencrypt/live/wintewu.com/fullchain.pem /opt/docker/minio/config/certs/public.crt && \
/bin/cp -rfL /etc/letsencrypt/live/wintewu.com/privkey.pem /opt/docker/minio/config/certs/private.key && \
docker restart minio

增加执行权限并且检查是否有异常

chmod +x reload-ssl.sh
./reload-ssl.sh

新增定时任务

crontab是一个vim编辑器(一行对应一个任务)

crontab -e
0 3 * * * /root/reload-ssl.sh >> /tmp/reload-ssl.log

0 3 * * * 代表每天凌晨3点整 执行一次脚本

存在的问题

当前方式会定时重启服务,会造成服务定时重启。

解决方案

可以使用脚本判断证书是否有更新,有更新才重启即可。由于懒,本人觉得可以接受。懒得折腾了

大致逻辑如上,如有问题可留言