DeveWork

借助云函数SCF实现Let’s Encrypt SSL证书自动更新

本站 DeveWork.com 是托管在腾讯云 CVM 的国内节点,并使用LNMP+ acme.sh 在本机进行 Let’s Encrypt SSL 证书自动更新。似乎是2021 年七八月份后因某堵墙的关系,脚本每次续签证书的时候总是各种网络异常导致失败。由此萌生了借助腾讯云云函数(SCF)并部署在国外地域来实现自动更新证书的想法。

背景介绍

驱动这个小项目的背景,大致有如下原因:

一、如前面一段所言,主要原因是使用的 CVM 国内节点各种网络异常导致经常更新失败。

二、Jeff 在腾讯云上有使用其它业务,如 CDN服务且需要绑定我的域名下的 HTTPS 证书,腾讯云提供的免费HTTPS 证书是子域名证书且有效期只有一年,好在其提供了 SSL 托管方案,可以通过相关 SDK 自行上传个人其它途径申请的证书。Let’s Encrypt SSL 证书虽然只有三个月,但通配符证书真香,且可以通过 ACME 协议去自动更新,工具自动化化后理论上可以永久续期且无需每年人工更换。

在这个背景下,我需要一个工具去实现相关工作且具备如下特点:

  1. 申请到的是免费的通配符证书。
  2. 一切应该是自动化的,无论是证书的申请与续期,还是上传到腾讯云并绑定相关业务。
  3. 程序应该部署在外国的网络节点下,减少网络干扰。

因此, ACME 协议下的Let’s Encrypt SSL 证书 + 部署到腾讯云云函数 是一个自然而然的方案了。

成果展示

这就是Jeff 开发的借助腾讯云云函数实现的 ACME Let’s Encrypt SSL 证书自动更新方案,已经托管到 Github 上:

https://github.com/Jeff2Ma/acme-qcloud-scf

功能概览

- 通过 ACME 协议 从 letsencrypt 生成免费的通配符证书。

- 程序部署在腾讯云·云函数(Serverless Cloud Function,SCF),定时运行更新证书。

- 证书生成后自动上传到腾讯云 SSL 托管平台并绑定到相关 CDN 加速域名。

- 服务端亦可一键更新 SSL 证书文件并重启 Nginx 等生效。

使用指引

新建云函数

腾讯云云函数管理后台 新建一个空白云函数。

根据个人需要命名,函数类型为**事件函数**,地域建议选择**海外**,运行环境为`Node.js 14+`。超时时间尽可能长。其余默认即可。

修改代码

`git clone` or 下载本项目代码,`npm i` 安装相关依赖。复制`config.example.js` 并重命名为 `config.custom.js`,根据实际情况改写相关配置项。

改写完毕后建议本地自测 `npm run start`,正常无误后上传到云函数中。

触发器

在腾讯云管理后台,点击云函数配置详情 - 触发管理,新建一个定时触发器并填写相关 crontab 命令。

自此程序基本部署完毕。另外如果在其它服务端(如 CVM 下需要借助 Nginx 应用证书生效到个人网站)需要使用,可以通过项目代码中的download-cert.js, download-cert.sh文件对相关路径进行改写。

更多使用方式请参考:https://github.com/Jeff2Ma/acme-qcloud-scf