SSL证书的自动申请和部署
本文介绍使用certed项目部署SSL证书自动化申请部署流水线的思路和方法。自己的博客部署在腾讯云的服务器上,由于相关服务商的政策原因,腾讯云的SSL证书从原来的一年期限变为了三个月。这导致每隔三个月就要申请和部署一遍所有站点的SSL证。为此,我利用certed项目部署了一套自动化的流水线完成SSL证书的自动申请和部署。
环境介绍
我自己的博客服务器由腾讯云提供,使用宝塔面板搭建多个站点,包含了自己的博客、图床和网盘等。腾讯云免费的SSL证书只能申请单一域名的SSL证书,且免费证书的时限只有三个月。由于自己的站点不是一次性搭建完毕的,每个网站SSL证书的时间还不一致,导致更新SSL证书相当麻烦。每次更新证书只能在腾讯云上申请,然后下载后粘贴复制到宝塔面板的网站配置项中。
我的多个网站均为songjiahao.com下的二级域名,其实可以申请通配符域名给所有的网站使用。
项目简介
Certd是一个免费全自动申请和自动部署更新SSL证书的管理系统。后缀d取自linux守护进程的命名风格,意为证书守护进程。该项目中可以通过创建自动化流水线的方式自动完成SSL证书的申请和部署,且该项目支持Docker、1Panel和宝塔面板等多种部署方式。详细介绍可以查看官方手册。本文的方案参考官方的图文教程
创建思路
考虑到自己服务器的情况,所有的网站均在同一个目录中,并且已经安装过Docker容器,所以本文使用官网教程中的Docker的方式部署Certd项目。docker的安装和使用可以参考Docker学习笔记。
Certed项目支持很多自动化任务,如下图所示:
由于部分任务需要专业版,可以根据需求购买。本文使用了基础版的基本功能,采用以下的流水线设计:
- 证书申请任务
- 主机-复制到本机
- 主机-执行远程主机脚本
上述流程中,首先使用证书申请任务申请一个3个月的免费通配符域名SSL证书,然后将其复制到主机的指定目录中(Docker中的目录和宿主机的目录有映射关系,因此可以在宿主机中找到对应的文件。)最后,在远程主机上执行脚本将保存在宿主机上的SSL文件拷贝到宝塔每个网站对应的目录中。
创建过程
证书申请任务
如下图所示,填写自己要申请的域名,通知邮箱,添加域名验证方式,选择其他配置项等。其中,域名所有权推荐使用CNAME验证(推荐原因是操作方便,但是限于这种验证方式的实现原理,有可能不太稳定)。
填写相关信息,通过域名验证以后,就能成功创建自动化流水线了,然后就可以进一步编辑后续任务。
复制到本机
以下为自动化流水线的编辑方法:
创建一个主机-复制到本机
的流水线任务,填写相应的格式和路径。其中,路径的相对地址会存放在docker映射的目录下,即docker-compose.yaml
文件中映射的目录中。如果直接使用了官方推荐的默认配置,那么该任务会把生成的SSL证书文件存放在/data/certd
目录中。
执行远程主机脚本
创建后续任务主机-执行远程主机脚本
,添加相应的主机授权,然后添加相应的脚本。
对于宝塔搭建的网站来说,所有的网站的SSL证书都根据项目名称分别放在/www/server/panel/vhost/cert/
中。因此,可以通过脚本将生成的SSL文件拷贝到指定的目录中。根据宝塔中的文件命名,分别有两个文件fullchain.pem
和privkey.pem
。结合上一步骤中得到的文件名称和路径,我编写了以下的脚本用于最终SSL证书的部署,可以作为自己流水线的参考(注意执行脚本的用户授权的权限)。
#!/bin/bash
# 定义源目录
SOURCE_DIR="/data/certd/tmp"
# 定义目标目录数组
DEST_DIRS=(
"/www/server/panel/vhost/cert/a.example.com"
"/www/server/panel/vhost/cert/b.example.com"
"/www/server/panel/vhost/cert/c.example.com"
)
# 要拷贝的文件
FILES=("fullchain.pem" "privkey.pem")
# 循环遍历目标目录
for DEST_DIR in "${DEST_DIRS[@]}"; do
# 循环遍历要拷贝的文件
for FILE in "${FILES[@]}"; do
cp -f "$SOURCE_DIR/$FILE" "$DEST_DIR/"
done
done
至此,整个流水线已经创建完成。Certd项目支持手动出发任务来帮助你进行调试流水线是否有效,测试完毕后可以保存并启用流水线了。
Comments | NOTHING