有603人阅读过
群晖使用ACME签发证书
发布于2024/01/24 更新于2025/08/15
[ 教程仅保证更新时有效,请自行测试。]
[ 教程仅保证更新时有效,请自行测试。]
下载CAME程序,GitHub - acmesh-official/acme.sh: A pure Unix shell script implementing ACME client protocol
备用下载:
acme.sh-master.zip
自动执行脚本:
解压后上传到服务器
获取解析服务器accessKEY信息,例如DNSpod的在这里生成:
创建计划任务:
cd 脚本路径 bash renew_SSL.sh
* 初次使用请修改描述内容和域名一致
附脚本内容:
#!/bin/bash
# 群晖登陆http端口
port="xxx"
# 要更新的域名列表
domains=("域名1" "域名2")
# DNS提供商 dns_dp,dns_ali
DNS_server="dns_dp"
# DNSpod 信息
DP_Id="xxxxxx"
DP_Key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
# Ali DNS信息
Ali_Key="xxx"
Ali_Secret="xxx"
# 企业微信群机器人webhook
Webhook="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxx"
#####################
# 以下为程序代码,不懂勿动 #
#####################
if [ "$DNS_server" == "dns_dp" ]; then
export DP_Id="${DP_Id}"
export DP_Key="${DP_Key}"
elif [ "$DNS_server" == "dns_ali" ]; then
export Ali_Key="${Ali_Key}"
export Ali_Secret="${Ali_Secret}"
fi
# 生成随机邮箱
generate_random_email() {
local random_str=$(head /dev/urandom | tr -dc a-z0-9 | head -c 8)
echo "${random_str}@163.com"
}
email=$(generate_random_email)
# 注册CA
if [ ! -d "./ca" ]; then
./acme.sh --register-account -m "${email}" --server zerossl --home .
fi
# 循环处理每个域名
for domain in "${domains[@]}"; do
echo "正在处理域名: ${domain}"
echo "证书申请中..."
# 删除旧的证书文件
if [ -d "${domain}" ]; then
echo "检测到旧目录 ${domain},正在删除..."
rm -rf "${domain}"
echo "旧目录已删除"
fi
# 创建独立的目录
mkdir -p "${domain}"
cp -rf ca "${domain}"
echo "证书申请中..."
# 申请证书,指定独立的 home 目录
./acme.sh --issue --dns ${DNS_server} -d "${domain}" --home "${domain}"
echo "证书申请成功!"
# 写入登陆信息
cat <<EOF > "./${domain}/account.conf"
SYNO_USE_TEMP_ADMIN=1
SYNO_CREATE=1
SYNO_PORT=${port}
SYNO_CERTIFICATE="${domain}"
EOF
echo "登陆信息已保存!"
# 重命名证书目录名
mv "${domain}/${domain}_ecc" "${domain}/${domain}"
echo "已为 ${domain} 整理好所需文件!"
echo "正在为 ${domain} 更新证书到系统..."
# 更新证书,指定独立的 home 目录
./acme.sh --deploy --home "${domain}" --deploy-hook synology_dsm -d "${domain}"
echo "域名 ${domain} 的证书已更新完成"
# 微信通知
curl -s "${Webhook}" -H "Content-Type: application/json" -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"${domain}证书已更新。\"}}" > /dev/null 2>&1
done以上脚本适用于DSM7 以上,支持ECC证书的系统,DSM6.2不支持ECC证书,需要在获取证书的命令后面增加参数:--keylength 2048
./acme.sh --issue --dns ${DNS_server} -d "${domain}" --home "${domain}" --keylength 2048以下为讲解,仅供研究,可能有错误未修正!!
第一次使用需要配置一下基础信息
3.1 SSH连接服务器,切换到root账户,cd到该目录
ACME默认使用ZeroSSl申请证书,说明在这里:ZeroSSL.com CA · acmesh-official/acme.sh Wiki · GitHub
设置accessKEY信息,参考:dnsapi · acmesh-official/acme.sh Wiki · GitHub
文章中有说明每一家的API参数怎么设置及使用方法,例如DNSpod的:
按说明,先执行
export DP_Id="xxxx"
export DP_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
目录内会生成一个account.conf文件,里面储存着上面设置的accessKEY信息,
下次执行申请证书时,不需要运行export,直接执行申请命令即可。
此时基础信息已配置完,以后就不需要配置了。
然后执行获取证书命令进行测试,域名改成自己的
./acme.sh --issue --dns dns_dp -d giraff.fun --home .
注:此命令在官方说明的后面加上了 --home . 参数,使生成的证书文件保存在工作目录中
log中的红字提示不用管,不出意外的话,会在目录中生成以域名为名的文件夹,里面储存着证书等文件
更新证书到群晖,
ACME官方提供的替换证书方式。
修改account.conf,添加以下信息。ACME将模拟登陆进行自动更换证书:
注意:
端口SYNO_PORT使用http的,例如5000,如未修改还是5000,那这一行就不需要写了
证书名称留空则替换默认证书。
SYNO_PORT="DSM的端口"
SYNO_CERTIFICATE="证书名称"
SYNO_CREATE=1
SYNO_USE_TEMP_ADMIN=1
替换群晖证书,参考:deployhooks · acmesh-official/acme.sh Wiki · GitHub
./acme.sh --deploy --home . -d giraff.fun --deploy-hook synology_dsm
如果开启二次验证,第一次执行时,会要求输入OPT code, 这里是要设置这个OPT来跳过二次验证,输入后回车,会提示输入设备名称,直接回车用默认值。
还需要在account.conf中添加OPT信息
SYNO_OTP_CODE="XXXXXX"
SYNO_DEVICE_NAME="CertRenewal"
SYNO_DEVICE_ID=""
执行后,会用指定证书替换掉默认证书
如果需要更新远程证书,则
删除:
SYNO_USE_TEMP_ADMIN=1
添加:
SYNO_USERNAME='DSM用户名'
SYNO_PASSWORD='DSM密码'
使用计划任务申请证书及替换默认证书,可设置每月运行一次
# DSM7
# 设置ACME路径 ACME_local="/volume3/web/acme.sh-master" #设置证书对应的域名 domain="giraff.fun" # 切换至ACME路径 cd $ACME_local ./acme.sh --issue --dns dns_dp -d $domain --force --home . # 替换RSA证书 ./acme.sh --deploy --home . -d $domain --deploy-hook synology_dsm
# DSM6.2 及以下 !不支持ecc
# 设置ACME路径 ACME_local="/volume1/docker/ACME" #设置证书对应的域名 domain="giraff.fun" # 切换至ACME路径 cd $ACME_local # 申请RSA证书(2048) ./acme.sh --issue --dns dns_dp -d $domain --keylength 2048 --force --home . # 替换RSA证书 ./acme.sh --deploy --home . -d $domain --deploy-hook synology_dsm
- 一般[0]

- 很赞[0]

- 没用[0]

- 垃圾[0]

- 无语[0]












