准备工作
- DSM v7.3.1
- Emby Server v4.9.1
- Acme.sh v3.1.2(群晖NAS配合acme.sh自动更新SSL证书)
更新脚本
以下脚本可以将 PEM 证书转换成 PKCS#12 格式,并且重启 Emby Server 服务。
#!/bin/bash
#================================================================
# Script to deploy acme.sh certificate to Emby on Synology DSM
# Version 2.0 - Now supports both RSA and ECC certificates automatically
#================================================================
## CONFIGURATION - 请根据你的实际情况修改以下变量 ##
#================================================================
# 1. 你的 Emby 域名 (必须与 acme.sh 申请的域名一致)
DOMAIN="emby.example.com"
# 2. PFX 证书的密码 (Emby 将使用此密码读取证书)
# 建议设置一个密码。如果留空 (""),则 PFX 文件无密码。
PFX_PASSWORD=""
# 3. Emby 服务器存放证书的目录路径
# 在大多数群晖套件中,路径是固定的。请确认此路径是否正确。
EMBY_CONFIG_DIR="/var/packages/EmbyServer/var/config"
# 4. Emby 服务运行的用户和组 (用于设置文件权限)
# 通常是 sc-emby:emby。你可以通过 `ps | grep Emby` 查看运行用户。
EMBY_USER="emby"
EMBY_GROUP="emby"
# 5. acme.sh 的主目录
ACME_HOME="/var/services/homes/xueye/.acme.sh"
## END OF CONFIGURATION ##
#================================================================
# 定义日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] - $1"
}
log "开始为 Emby 部署证书..."
# --- 关键更新:自动检测证书目录 (支持 RSA 和 ECC) ---
CERT_DIR=""
ECC_CERT_DIR="$ACME_HOME/${DOMAIN}_ecc"
RSA_CERT_DIR="$ACME_HOME/$DOMAIN"
if [ -d "$ECC_CERT_DIR" ]; then
log "检测到 ECC 证书目录。"
CERT_DIR="$ECC_CERT_DIR"
elif [ -d "$RSA_CERT_DIR" ]; then
log "检测到 RSA 证书目录。"
CERT_DIR="$RSA_CERT_DIR"
else
log "错误: 找不到证书目录。已检查 '$ECC_CERT_DIR' 和 '$RSA_CERT_DIR'。"
exit 1
fi
log "使用的证书目录是: $CERT_DIR"
# 检查域名证书文件是否存在
if [ ! -f "$CERT_DIR/$DOMAIN.key" ] || [ ! -f "$CERT_DIR/fullchain.cer" ]; then
log "错误: 在 $CERT_DIR 中找不到证书文件。请检查域名是否正确。"
exit 1
fi
# 检查 Emby 配置目录是否存在
if [ ! -d "$EMBY_CONFIG_DIR" ]; then
log "错误: Emby 配置目录 $EMBY_CONFIG_DIR 不存在。"
exit 1
fi
# 定义 PFX 文件路径
PFX_TARGET_PATH="$EMBY_CONFIG_DIR/certificate.pfx"
TEMP_PFX_PATH="/tmp/$DOMAIN.pfx"
# 使用 openssl 生成 PFX 文件
log "正在从最新的 key 和 fullchain 文件生成 PFX 证书..."
# 根据是否有密码选择不同的参数
if [ -n "$PFX_PASSWORD" ]; then
PASS_PARAM="-password pass:$PFX_PASSWORD"
else
PASS_PARAM="-password pass:"
fi
openssl pkcs12 -export \
-out "$TEMP_PFX_PATH" \
-inkey "$CERT_DIR/$DOMAIN.key" \
-in "$CERT_DIR/fullchain.cer" \
$PASS_PARAM
# 检查 PFX 文件是否成功生成
if [ $? -ne 0 ]; then
log "错误: 生成 PFX 文件失败。"
rm -f "$TEMP_PFX_PATH" # 清理失败的临时文件
exit 1
fi
log "PFX 文件已成功生成到 $TEMP_PFX_PATH"
# 部署 PFX 文件到 Emby 目录
log "正在将 PFX 文件复制到 $PFX_TARGET_PATH"
cp "$TEMP_PFX_PATH" "$PFX_TARGET_PATH"
# 设置正确的文件所有者和权限
log "正在为 $PFX_TARGET_PATH 设置权限..."
chown $EMBY_USER:$EMBY_GROUP "$PFX_TARGET_PATH"
chmod 600 "$PFX_TARGET_PATH"
# 清理临时文件
rm -f "$TEMP_PFX_PATH"
# 重启 Emby Server 以加载新证书
log "正在重启 Emby Server 服务..."
synosystemctl restart pkgctl-EmbyServer.service
if [ $? -eq 0 ]; then
log "Emby Server 重启成功。新证书已部署!"
else
log "警告: Emby Server 重启命令可能失败。请检查服务状态。"
fi
exit 0添加 acme.sh 钩子
在 Acme.sh 更新证书后,执行此脚本。
acme.sh --install-cert -d emby.example.com \
--reloadcmd "sudo /volume1/homes/xueye/scripts/emby_deploy.sh"