Synology 群晖
DSM 群晖
Redpill 引导
自编译DSM引导(弃用)
常见问题
黑群晖安装
蜗牛星际_群晖(DSM)
黑群晖多网口识别
多网口做交换机
半洗白
群晖重置
Synology SN 算号
自动获取 SataPortMap 和 DiskIdxMap
群晖-修复CPU显示型号
群晖-固态硬盘支持
群晖-更新hosts
HTTPS
动态IP域名解析
CloudFlare动态DDNS
家庭影院
WebDAV使用
VPN接入
udevd进程内存使用过大
Tailscale(内网穿透)
Windows 网络不显示
内网其他设备穿透
多群晖同步
群晖管理服务
ipkg(软件包管理)
各类共享访问协议
邮箱提醒
防火墙
ACME(自动颁发和续订SSL证书)
挂载远程共享
群晖-修复视频转码
反向代理(Nginx)
常用命令
群晖套件
Moments视频缩略图
相册整合
相册-人脸识别
Plex 媒体服务器
视频支持 DTS 和 eac3
Transmission下载器
文件编辑器
Mail服务
手游服务器
安装套件
Git
NPS-内网穿透
MariaDB
Typecho(博客)
Synology Drive-数据备份
Synology Drive-微信备份
Active Backup(备份)
Active Backup for Business(备份)-套件激活
iSCSI(仿真磁盘)
Advanced Media Extensions-激活
Surveillance Station(监控)
Virtual Machine Manager
Docker 群晖
Aria2 下载器
ZeroTier(局域组网)
Docker更换安装位置
安装iKuai
黑群晖救砖
群晖其他项目
本文档使用 MrDoc 发布
-
+
首页
ACME(自动颁发和续订SSL证书)
[acme](https://github.com/acmesh-official/acme.sh) 是自动颁发和续订免费证书的 shell 脚本 基于 [Linux-acme(SSL证书脚本)](https://nas.918178.xyz:10086/doc/508/) 二封 相关链接: --- - Wiki:https://github.com/acmesh-official/acme.sh/wiki - GitHub:https://github.com/acmesh-official/acme.sh - Docker:https://hub.docker.com/r/neilpang/acme.sh - Docker使用教程:https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker - CloudFlare API:https://dash.cloudflare.com/profile/api-tokens - 使用 acme.sh 的 Synology NAS 的 HTTPS 证书:https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide ## ACME 部署 ```bash git clone https://git.918178.xyz/https://github.com/acmesh-official/acme.sh.git && cd acme.sh # 拉取最新并进入项目目录 ./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "ai773203918@qq.com" # 安装 ACME # --------------------- CloudFlare 认证 --------------------- # 下列 CloudFlare 认证方式仍挑其一即可 # 使用 邮箱 + CloudFlare API 令牌 方式认证 export CF_Email="ai773203918@qq.com" # CloudFlare API 令牌 export CF_Token="123" # CloudFlare API 令牌 # # 使用 账户 ID + CloudFlare API 令牌 方式认证 # CF_Account_ID="xxxxxxxxxxxxx" # 帐户 ID # CF_Token="xxxxxxxxxx" # CloudFlare API 令牌 # CF_Zone_ID="xxxxxxxxxxxxx" # 可选,区域 ID,单区域时需要 # # 使用 Global API Key(全局API密钥) 方式认证,不推荐比较危险 # CF_Email="ai773203918@qq.com" # CloudFlare API 令牌 # CF_Key="xxxxx" # Global API Key(全局API密钥) /usr/local/share/acme.sh/acme.sh --issue --dns dns_cf -d "918178.xyz" # 颁布证书(--force 强制) /usr/local/share/acme.sh/acme.sh --deploy -d "918178.xyz" --deploy-hook synology_dsm # 部署证书到 Synology /usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh/ # 证书续订(--force 强制) /usr/local/share/acme.sh/acme.sh --force --upgrade --nocron --home /usr/local/share/acme.sh # 修复/更新环境 /usr/local/share/acme.sh/acme.sh --set-default-ca --server letsencrypt # 修改默认 CA 为 letsencrypt,默认为 zerossl # 群晖后期更新脚本 /usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh/ > /volume1/nas/ACME.log 2>&1 # 有些服务需要把证书复制到所需文件夹下(注意不同版本证书文件位置不同) cp /usr/local/share/acme.sh/\*.918178.xyz*/* /volume1/nas/domain ``` ## ACME_Docker.sh 这个主要是 更新证书,把证书覆盖到docker容器证书的对应位置,然后重启容器 会对当前最新证书的哈希值和项目上次更新暂存的哈希值进行比对,若不一致才会更新证书和重启容器,尽可能保证不影响服务 ```bash #!/bin/bash # ========================= 相关变量(自行修改) ========================= ACME_HOME=/usr/local/share/acme.sh # acme.sh的安装目录 LOG_FILE=/volume1/nas/ACME_Docker.log # 日志文件路径 MODE=-u # -u 仅覆盖更新过的文件,不覆盖已存在的文件;不加则直接覆盖 # ========================= WxPusher 配置(自行修改) ========================= API_URL=https://wxpusher.zjiecode.com/api/send/message # wxpusher的API地址 APPTOKEN=AT_xxx # 应用的 AppToken UIDS=[\"UID_xxx\"] # 发送目标的UID(引号要转义,多个使用,隔开) SUMMARY="ACME 证书更新_Nas" # 通知标题 # ========================= 杂项(无需修改)========================= MODE=${MODE:-} # 判断是否设置了 MODE 变量,若未设置则自动补空,防止没定义变量导致错误 echo "====== 开始尝试更新证书♻️ ======" > $LOG_FILE # 执行acme.sh --cron 命令更新证书,并重定向输出到日志文件 $ACME_HOME/acme.sh --cron --home $ACME_HOME >> $LOG_FILE 2>&1 echo "" >> $LOG_FILE # ========================= 更新证书函数(无需修改) ========================= # 更新证书函数,用于检查证书是否更新,更新则覆盖,并完成对应容器重启 echo "====== 开始更新各项目证书♻️ ======" >> $LOG_FILE # update_certificate {容器名称} {覆盖证书路径} {ACME 证书路径} function update_certificate() { DOCKER_NAME=$1 # 容器名称 CERT_PATH=$2 # 覆盖证书路径 ACME_PATH=$3 # ACME 证书路径(因为通配符可能会匹配到多个路径故作为最后一个参数导入) ACME_HASH=$ACME_PATH/fullchain.cer # ACME 证书路径下的 fullchain.cer 文件 CERT_HASH=$CERT_PATH/fullchain.hash # 覆盖证书路径下的 fullchain.hash 文件 # 获取当前证书哈希值和各项目证书记录的哈希值 # ========================================================================== # 若使用通配符会包含多个,一般更新都会一起更新,所以这里只计算第一个,并作为更新标志 NEW_HASH=$(md5sum $ACME_HASH | head -n 1 | awk '{print $1}') # 计算证书哈希值 # 读取已有的哈希值,若无文件直接返回空 if [ -f $CERT_HASH ]; then OLD_HASH=$(cat $CERT_HASH) else OLD_HASH="" fi # ========================= 哈希值判断(无需修改) ========================= # 通过哈希值判断证书是否更新,若更新则覆盖并重启容器并写入哈希值,若未更新则不做任何操作 if [ "$NEW_HASH" == "$OLD_HASH" ]; then # 哈希值相同,输出未更新提示 echo "==== $DOCKER_NAME 证书未更新⚠️ ====" >> $LOG_FILE echo "跳过后续操作..." >> $LOG_FILE echo "" >> $LOG_FILE else # 哈希值不同,输出已更新提示并把新的哈希值写入到 fullchain.hash echo "==== $DOCKER_NAME 证书已更新✔️ ====" >> $LOG_FILE # 复制证书文件到相应的目录(-u 表示仅复制更新过的文件),并把复制输出的追加到日志文件 echo "复制最新证书文件到 $CERT_PATH" >> $LOG_FILE cp $MODE $ACME_PATH/* $CERT_PATH >> $LOG_FILE 2>&1 echo "写入当前证书哈希值到 $CERT_HASH,以便下次更新时对比" >> $LOG_FILE echo $NEW_HASH > $CERT_HASH if [ "$DOCKER_NAME" == "null" ];then echo "--- 无容器,跳过重启 ---" >> $LOG_FILE else echo "--- 重启 $DOCKER_NAME 容器应用新证书 ---" >> $LOG_FILE docker restart $DOCKER_NAME >> $LOG_FILE 2>&1 # 重启对应容器 fi echo "" >> $LOG_FILE fi } # ========================= 更新证书(自行修改) ========================= # 函数使用格式: update_certificate {容器名称(null 无需重启容器)} {覆盖证书路径} {ACME 证书路径(格式 证书名称_ecc)} # 如果仅需替换证书也可直接使用: cp $MODE {ACME 证书路径}/* {覆盖证书路径} >> $LOG_FILE 2>&1 update_certificate null /volume1/nas/domain $ACME_HOME/*.918178.xyz_ecc update_certificate blynk /volume1/docker/Blynk/key $ACME_HOME/*.918178.xyz_ecc update_certificate nginx /volume1/docker/Harbor/data/secret/cert $ACME_HOME/*.918178.xyz_ecc update_certificate jupyterhub-jupyterhub-1 /volume1/docker/JupyterHub/key $ACME_HOME/*.918178.xyz_ecc # ========================= 杂项(无需修改)========================= echo 执行结束,$(date +"%Y/%m/%d %H:%M:%S") >> $LOG_FILE # 脚本结束,输出时间到日志文件 # ========================= 发送 WxPusher(无需修改) ========================= LOG="" # 初始化一个空变量 # 逐行读取文件内容并添加到变量中 while IFS= read -r line;do LOG+="$line\n";done < $LOG_FILE # 构造请求的JSON数据 JSON_DATA=$(cat <<EOF { "appToken": "$APPTOKEN", "content": "$LOG", "summary": "$SUMMARY", "contentType": 3, "uids": $UIDS, "verifyPay": false } EOF ) # 发送POST请求 RESPONSE=$(curl -s -X POST "$API_URL" -H "Content-Type: application/json" -d "$JSON_DATA") # ========================= 杂项(无需修改)========================= echo "$RESPONSE" >> $LOG_FILE # 把响应结果输出到日志文件 ``` ## ~~ACME_CloudFlare.sh~~ `不好用也没必要,不过可以参考相关指令` 自写脚本 `ACME_CloudFlare.sh` ,必须放在 `acme.sh` 同文件夹下使用 ```bash # ===该文件需放在 acme.sh 同文件下执行!!!=== # sh ACME_CloudFlare.sh [-a <CloudFlare邮箱账户>] [-b <CloudFlareAPIkey>] [-c <域名>] [-d <群晖用户名>] [-e <群晖密码>] [-f <群晖http端口>] [-g <强制更新>] -m <模式> # -m install(安装)/issue(颁发)/deploy(部署)/cron(续订)/force(修复) # 安装ACME: sh ACME_CloudFlare.sh -m install # 颁发证书: sh ACME_CloudFlare.sh -a ai773203918@qq.com -b <CloudFlareAPIkey> -c *.918178.xyz -m issue # 颁发证书(强制): sh ACME_CloudFlare.sh -a ai773203918@qq.com -b <CloudFlareAPIkey> -c *.918178.xyz -g 1 -m issue # 部署证书: sh ACME_CloudFlare.sh -d <群晖用户名> -e <群晖密码> -f 2333 -c *.918178.xyz -m deploy # 证书续订: sh ACME_CloudFlare.sh -m cron # 证书续订(强制): sh ACME_CloudFlare.sh -g 1 -m cron # 修复环境: sh ACME_CloudFlare.sh -m force # ===================== 需修改配置 ===================== # --------------------- 常规配置 --------------------- # DNS 供应商,我这里使用的是 CloudFlare,如果使用其它供应商则认证需修改 export CERT_DNS="dns_cf" # 需要获取证书的域名,多个使用 ',' 隔开(不可有包含关系) export CERT_DOMAIN="*.918178.xyz,nas.918178.xyz" # 是否强制更新(空否/有是) --force FORCE="" # 修改默认 CA 为 letsencrypt,默认为 zerossl ./acme.sh --set-default-ca --server letsencrypt # --------------------- 群晖相关配置 --------------------- # 群晖登录相关(需有配置证书权限) export SYNO_Username='wj' # 群晖用户名 export SYNO_Password='123' # 群晖密码 # export SYNO_TOTP_SECRET='' # 群晖OTP # export SYNO_Scheme='http' # 群晖访问协议(默认http/https) export SYNO_Port='2333' # 群晖访问端口(默认5000),需和协议端口对应 # 群晖证书相关 export SYNO_Certificate="" # 指定替换的证书,默认证书则保持为空 # export SYNO_Create=1 # 如果指定其他证书,启用这个可以在证书不存在时创建证书 # 启用了双因素身份验证(2FA),需要额外配置这个 # 参考链接:https://github.com/acmesh-official/acme.sh/wiki/deployhooks#20-deploy-the-cert-into-synology-dsm # export SYNO_DID='YOUR VALUE' # export SYNO_USE_TEMP_ADMIN=1 # 使用临时用户或现有管理员用户进行部署(常规不行可以使用) # --------------------- CloudFlare 认证 --------------------- # 下列 CloudFlare 认证方式仍挑其一即可 # 使用 邮箱 + CloudFlare API 令牌 方式认证 export CF_Email="ai773203918@qq.com" # CloudFlare API 令牌 export CF_Token="123" # CloudFlare API 令牌 # # 使用 账户 ID + CloudFlare API 令牌 方式认证 # CF_Account_ID="xxxxxxxxxxxxx" # 帐户 ID # CF_Token="xxxxxxxxxx" # CloudFlare API 令牌 # CF_Zone_ID="xxxxxxxxxxxxx" # 可选,区域 ID,单区域时需要 # # 使用 Global API Key(全局API密钥) 方式认证,不推荐比较危险 # CF_Email="ai773203918@qq.com" # CloudFlare API 令牌 # CF_Key="xxxxx" # Global API Key(全局API密钥) # ===================== 下列无需更改 ===================== # --------------------- 创建传递参数 --------------------- while getopts a:b:c:d:e:f:g:m: opts; do case ${opts} in # 依次把参数传递到变量中存储,后面可以正常调用该变量 a) CF_Email=${OPTARG} ;; b) CF_Token=${OPTARG} ;; c) CERT_DOMAIN=${OPTARG} ;; d) SYNO_Username=${OPTARG} ;; e) SYNO_Password=${OPTARG} ;; f) SYNO_Port=${OPTARG} ;; g) FORCE=${OPTARG} ;; m) MODEL=${OPTARG} ;; esac done # --------------------- 创建证书 --------------------- # 根据模式执行相应指令 case $MODEL in install) echo "-------- 安装 ACME --------" ./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "$CF_Email" # 安装 acme ;; issue) # 判断是否非空,-z 判断是否为空;-n 判断是否非空 if [ -z "$FORCE" ]; then # 正常颁发证书 echo "-------- 颁发证书 --------" ./acme.sh --issue --dns $CERT_DNS -d "$CERT_DOMAIN" # 颁发证书 else echo "-------- 颁发证书-强制 --------" ./acme.sh --issue --dns $CERT_DNS -d "$CERT_DOMAIN" --force # 强制颁发证书 fi ;; deploy) echo "-------- 部署证书 --------" ./acme.sh --deploy -d "$CERT_DOMAIN" --deploy-hook synology_dsm # 部署证书 ;; cron) # 判断是否非空,-z 判断是否为空;-n 判断是否非空 if [ -z "$FORCE" ]; then echo "-------- 证书续订 --------" /usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh/ # 证书续订 else echo "-------- 证书续订-强制 --------" /usr/local/share/acme.sh/acme.sh --cron --force --home /usr/local/share/acme.sh/ # 证书续订-强制 fi ;; force) echo "-------- 修复环境 --------" /usr/local/share/acme.sh/acme.sh --force --upgrade --nocron --home /usr/local/share/acme.sh # 修复群晖升级后损坏的环境 ;; esac ``` 相关教程: --- [使用 acme.sh 的 Synology NAS 的 HTTPS 证书](https://github.com/haoyume/acme/blob/ecd26b836c84b00c2b411241daf8241166b3aa40/Synology-NAS-Guide.md) [Synology-RT1900ac-and-RT2600ac-install-guide](https://github.com/haoyume/acme/blob/ecd26b836c84b00c2b411241daf8241166b3aa40/Synology-RT1900ac-and-RT2600ac-install-guide.md)
造物者W
2024年8月21日 13:53
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码