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

在这里插入图片描述

前言

21年的时候写了一个在群晖(黑群晖)下利用acme.sh自动申请Let‘s Encrypt的脚本工具 群晖使用acme自动申请Let‘s Encrypt证书脚本,自动申请虽然解决了,但是自动重载一直是一个问题,本人也懒,一想到去跟踪重载过程就头大,所以就一直没有更新,每一次证书快过期了,就得手动登陆进去把全部证书的绑定替换两遍,因为在网页端手动更换绑定会触发证书重载的刷新,替换两次是因为第一次换成错的,第二次换成正确的绑定,仅此而已。

虽然拖了几年一直没跟踪这个自动化的实现过程,但是心里始终是有点东西没放下,今天终于解决了!当然解决这个问题的动因还是因为我的公司域名需要加入到以前的脚本当中,本来只是想把脚本做个优化,支持多个账户同时申请,想来想去,一不做二不休,还是一次性把自动重载的过程一起解决了!!!

原理

自动重载的过程分为这么几步:

  • 1、重载使用ssl证书的系统服务
  • 2、重载反向代理的ssl证书
  • 3、重载WebStation的ssl证书
  • 4、特殊处理的系统服务
  • 5、重载web服务

原理介绍

  • 1、重载使用ssl证书的系统服务
    必要的系统服务包括以下几项:
    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"
    
    在INFO文件的绑定中,看到的DirectoryServer 服务名,真实调用需要使用的服务名称为pkgctl-DirectoryServer
    重载的命令:
    /usr/syno/sbin/synoservice --reload "pkgctl-DirectoryServer"
    
    其他几项也是同样的,不过多介绍,特殊的服务有1个: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"
      
    ps: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

raid 状态查看 storcli64

场景 当磁盘报错的时候使用该命令排查 fdisk -l /dev/sdb fdisk: cannot open /dev/sdb: Input/output error进一步使用 smartctl 排查 smartctl -a /dev/sdb 输出 smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-144-generic] (local build) Copyright (C) 2002-19, B…

《探索PyTorch计算机视觉:原理、应用与实践》

一、PyTorch 与计算机视觉的奇妙相遇 在当今数字化的时代,计算机视觉作为一门能够赋予机器 “看” 的能力的技术,正以前所未有的速度蓬勃发展,深刻地改变着我们的生活和众多行业的运作模式。从智能手机中的人脸识别解锁,到安防监控…

使用VSCode Debugger 调试 React项目

一般我们调试代码时,用的最多的应该就是console.log方式了,还有的是使用Chrome DevTools 通过在对应的 sourcemap代码位置打断点进行调试,除了上面两种方式外还有一种更好用的调试方式: VSCode Debugger。 VSCode Debugger可以直…

mapbox基础,加载mapbox官方地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象…

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

手机投屏轻松实现手机与汽车的无缝连接,导航、音乐、通话等功能应有尽有,还支持更多第三方应用,让车载互联生活更加丰富多彩。 HiCar在兼容性和开放性上更具优势。 手机投屏可以说是车机的杀手级应用,大大拓宽了车机的可用性范围。其中华为推出的HiCar就是非常好用的一种。…

Elasticsearch:确保业务规则与语义搜索无缝协作

作者:来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读: Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则(query ru…

把riscv32位系统弄懂1:riscv32 CPU指令学习

Riscv手册 首先下载手册:文件下载----中国开放指令生态(RISC-V)联盟 从这个页面下载riscv-spec-v2.1中文版 也可以下载中科大的这本:RISC-V手册 Riscv32指令集包括基础指令集和一些扩展指令集,比如在ESP32C3技术手册中,写到E…

全国消费水平系统|Java|SSM|JSP|

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

达梦数据库-读写分离集群部署

读写分离集群部署 读写分离集群由一个主库以及一个或者多个(最多可以配置 8 个)实时备库组成,基于实时归档实现的高性能数据库集群,不但提供数据保护、容灾等数据守护基本功能,还具有读写操作自动分离、负载均衡等特性。同时可以配置确认监视…

【ALGC】探秘 ALGC—— 卓越数据处理能力的科技瑰宝

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在大数据时代,如何高效地处理和分析海量数据是一个核心挑战。ALGC(Advanced Learning and Generalized Comp…

docker仓库用户认证

保证实验环境纯净删除启动的docker 1.安装建立认证文件的工具包 [rootlocalhost ~]# yum install httpd-tools -y 2.创建目录存放认证文件 [rootlocalhost ~]# mkdir auth [rootlocalhost ~]# htpasswd -Bc auth/.htpasswd lee #-B 强制使用最安全加密方式,默认用m…

(OCPP服务器)SteVe编译搭建全过程

注意:建议使用3.6.0,我升级到3.7.1,并没有多什么新功能,反而电表的实时数据只能看到累计电能了,我回退了就正常,数据库是兼容的,java版本换位java11,其他不变就好 背景:…

【IMU:视觉惯性SLAM系统】

视觉惯性SLAM系统简介 相机(单目/双目/RGBD)与IMU结合起来就是视觉惯性,通常以单目/双目IMU为主。 IMU里面有个小芯片可以测量角速度与加速度,可分为6轴(6个自由度)和9轴(9个自由度)IMU,具体的关于IMU的介…

Linux 基本使用和程序部署

1. Linux 环境搭建 1.1 环境搭建方式 主要有 4 种: 直接安装在物理机上。但是Linux桌面使用起来非常不友好,所以不建议。[不推荐]。使用虚拟机软件,将Linux搭建在虚拟机上。但是由于当前的虚拟机软件(如VMWare之类的)存在一些bug&#xff…

c++------------------函数

函数定义 语法格式 函数定义包括函数头和函数体。函数头包含返回类型、函数名和参数列表。函数体是用花括号{}括起来的代码块,用于实现函数的功能。例如,定义一个计算两个整数之和的函数: int add(int a, int b) {return a b; }这里int是返回…

如何在centos系统上挂载U盘

在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…

不同路径

不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&#xff…

C++打造局域网聊天室第十课: 客户端编程及数据发送

文章目录 前言一、补充内容,设置显示框换行二、客户端编程三、封装消息发送函数四、所处的身份状态总结 前言 C打造局域网聊天室第十课: 客户端编程及数据发送 一、补充内容,设置显示框换行 编辑框的显示内容默认是不会换行的,这…

理解神经网络

神经网络是一种模拟人类大脑工作方式的计算模型,是深度学习和机器学习领域的基础。 基本原理 神经网络的基本原理是模拟人脑神经系统的功能,通过多个节点(也叫神经元)的连接和计算,实现非线性模型的组合和输出。每个…

记Fastjson2的一个报ConcurrentModificationException的bug

错误背景:fastjson2的parseObject方法,在spring webflux项目中被调用,有时会报java.util.ConcurrentModificationException错误。报错处的代码如下图: 改了半天与并发安全相关的代码,还是会报此错误。后来改变思路搜…