一个 Node 脚本插件,用于将个人证书上传到腾讯云进行托管,并自动根据证书信息同步至 CDN 使用。
一、背景
自谷歌推动缩短证书有效期后,证书部署变得频繁且必不可少。当时,社区上尚没有成熟的项目可用,我便通过腾讯云 API 简单实现了一个证书推送方案,用于推送证书到 CDN 域名,大致逻辑如下:
- 服务器面板申请证书
- 证书同步推送至本地文件
- 设置计划任务定时扫描文件变动
- 读取证书内容并推送至 CDN 相关字段
虽然这个方法非常简单粗暴,但确实解决了问题。然而,不知从何时起,新上传的证书被托管到 SSL 证书模块中。本来这没什么,可托管的证书会在临期时发送过期提醒,邮件、短信、微信通知等满天飞。不仅如此,直接上传证书内容至 CDN ,还会导致在多次提交时对单个证书以多个 ID 同时存储托管。
与此同时,社区中已经有了一些成熟的开源 SSL 证书管理项目,不仅支持腾讯云 CDN,还能支持更多服务商和部署位置,所以便打算尝试使用这些成熟的工具来替代原有部署方式。首先尝试了 certd/certd,实话说这确实是一个非常成熟且商业化的项目,它支持证书的部署和删除功能。只是可惜删除功能收费,而且它过于商业化的设计让我有点点不喜欢它的气质。接下来,便是关注到 usual2970/certimate 项目。与 certd 相比,certimate 的设计更为简洁,功能也比较完善,从个人角度来说,我更倾向于选择这个工具。
然而,certimate 目前尚不支持删除过期证书,无法根本满足我的需求。事已至此,鉴于我只需要处理腾讯云 CDN 这一个部署位置,所以最终还是决定尝试改进现有的脚本吧。
由于 1Panel 目前支持申请证书后自动执行脚本,所以定时任务可以省略。在原方案中为了描述证书与分发域名的联系,定义了一个domain.json
文件,手动指定两者关联,这显然不够优雅。改进方案是:解析证书内容,读取出证书的可选名称,自动匹配符合的 CDN 域名进行部署。除此之外,新增如下功能:在解析证书时校验证书是否过期、避免将重复证书上传到腾讯云、在删除证书时避免删除有效期更久的托管证书等。
二、项目
2.1 项目地址
2.2 说明文档
项目简介
功能列表
- 上传本地证书:将本地 SSL 证书上传至腾讯云进行托管(禁用过期证书上传)。
- 更新 CDN 配置:根据证书 CN 和 SAN,自动将托管证书应用到对应域名。
- 支持泛域名证书识别:自动识别并更新所有符合层级的 CDN 域名。
- 清理旧证书:自动识别并删除与当前证书 CN/SAN 相同的重复或过期旧证书。
名词解释
- CN(Common Name)—— 通用名称/主域名
- SAN(Subject Alternative Name)—— 主题备用名称/其它域名
Let’s Encrypt
Let’s Encrypt 是一家提供免费 SSL/TLS 证书的认证机构,支持包括泛域名证书在内的多种证书类型。其颁发的单张证书最多可包含 100 个 Subject Alternative Name(SAN)条目,可覆盖多个子域名或服务节点,非常适用于自动化部署及多域场景的安全通信需求。
处理流程
安装步骤
克隆仓库:
git clone https://github.com/inkss/tencentcloud-cdn-cert-manager.git
cd tencentcloud-cdn-cert-manager安装依赖:
确保已安装 Node.js(版本 ≥ 14.0.0),然后执行:npm install
使用指南
前期准备
证书文件
- 准备好 SSL 证书文件(
fullchain.pem
)和密钥文件(privkey.pem
)。 - 可根据实际文件命名,手动修改 main.js 中的
CERT
与KEY
定义。
腾讯云密钥
- 访问腾讯云控制台的 API 密钥管理 页面,获取
SecretId
与SecretKey
。 - 确保当前账户拥有 SSL 与 CDN 管理权限。
配置环境变量
配置方式支持通过环境变量进行设置,变量命名需与 .env 文件中的格式保持一致。您也可以在项目根目录下创建一个 .env 文件,并填入以下内容:
TENCENT_SECRET_ID=您的 SecretId |
运行脚本
基本用法:
假设项目路径为:
/opt/apps/ssl/main/main.js
,证书文件存储路径为:/opt/apps/ssl/normal/
。node /opt/apps/ssl/main/main.js /opt/apps/ssl/normal/
/opt/apps/ssl/normal/
为包含证书和密钥文件的目录。- 未指定路径时,默认使用当前工作目录。
配合 1Panel 使用:
- 启用【推送证书到本地目录】。
- 启用【申请证书后执行脚本】,脚本示例:
node /opt/apps/tencentcloud-cdn-cert-manager/main.js
- 1Panel 示例:
示例输出:
证书解析成功:{
主题:a.com
可选名称:*.a.com,*.b.cn,*.v.6.c.net,a.com,b.cn
指纹: 0F41DC439B85937289D4E28844F7EBB1C21D807B
过期时间: Oct 9 14:09:56 2025 GMT
剩余日期:89
}
找到匹配证书 - ID: PkSRMMyC
域名 [a.com] 证书更新成功
域名 [b.cn] 证书更新成功
域名 [1.b.cn] 证书更新成功
域名 [2.v.6.c.net] 证书更新成功
域名 [3.b.cn] 证书更新成功
域名 [4.b.cn] 证书更新成功
当前证书有效至 2025-10-09 22:09:56,未发现需要删除的旧证书。
注意事项
- 证书解析并上传成功后,程序将根据证书中包含的 SAN 信息,自动更新对应 CDN 域名的 HTTPS 配置。
- 对于泛域名证书,即使域名当前使用的证书有效期更长,程序也会自动更新所有符合规则的加速域名。
- 请注意,程序在更新 CDN 配置时不会比较原证书与新证书的有效期差异,而是直接覆盖。
- 唯一值得欣慰的是(😀),在清理旧证书时,程序不会删除任何有效期晚于新证书的版本。
- 此外,为保证操作可控,程序仅处理来源为 上传证书 的证书记录。
枋柚梓的猫会发光 评论政策
请在评论前阅读我们的评论政策。