本地证书腾讯云托管及 CDN 同步部署

一个 Node 脚本插件,用于将个人证书上传到腾讯云进行托管,并自动根据证书信息同步至 CDN 使用。

一、背景

自谷歌推动缩短证书有效期后,证书部署变得频繁且必不可少。当时,社区上尚没有成熟的项目可用,我便通过腾讯云 API 简单实现了一个证书推送方案,用于推送证书到 CDN 域名,大致逻辑如下:

  • 服务器面板申请证书
  • 证书同步推送至本地文件
  • 设置计划任务定时扫描文件变动
  • 读取证书内容并推送至 CDN 相关字段

虽然这个方法非常简单粗暴,但确实解决了问题。然而,不知从何时起,新上传的证书被托管到 SSL 证书模块中。本来这没什么,可托管的证书会在临期时发送过期提醒,邮件、短信、微信通知等满天飞。不仅如此,直接上传证书内容至 CDN ,还会导致在多次提交时对单个证书以多个 ID 同时存储托管。

与此同时,社区中已经有了一些成熟的开源 SSL 证书管理项目,不仅支持腾讯云 CDN,还能支持更多服务商和部署位置,所以便打算尝试使用这些成熟的工具来替代原有部署方式。首先尝试了 certd/certd,实话说这确实是一个非常成熟且商业化的项目,它支持证书的部署和删除功能。只是可惜删除功能收费,而且它过于商业化的设计让我有点点不喜欢它的气质。接下来,便是关注到 usual2970/certimate 项目。与 certd 相比,certimate 的设计更为简洁,功能也比较完善,从个人角度来说,我更倾向于选择这个工具。

然而,certimate 目前尚不支持删除过期证书,无法根本满足我的需求。事已至此,鉴于我只需要处理腾讯云 CDN 这一个部署位置,所以最终还是决定尝试改进现有的脚本吧。

由于 1Panel 目前支持申请证书后自动执行脚本,所以定时任务可以省略。在原方案中为了描述证书与分发域名的联系,定义了一个domain.json文件,手动指定两者关联,这显然不够优雅。改进方案是:解析证书内容,读取出证书的可选名称,自动匹配符合的 CDN 域名进行部署。除此之外,新增如下功能:在解析证书时校验证书是否过期、避免将重复证书上传到腾讯云、在删除证书时避免删除有效期更久的托管证书等。

二、项目

项目地址

说明文档

1. 项目简介

本项目是一个基于 Node.js 的工具,旨在简化腾讯云 SSL 证书和 CDN 域名配置的管理。

  • 上传本地证书:将本地 SSL 证书上传至腾讯云进行托管(禁用过期证书上传)。
  • 更新 CDN 配置:根据证书主题和可选名称信息,自动将托管证书应用到对应域名。
  • 支持泛域名证书识别:自动识别并更新所有符合层级的 CDN 域名。
  • 清理旧证书:自动识别并删除与当前证书主题相同的重复或过期旧证书。

2. 处理流程

3. 安装步骤

  1. 克隆仓库

    git clone https://github.com/inkss/tencentcloud-cdn-cert-manager.git
    cd tencentcloud-cdn-cert-manager
  2. 安装依赖
    确保已安装 Node.js(版本 ≥ 14.0.0),然后执行:

    npm install

4. 使用指南

4.1 前期准备
  1. 证书文件
    • 准备好 fullchain.pem(证书文件)和 privkey.pem(密钥文件)。
  2. 腾讯云密钥
    • 在腾讯云控制台的 API 密钥管理 页面获取 SecretIdSecretKey
    • 确保账户具备 SSL 和 CDN 操作权限。
4.2 环境变量

可通过环境变量配置,或在项目根目录创建 .env 文件:

.env
# 腾讯云配置
TENCENT_SECRET_ID=您的 SecretId
TENCENT_SECRET_KEY=您的 SecretKey
4.3 运行脚本
  1. 基本用法

    node ./main.js ./cert
    • ./cert 为包含 fullchain.pemprivkey.pem 的目录。
    • 未指定路径时,默认使用当前工作(执行)目录。
  2. 配合 1Panel 使用

    • 启用【推送证书到本地目录】。
    • 启用【申请证书后执行脚本】,脚本示例:
      node /opt/apps/tencentcloud-cdn-cert-manager/main.js
    • 1Panel 示例:
      配置示例
  3. 示例输出

    证书解析成功:{
    主题:example.com
    可选名称: example.com, *.example.com
    指纹: B60B45C0D9759F184CAF64DD2A68EDFB2CBD12A2
    过期时间:May 16 08:13:44 2025 GMT
    剩余日期:66
    }
    上传新证书,ID: XXXXXXX1
    域名 [example.com] 更新成功
    域名 [web.example.com] 更新成功
    删除旧证书: XXXXXXX2 (主题: example.com)

5. 注意事项

  • 若证书解析并上传成功,程序将依据证书中允许的域名信息,自动更新对应 CDN 域名的 HTTPS 证书配置。
  • 对于泛域名证书,程序会自动调整所有符合匹配规则的 CDN 域名,即便这些域名当前使用的证书有效期更长。
  • 请再次注意,在更新 CDN 配置时,程序不会检查原证书文件与新证书文件的时间差,而是直接进行覆盖。
  • 唯一值得欣慰的是(😀),在删除旧证书时,程序绝不会移除有效期晚于新证书的证书。
  • 此外,程序仅处理来源为 上传证书 的证书,确保操作范围可控。

评论