群晖Lucky套件高级玩法-——更新证书同步更新群晖自带证书
自动更新加申请证书的工具有很多,今天玩lucky
基础设置如下,忽略讲述
重点来了,打开证书映射,会告诉你在目录下生成三个证书
很多人会在这里遇到问题,基本上就两点原因,群晖lucky套件文件管理权限不够 和 无管理root权限,无法使用sudo命令
我的解决方法,仅供参考
问题①:设置domain文件夹编辑权限为everyone
问题②:lucky证书变化后创建文件,调用群晖自带计划任务(自带root),监测出文件后执行更新证书脚本。
详细:
①打开群晖file station,右键domain文件夹,属性—权限—新增—用户或组选择Everyone,选择所有权限,保存
勾选应用到这个文件夹,保存
在lucky脚本测试中使用
touch /domain/need_cert_update
echo "✅ 证书更新请求已发送,请等待执行..."
你会发现在/domain/
文件夹下会有一个空白文件need_cert_update
接着在群晖任意文件夹下如/domain/
新增一个名为Renew-R.sh
的脚本(名字随便)
#!/bin/bash
if [ -f "/domain/need_cert_update" ]; thenrm -f /domain/need_cert_update/bin/bash /domain/renew.sh
fi
脚本解释:如果/domain/need_cert_update
存在,就删除need_cert_update
文件且运行domain
下的renew.sh
脚本
再在/domain
下创建一个renew.sh
内容为
#!/bin/bash# 证书复制和替换脚本 - 用于自动复制Lucky生成的证书到群晖echo " 开始证书更新流程..."# 配置变量
# Lucky证书存放路径
SOURCE_DIR="/domain"
# 证书名字
CERT_NAME="test.abc.com"
# 群晖证书所在位置/usr/syno/etc/certificate/_archive,需要自己查看需要替换哪个文件夹里的内容
SYNO_CERT_DIR="/usr/syno/etc/certificate/_archive/CU8uAD"# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color# 日志函数
log_info() { echo -e "${BLUE}ℹ️ $1${NC}"; }
log_success() { echo -e "${GREEN}✅ $1${NC}"; }
log_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; }
log_error() { echo -e "${RED}❌ $1${NC}"; }# 检查源文件是否存在
log_info "检查源证书文件..."
if [ ! -f "$SOURCE_DIR/$CERT_NAME.crt" ]; thenlog_error "CRT文件不存在: $SOURCE_DIR/$CERT_NAME.crt"exit 1
fiif [ ! -f "$SOURCE_DIR/$CERT_NAME.key" ]; thenlog_error "KEY文件不存在: $SOURCE_DIR/$CERT_NAME.key"exit 1
fiif [ ! -f "$SOURCE_DIR/$CERT_NAME.pem" ]; thenlog_error "PEM文件不存在: $SOURCE_DIR/$CERT_NAME.pem"exit 1
filog_success "所有源文件检查通过"# 分析证书文件内容
log_info "分析证书文件内容..."
CRT_CERTS=$(grep -c "BEGIN CERTIFICATE" "$SOURCE_DIR/$CERT_NAME.crt" 2>/dev/null || echo "0")
PEM_CERTS=$(grep -c "BEGIN CERTIFICATE" "$SOURCE_DIR/$CERT_NAME.pem" 2>/dev/null || echo "0")echo " CRT文件包含 $CRT_CERTS 个证书"
echo " PEM文件包含 $PEM_CERTS 个证书"# 智能判断证书映射策略
if [ "$CRT_CERTS" -ge 2 ] && [ "$PEM_CERTS" -ge 2 ]; thenlog_info "检测到两个文件都包含完整证书链,使用优化映射"# 两个文件都有完整链,选择证书数量更多的作为fullchainif [ "$PEM_CERTS" -ge "$CRT_CERTS" ]; thenCERT_FILE="$SOURCE_DIR/$CERT_NAME.crt"FULLCHAIN_FILE="$SOURCE_DIR/$CERT_NAME.pem"log_info "使用 PEM 文件作为 fullchain.pem ($PEM_CERTS 个证书)"elseCERT_FILE="$SOURCE_DIR/$CERT_NAME.pem"FULLCHAIN_FILE="$SOURCE_DIR/$CERT_NAME.crt"log_info "使用 CRT 文件作为 fullchain.pem ($CRT_CERTS 个证书)"fi
elif [ "$CRT_CERTS" -ge 2 ]; thenlog_info "CRT文件包含完整证书链"CERT_FILE="$SOURCE_DIR/$CERT_NAME.pem"FULLCHAIN_FILE="$SOURCE_DIR/$CERT_NAME.crt"
elif [ "$PEM_CERTS" -ge 2 ]; thenlog_info "PEM文件包含完整证书链"CERT_FILE="$SOURCE_DIR/$CERT_NAME.crt"FULLCHAIN_FILE="$SOURCE_DIR/$CERT_NAME.pem"
elselog_warning "未检测到完整证书链,使用默认映射"CERT_FILE="$SOURCE_DIR/$CERT_NAME.crt"FULLCHAIN_FILE="$SOURCE_DIR/$CERT_NAME.pem"
fi# 备份现有证书(如果存在)
if [ -f "$SYNO_CERT_DIR/cert.pem" ]; thenlog_info "备份现有群晖证书..."BACKUP_DIR="$SYNO_CERT_DIR/backup_$(date +%Y%m%d_%H%M%S)"sudo mkdir -p "$BACKUP_DIR"sudo cp "$SYNO_CERT_DIR"/*.pem "$BACKUP_DIR/" 2>/dev/null || truelog_success "备份完成: $BACKUP_DIR"
fi# 复制证书到群晖目录
log_info "复制证书到群晖目录..."
sudo cp "$CERT_FILE" "$SYNO_CERT_DIR/cert.pem"
sudo cp "$FULLCHAIN_FILE" "$SYNO_CERT_DIR/fullchain.pem"
sudo cp "$SOURCE_DIR/$CERT_NAME.key" "$SYNO_CERT_DIR/privkey.pem"# 设置正确的权限
log_info "设置文件权限..."
sudo chmod 644 "$SYNO_CERT_DIR/cert.pem"
sudo chmod 644 "$SYNO_CERT_DIR/fullchain.pem"
sudo chmod 600 "$SYNO_CERT_DIR/privkey.pem"log_success "证书复制完成!"# 验证复制结果
echo ""
log_info "验证复制结果..."
echo "=== 群晖证书目录 ==="
ls -la "$SYNO_CERT_DIR/" | grep -E "\.(pem|crt|key)$"# 验证证书内容
echo ""
log_info "验证证书链完整性..."
FINAL_FULLCHAIN_CERTS=$(grep -c "BEGIN CERTIFICATE" "$SYNO_CERT_DIR/fullchain.pem" 2>/dev/null || echo "0")
FINAL_CERT_CERTS=$(grep -c "BEGIN CERTIFICATE" "$SYNO_CERT_DIR/cert.pem" 2>/dev/null || echo "0")echo " 最终 fullchain.pem 包含: $FINAL_FULLCHAIN_CERTS 个证书"
echo " 最终 cert.pem 包含: $FINAL_CERT_CERTS 个证书"if [ "$FINAL_FULLCHAIN_CERTS" -ge 2 ]; thenlog_success "fullchain.pem 包含完整证书链"
elselog_warning "fullchain.pem 可能不包含完整证书链"
fi# 验证证书有效性
log_info "验证证书有效性..."
if openssl x509 -in "$SYNO_CERT_DIR/cert.pem" -noout -text >/dev/null 2>&1; thenCERT_SUBJECT=$(openssl x509 -in "$SYNO_CERT_DIR/cert.pem" -noout -subject | sed 's/subject=//')CERT_DATES=$(openssl x509 -in "$SYNO_CERT_DIR/cert.pem" -noout -dates)log_success "证书有效"echo " 证书主题: $CERT_SUBJECT"echo " $CERT_DATES"
elselog_error "证书格式无效"
fi# 检查私钥匹配
log_info "验证私钥匹配..."
CERT_MODULUS=$(openssl x509 -in "$SYNO_CERT_DIR/cert.pem" -noout -modulus 2>/dev/null | openssl md5)
KEY_MODULUS=$(openssl rsa -in "$SYNO_CERT_DIR/privkey.pem" -noout -modulus 2>/dev/null | openssl md5)if [ "$CERT_MODULUS" = "$KEY_MODULUS" ]; thenlog_success "私钥与证书匹配"
elselog_warning "私钥与证书可能不匹配"
fiecho ""
log_success " 证书更新完成!开始重启服务..."# 重启服务
echo ""
log_info "重启Nginx服务..."
if sudo systemctl restart nginx >/dev/null 2>&1; thenlog_success "Nginx服务重启成功"
elselog_warning "Nginx服务重启失败,请手动检查"
fi# 等待服务启动
log_info "等待服务启动..."
sleep 3# 检查服务状态
echo ""
log_info "检查服务状态..."# 检查Nginx状态
if sudo systemctl is-active nginx >/dev/null 2>&1; thenlog_success "Nginx服务运行正常"
elselog_warning "Nginx服务状态异常"
fiecho ""
log_success " 证书更新和服务重启流程完成!"
echo ""
echo " 验证建议:"
echo "1. 访问 https://test.abc.com 检查证书是否生效"
echo "2. 查看群晖管理界面证书状态"
echo ""
echo " 日志位置:"
echo " Nginx日志: /var/log/nginx/"
echo ""
echo " 如有问题,可手动执行:"
echo " sudo systemctl restart nginx"
包括如果有其他地方需要替换证书,也可以自己修改脚本(AI很强大)建议手动ssh里运行一下这个脚本,无误后再进行操作
群晖控制面板-任务计划-新增-计划的任务-用户自定的脚本