群晖利用acme.sh自动申请证书并且自动重载证书的问题解决

前言
21年的时候写了一个在群晖(黑群晖)下利用acme.sh自动申请Let‘s Encrypt的脚本工具 群晖使用acme自动申请Let‘s Encrypt证书脚本,自动申请虽然解决了,但是自动重载一直是一个问题,本人也懒,一想到去跟踪重载过程就头大,所以就一直没有更新,每一次证书快过期了,就得手动登陆进去把全部证书的绑定替换两遍,因为在网页端手动更换绑定会触发证书重载的刷新,替换两次是因为第一次换成错的,第二次换成正确的绑定,仅此而已。
虽然拖了几年一直没跟踪这个自动化的实现过程,但是心里始终是有点东西没放下,今天终于解决了!当然解决这个问题的动因还是因为我的公司域名需要加入到以前的脚本当中,本来只是想把脚本做个优化,支持多个账户同时申请,想来想去,一不做二不休,还是一次性把自动重载的过程一起解决了!!!
原理
自动重载的过程分为这么几步:
- 1、重载使用ssl证书的
系统服务 - 2、重载
反向代理的ssl证书 - 3、重载
WebStation的ssl证书 - 4、特殊处理的系统服务
- 5、重载web服务
原理介绍
- 1、重载使用ssl证书的系统服务
必要的系统服务包括以下几项:
在INFO文件的绑定中,看到的service_map["DirectoryServer"]="pkgctl-DirectoryServer" service_map["MailServer"]="pkgctl-MailServer" service_map["ReverseProxy"]="nginx" service_map["SynologyDrive"]="pkgctl-SynologyDrive" service_map["WebDAVServer"]="pkgctl-WebDAVServer" service_map["WebStation"]="pkgctl-WebStation" service_map["smbftpd"]="ftpd"DirectoryServer服务名,真实调用需要使用的服务名称为pkgctl-DirectoryServer
重载的命令:
其他几项也是同样的,不过多介绍,特殊的服务有1个:/usr/syno/sbin/synoservice --reload "pkgctl-DirectoryServer"WebDAV,这个放到步骤四介绍 - 2、重载反向代理的ssl证书
反向代理的重载过程分为两步:-
2.1、拷贝证书到反向代理证书存放的目录
# 复制证书文件 cp -f "/usr/syno/etc/certificate/_archive/xxxxxx/cert.pem" "/usr/syno/etc/certificate/ReverseProxy/$uuid/cert.pem" cp -f "/usr/syno/etc/certificate/_archive/xxxxxx/privkey.pem" "/usr/syno/etc/certificate/ReverseProxy/$uuid/privkey.pem" cp -f "/usr/syno/etc/certificate/_archive/xxxxxx/fullchain.pem" "/usr/syno/etc/certificate/ReverseProxy/$uuid/fullchain.pem" -
2.2、调用反向代理的重载指令
/usr/libexec/certificate.d/ReverseProxy "$uuid"ps:
$uuid进入到/usr/syno/etc/certificate/ReverseProxy/目录下直接查看文件夹名称就是了,另外INFO的配置信息中也存在有$uuid
-
- 3、重载
WebStation的ssl证书-
3.1 拷贝证书文件到目录:
/usr/local/etc/certificate/WebStation/$uuid下cp -f "/usr/syno/etc/certificate/_archive/xxxxxx/cert.pem" "/usr/local/etc/certificate/WebStation/$uuid/cert.pem" cp -f "/usr/syno/etc/certificate/_archive/xxxxxx//privkey.pem" "/usr/local/etc/certificate/WebStation/$uuid/privkey.pem" cp -f "/usr/syno/etc/certificate/_archive/xxxxxx//fullchain.pem" "/usr/local/etc/certificate/WebStation/$uuid/fullchain.pem" -
3.2 重载
WebStation证书命令/usr/local/libexec/certificate.d/WebStation "$uuid"
vhost类型的$uuid和反向代理类型的$uuid区别就是以vhost_开头 -
- 4、特殊处理的系统服务
WebDAV是一个特殊的服务,和其他系统服务的重载方式不同,如下:/var/packages/WebDAVServer/target/scripts/synowebdavserver_httpd_control.sh stop sleep 2 /var/packages/WebDAVServer/target/scripts/synowebdavserver_httpd_control.sh start - 5、重载web服务
重启web服务,就看各位使用的是apache还是nginx了,我使用的nginx所以对于apache也没做测试和跟进,有需要的同学抛砖引玉,自行排查一下:/usr/syno/sbin/synoservice --reload nginx
脚本代码片段
大概过程就是如上几个步骤,有补充的同学请留言,下面是我的代码片段。这次我只放了片段出来,是因为我今天发现我的群晖上的wget不支持https了,就连curl也不能正确使用Tslv1.2库,本来想源码编译openssl库升级一下,结果发现我的设备能安装的gcc版本又太低,无奈之下我又拿golang写了个后端,放到另外一台机器上跑,完整的脚本代码需要配合后端运行,大概的逻辑是:
后端定时任务申请证书并保存且提供api给群晖下载证书 -> 群晖定时任务下载证书到本地 -> 自动部署并重载证书
因为临时抓起来的事情,后端功能仅限于自己使用,我担心安全意识薄弱的同学拿到自己的公网服务器上部署,那就完蛋了。我的部署都在局域网内,像这种不需要对公网开放的服务类项目,够用就行,所以暂时就不发全部的代码到帖子上了,下面这段代码,大家拿去和我21年那篇帖子的代码一结合,我相信就能解决单用户申请ssl证书的需求了。
如果大家强烈要求我发放完整代码的话,可以给我留言。
自动部署并重载ssl证书的代码片段
# 获取脚本所在目录的绝对路径
INFO_DIR="/usr/syno/etc/certificate/_archive"
INFO_FILE="/usr/syno/etc/certificate/_archive/INFO"# 重新加载证书
ReloadCerts() {echo "开始重新加载证书..."# 定义服务名称映射declare -A service_mapservice_map["DirectoryServer"]="pkgctl-DirectoryServer"service_map["MailServer"]="pkgctl-MailServer"service_map["ReverseProxy"]="nginx"service_map["SynologyDrive"]="pkgctl-SynologyDrive"service_map["WebDAVServer"]="pkgctl-WebDAVServer"service_map["WebStation"]="pkgctl-WebStation"service_map["smbftpd"]="ftpd"# 获取所有需要重载的服务名称services=$(jq -r '. as $root |[to_entries[] |select(.value.services != null) |.value.services[] |select(.service != null) |.subscriber] | unique[]' "$INFO_FILE")# 重载每个服务for service in $services; doif [ "${service_map[$service]}" != "" ]; thenactual_service="${service_map[$service]}"echo "重载服务: $service (${actual_service})"if [ -f "/usr/syno/sbin/synoservice" ]; then# 尝试重载服务/usr/syno/sbin/synoservice --reload "$actual_service" || {echo "尝试重启服务: $actual_service"/usr/syno/sbin/synoservice --restart "$actual_service"}# 如果是 nginx,给它一点时间完成重载if [ "$actual_service" = "nginx" ]; thensleep 2fifielseecho "跳过未知服务: $service"fidone# 更新并重载反向代理和 vhost 证书echo "开始处理反向代理和 vhost 证书..."# 从 INFO 文件中获取证书和服务的映射关系jq -r '. as $root |to_entries[] |select(.value.services != null) |.key as $cert_name |.value.services[] |select(.subscriber == "ReverseProxy" or .subscriber == "WebStation") |[$cert_name, .service, .subscriber] |@tsv' "$INFO_FILE" | while IFS=$'\t' read -r cert_name service_uuid subscriber; do# 跳过空值if [ -z "$cert_name" ] || [ -z "$service_uuid" ]; thencontinuefi# 源证书目录cert_dir="$INFO_DIR/$cert_name"if [[ "$service_uuid" == vhost_* ]] && [ "$subscriber" == "WebStation" ]; then# 处理 vhost 证书vhost_dir="/usr/local/etc/certificate/WebStation/$service_uuid"if [ -d "$cert_dir" ]; thenecho "更新 vhost 证书 $cert_name 到 UUID: $service_uuid"# 确保目标目录存在mkdir -p "$vhost_dir"# 复制证书文件cp -f "$cert_dir/cert.pem" "$vhost_dir/cert.pem"cp -f "$cert_dir/privkey.pem" "$vhost_dir/privkey.pem"cp -f "$cert_dir/fullchain.pem" "$vhost_dir/fullchain.pem"# 设置正确的权限chmod 400 "$vhost_dir"/*.pem# 重载 vhost 证书echo "重载 vhost 证书 UUID: $service_uuid"/usr/local/libexec/certificate.d/WebStation "$service_uuid"sleep 1fielif [ "$subscriber" == "ReverseProxy" ]; then# 处理反向代理证书proxy_dir="/usr/syno/etc/certificate/ReverseProxy/$service_uuid"if [ -d "$cert_dir" ] && [ -d "$proxy_dir" ]; thenecho "更新反向代理证书 $cert_name 到 UUID: $service_uuid"# 确保目标目录存在mkdir -p "$proxy_dir"# 复制证书文件cp -f "$cert_dir/cert.pem" "$proxy_dir/cert.pem"cp -f "$cert_dir/privkey.pem" "$proxy_dir/privkey.pem"cp -f "$cert_dir/fullchain.pem" "$proxy_dir/fullchain.pem"# 设置正确的权限chmod 400 "$proxy_dir"/*.pem# 重载反向代理证书echo "重载反向代理证书 UUID: $uuid"/usr/libexec/certificate.d/ReverseProxy "$uuid"sleep 1fifidone# 检查并重启 WebDAV 服务if [ -f "/var/packages/WebDAVServer/scripts/start-stop-status" ]; thenecho "检查 WebDAV 服务..."if /var/packages/WebDAVServer/scripts/start-stop-status status >/dev/null 2>&1; thenecho "重启 WebDAV 服务..."/var/packages/WebDAVServer/target/scripts/synowebdavserver_httpd_control.sh stopsleep 2/var/packages/WebDAVServer/target/scripts/synowebdavserver_httpd_control.sh startsleep 2if ! /var/packages/WebDAVServer/scripts/start-stop-status status >/dev/null 2>&1; thenecho "警告:WebDAV 服务可能未正确启动"elseecho "WebDAV 服务已成功重启"fielseecho "WebDAV 服务未运行,跳过重启"fifi# 最后再次重载 nginx 以确保所有更改生效if [ -f "/usr/syno/sbin/synoservice" ]; thenecho "最后重载 nginx 服务..."/usr/syno/sbin/synoservice --reload nginxfiecho "证书重新加载完成"return 0
}case "$1" in *)ReloadCerts;;
esac相关文章:
群晖利用acme.sh自动申请证书并且自动重载证书的问题解决
前言 21年的时候写了一个在群晖(黑群晖)下利用acme.sh自动申请Let‘s Encrypt的脚本工具 群晖使用acme自动申请Let‘s Encrypt证书脚本,自动申请虽然解决了,但是自动重载一直是一个问题,本人也懒,一想到去…...
质量小议51 - 茧房
茧房:茧房是指蚕茧所建的住所或空间,由一个蚕丝囊完全包裹住的一个密封的空间。 -- CSDN创作助手 信息茧房 - 指通过互联网和数字技术,将个人封闭在一个虚拟的信息环境中,使其只接收来自特定渠道的信息,而屏蔽其他信息…...
【C++图论】2359. 找到离给定两个节点最近的节点|1714
本文涉及知识点 C图论 打开打包代码的方法兼述单元测试 LeetCode2359. 找到离给定两个节点最近的节点 给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,每个节点 至多 有一条出边。 有向图用大小为 n 下标从 0 开始的数组 edges 表示,…...
重拾设计模式-外观模式和适配器模式的异同
文章目录 目的不同适配器模式:外观模式: 结构和实现方式不同适配器模式:外观模式: 对客户端的影响不同适配器模式:外观模式: 目的不同 适配器模式: 主要目的是解决两个接口不兼容的问题&#…...
51c自动驾驶~合集42
我自己的原文哦~ https://blog.51cto.com/whaosoft/12888355 #DriveMM 六大数据集全部SOTA!最新DriveMM:自动驾驶一体化多模态大模型(美团&中山大学) 近年来,视觉-语言数据和模型在自动驾驶领域引起了广泛关注…...
34 Opencv 自定义角点检测
文章目录 cornerEigenValsAndVecscornerMinEigenVal示例 cornerEigenValsAndVecs void cornerEigenValsAndVecs(InputArray src, --单通道输入8位或浮点图像OutputArray dst, --输出图像,同源图像或CV_32FC(6)int blockSize, --邻域大小值int ape…...
信创技术栈发展现状与展望:机遇与挑战并存
一、引言 在信息技术应用创新(信创)战略稳步推进的大背景下,我国信创技术栈已然在诸多关键层面收获了亮眼成果,不过也无可避免地遭遇了一系列亟待攻克的挑战。信创产业作为我国达成信息技术自主可控这一目标的关键一招,…...
跟我学c++中级篇——C++中的缓存利用
一、缓存 学习过计算机知识的一般都知道缓存这个概念,大约也知道缓存是什么。但是如果是程序员,如何更好的利用缓存,可能就有很多人不太清楚了。其实缓存的目的非常简单,就是了更高效的操作数据。大家都听说过“局部性原理”&…...
二叉树_堆
目录 一. 树(非线性结构) 1.1 树的概念与结构 1.2 树的表示 二. 二叉树 2.1 二叉树的概念与结构 2.2 特殊的二叉树 2.3 二叉树的存储结构 三. 实现顺序结构的二叉树 3.1 堆的概念与结构 一. 树(非线性结构) 1.1 树的概念与结构 概念ÿ…...
word文档中有大量空白行删除不掉,怎么办?
现象: 分页之间的空白行太多了( 按回车没用。删除也删除不掉 ) 解决办法: 按ctrl a 全选这个文档右击鼠标,点击【段落】选择【换行和分页】,然后把【分页】里的选项全部勾掉,然后点击【确定】…...
python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django
windows首先安装rabbitmq 点击参考安装 1、环境介绍 Python 3.10.16 其他通过pip安装的版本(Django、pika、celery这几个必须要有最好版本一致) amqp 5.3.1 asgiref 3.8.1 async-timeout 5.0.1 billiard 4.2.1 celery 5.4.0 …...
构建高性能异步任务引擎:FastAPI + Celery + Redis
在现代应用开发中,异步任务处理是一个常见的需求。无论是数据处理、图像生成,还是复杂的计算任务,异步执行都能显著提升系统的响应速度和吞吐量。今天,我们将通过一个实际项目,探索如何使用 FastAPI、Celery 和 Redis …...
永磁同步电机无速度算法--全阶滑模观测器
一、原理介绍 在采用传统滑模观测器求取电机角度时通常存在系统抖振、低通滤波器导致角度相位滞后、角度的求取等问题。针对上述问题,本文采用全阶滑模观测器,该全阶滑模观测器具有二阶低通滤波器的特性,能有效滤除反电动势中的高频噪声&…...
部署开源大模型的硬件配置全面指南
目录 第一章:理解大型模型的硬件需求 1.1 模型部署需求分析 第二章:GPU资源平台 2.1 免费GPU资源 2.1.1 阿里云人工智能PAI 2.1.2 阿里天池实验室 2.1.3 Kaggle 2.1.4 Google Colab 2.2 付费GPU服务 2.2.1 AutoDL 2.2.2 Gpushare Cloud 2.2.3 Featurize 2.2.4 A…...
三、使用langchain搭建RAG:金融问答机器人--检索增强生成
经过前面2节数据准备后,现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…...
Day13 用Excel表体验梯度下降法
Day13 用Excel表体验梯度下降法 用所学公式创建Excel表 用Excel表体验梯度下降法 详见本Day文章顶部附带资源里的Excel表《梯度下降法》,可以对照表里的单元格公式进行理解,还可以多尝试几次不同的学习率 η \eta η来感受,只需要更改学习率…...
计算机组成原理的学习笔记(5)--数据的表示与运算·其四 浮点数的储存和加减/内存对齐/大端小端
学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记,仅用于学习交流。 1. 浮点数的表示与运算 规格化数: 浮点数的存储格式为 ,其中: 为符号位。 为尾数,通常在0和1之间(规格化形式为1.xx…...
华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动
华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…...
如何使用 Flask 框架创建简单的 Web 应用?
Flask是一个轻量级的Web应用框架,用Python编写,非常适合快速开发和原型设计。 它提供了必要的工具和技术来构建一个Web应用,同时保持核心简单,不强制使用特定的工具或库。 二、创建第一个Flask应用 安装Flask 首先,…...
将Minio设置为Django的默认Storage(django-storages)
这里写自定义目录标题 前置说明静态文件收集静态文件 使用django-storages来使Django集成Minio安装依赖settings.py测试收集静态文件测试媒体文件 前置说明 静态文件 Django默认的Storage是本地,项目中的CSS、图片、JS都是静态文件。一般会将静态文件放到一个单独…...
行波管(TWT)核心参数权衡:填充比、流通率与电子注效率的物理本质及工程设计
在行波管(TWT)设计中,填充比(F)、流通率(ηₜᵣₐₙₛ)与电子注效率(ηₑ)是决定器件性能的三大核心参数,三者并非独立存在,而是形成了紧密的物理…...
March7thAssistant:崩坏:星穹铁道企业级自动化解决方案
March7thAssistant:崩坏:星穹铁道企业级自动化解决方案 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 【核心价值定位】游戏工作室效率倍增引…...
AutoHotkey脚本编译指南:3步将.ahk文件转为独立可执行程序
AutoHotkey脚本编译指南:3步将.ahk文件转为独立可执行程序 【免费下载链接】Ahk2Exe Official AutoHotkey script compiler - written itself in AutoHotkey 项目地址: https://gitcode.com/gh_mirrors/ah/Ahk2Exe 你是否曾想过将精心编写的AutoHotkey自动化…...
腾讯VersaViT:多模态视觉理解新标杆
腾讯VersaViT:多模态视觉理解新标杆 【免费下载链接】VersaViT 项目地址: https://ai.gitcode.com/tencent_hunyuan/VersaViT 导语:腾讯最新发布的多模态视觉编码器VersaViT,通过创新的多任务协同训练策略,同时强化语言介…...
【数据结构】数组与特殊矩阵
数据结构的学习中,数组与特殊矩阵是基础且核心的内容。它们不仅是程序设计中最常用的线性结构,更是处理复杂矩阵运算的基础。本文将结合解析与真题,带你彻底搞懂数组的存储方式和特殊矩阵的压缩存储技巧。一、一维数组与二维数组:…...
Google 地图事件:探索、挑战与未来展望
Google 地图事件:探索、挑战与未来展望 引言 Google 地图作为全球最受欢迎的地图服务之一,自2005年推出以来,已经深入到人们生活的方方面面。然而,在这段时间里,Google 地图也经历了一系列事件,包括技术挑战、政策争议以及市场竞争等。本文将围绕这些事件,对 Google 地…...
ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程
ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程 刚接触ArchLinux的新手们,面对命令行界面时总会有些手足无措。特别是当需要输入中文时,如何配置一个既美观又实用的输入法成了许多人的第一个挑战。Fcitx5作…...
MSPM0G3507开发实战:从零搭建Keil工程与SysConfig配置详解
1. 开发环境准备与SDK文件结构解析 第一次接触MSPM0G3507开发板时,我花了整整两天时间才搞明白SDK文件该怎么用。这里分享我的踩坑经验,帮你省下这些时间。首先确认你的开发环境已经安装以下组件: Keil MDK:建议使用5.33版本&…...
Phi-4-mini-reasoning实操手册:针对数学题优化的token长度设置技巧
Phi-4-mini-reasoning实操手册:针对数学题优化的token长度设置技巧 1. 模型特点与适用场景 Phi-4-mini-reasoning是一个专为推理任务优化的文本生成模型,特别适合处理需要多步分析的数学题和逻辑题。与通用聊天模型不同,它被设计为直接输出…...
SMUDebugTool核心功能全解析:从故障排查到性能优化
SMUDebugTool核心功能全解析:从故障排查到性能优化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitco…...
