群晖安装acme.sh域名证书自动申请续期部署

内容目录

环境

黑群晖 处理器 intel e5 2630V3
Version: 7.2.1-69057 Update 5

参考

大部分参考以下文章
https://www.laowu.de/index.php/archives/18/
如果使用docker容器方案会因为容器版本更新会产生报错

[Mon Sep  9 05:07:38 UTC 2024] Logging into localhost:5000...
Enter device name or leave empty for default (CertRenewal): [Mon Sep  9 05:07:39 UTC 2024] Failed to authenticate, no such account or incorrect password.
[Mon Sep  9 05:07:39 UTC 2024] Error deploying for domain:

容器使用neilpang/acme.sh:3.0.7 或3.0.6

1. 前置条件:开启root

要在群晖 NAS 上开启 root 用户的 SSH 登录功能,按照以下步骤进行操作:

1. 启用 SSH 服务

  • 打开群晖的 DSM 控制面板。
  • 进入 控制面板 > 终端机和 SNMP
  • 终端机 选项卡中,勾选 启用SSH服务,并确保端口号正确(默认是22端口)。
  • 点击 应用

2. 通过 SSH 连接到 NAS

  • 使用管理员账户(如 admin 或其他管理员账户)通过 SSH 登录到群晖:
    ssh admin@192.168.0.117

    输入管理员密码进行登录。

    3. 切换到 root 用户3. 切换到 root 用户

    在登录管理员账户后,输入以下命令切换到 root 用户:

sudo -i

输入管理员账户的密码,即可以 root 用户身份操作。

4. 修改 root 密码(可选)

如果需要为 root 用户设置独立密码,可以运行以下命令:

passwd

根据提示输入新密码并确认。

5. 编辑 SSH 配置文件

为了直接通过 root 用户登录 SSH,需要修改 SSH 配置文件:

  • 进入 SSH 配置文件:
    vi /etc/ssh/sshd_config
  • 找到以下行:
    #PermitRootLogin prohibit-password
  • 将其修改为:
    PermitRootLogin yes

    然后保存并退出。

6. 重启 SSH 服务

为了让修改生效,需要重启 SSH 服务:

synoservicectl --restart sshd

方案1 群晖DSM安装acme.sh申请证书部署

优点不用启动容器,缺点群晖系统多出一堆文件,哈哈

cd /root
wget https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
tar xvf master.tar.gz
cd acme.sh-master/
#填写自己邮箱
./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "xxxxx@gmail.com"
#获取自己cloudflare的api key和邮箱
echo 'export CF_Key="xxxxxxxx"
export CF_Email="xxxxxx@gmail.com"' >> /root/.profile
source /root/.profile
#第一次申请注意切到目录/usr/local/share/acme.sh
#不然配置文件以及申请下来证书就到别的目录了,后面部署会提示找不到文件No such file or directory
cd /usr/local/share/acme.sh
#示例cloudflare其他dns参考https://github.com/acmesh-official/acme.sh/wiki/dnsapi
acme.sh --issue --server letsencrypt --home . -d ku0.cc -d *.ku0.cc --dns dns_cf
export SYNO_USE_TEMP_ADMIN=1
acme.sh --deploy -d ku0.cc -d *.ku0.cc --deploy-hook synology_dsm

定时执行
最后一步就是添加一个计划任务,每周定时更新一次证书。控制面板->计划任务->新增,我设置为每周运行一次,运行脚本

在 DSM 控制面板中,打开“任务计划程序”并为用户定义的脚本创建一个新的计划任务。

常规设置:任务名:acme 用户:root
计划:设置每周续订。例如,每周六上午 11:00。
任务设置:用户定义的脚本:

# renew certificates 
cd /usr/local/share/acme.sh
./acme.sh --cron --home .

####################################################################################################################################################
################################################################分割线###############################################################################
####################################################################################################################################################

方案2 docker-compose 容器启动申请证书部署

2.1创建acme相关目录

mkdir /volume1/docker/acme
mkdir /volume1/docker/acme/acme.sh
cd /volume1/docker/acme

2.2 编辑docker-compose.yml

vim /volume1/docker/acme/docker-compose.yml 
version: '3'
services:
    acme:
        container_name: acme  # 容器的名称
        environment: 
            - SYNO_Username="" # 群晖管理员账号
            - SYNO_Password="" # 群晖管理员登录密码
            - SYNO_Device_ID="" # 设备ID 如果你开了两步验证,这里就需要填写(我填写了)
            - SYNO_Certificate= ""  #(证书名,没有就给空字符即可)我没填
            - CF_Key= "" # 登录Cloudflare之后,进入域名管理在“概述”右下角单击“获取您的API令牌”然后点击“Global API Key 查看”即可
            - CF_Email= "" # 自己Cloudflare的登录邮箱
        volumes:
             - ./acme.sh:/acme.sh # 证书存放的映射目录
        command:
             - daemon  # 执行命令
        image: neilpang/acme.sh:3.0.7  # 容器镜像,最新版本会报错Failed to authenticate,使用3.0.7 3.0.6正常
        platform: linux/amd64  # x86 操作系统
        restart: unless-stopped # 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
        network_mode: host  # host的网络
SYNO_Device_ID="" # 设备ID获取方法
打开浏览器,使用管理员账号登陆你的群晖,登录的时候选择:记住这台设备】【按 F12 开启调试模式,这个时候会弹出来一个新的界面】【上方一横排菜单里,找到 Application,如果找不到,就把这个窗口拉宽一点儿】【在左侧的 Cookies 菜单点击下方的地址,右侧就会出现很多项内容,找到 ID,把右边的值复制出来,放到上方的”群晖设备ID“处替换即可
SYNO_Certificate= "" 的说明
有一点需要注意,上方的SAVED_SYNO_Certificate需要与DSM门户里已经上传的默认证书的描述相同。描述不同的话只会新增加一张证书,并不会替换原有的证书。

2.3 启动容器

cd /volume1/docker/acme
docker-compose up -d

2.4 编辑证书脚本AutoCert.sh

vim  /volume1/docker/acme/AutoCert.sh 

#!/bin/bash

# ==参数说明==
# 1)申请证书参数
docker exec acme acme.sh --force --log --issue --server letsencrypt --dns dns_cf --dnssleep 120 -d XXX.XXX -d *.XXX.XXX
# acme:容器的名字,根据自己的容器名填写
# --server letsencrypt:选的是Let's Encrypt的免费证书
# --dns dns_cf:这里选的是Cloudflare的DNS
# --dnssleep 120:Sleep 120秒
# -d XXX.XXX -d *.XXX.XXX:替换用自己的域名即可

# 2)部署证书到群晖参数
docker exec acme acme.sh --deploy -d XXX.XXX -d *.XXX.XXX --deploy-hook synology_dsm

# acme:容器的名字,根据自己的容器名填写
# --deploy -d XXX.XXX -d *.XXX.XXX:用自己的域名即可
# --deploy-hook synology_dsm:部署到群晖上
chmod +x /volume1/docker/acme/AutoCert.sh

首次部署直接执行看有无报错

bash  /volume1/docker/acme/AutoCert.sh

成功终端返回

[Mon Sep  9 05:15:33 UTC 2024] The domain 'ku0.cc' seems to have a ECC cert already, lets use ecc cert.
[Mon Sep  9 05:15:33 UTC 2024] Logging into localhost:5000
[Mon Sep  9 05:15:35 UTC 2024] Getting certificates in Synology DSM
[Mon Sep  9 05:15:35 UTC 2024] Generate form POST request
[Mon Sep  9 05:15:36 UTC 2024] Upload certificate to the Synology DSM
[Mon Sep  9 05:16:29 UTC 2024] Restarting HTTP services succeeded
[Mon Sep  9 05:16:30 UTC 2024] Success

2.5. 群晖DSM添加计划任务

定时执行
最后一步就是添加一个计划任务,每周定时更新一次证书。控制面板->计划任务->新增,我设置为每周运行一次,运行脚本

在 DSM 控制面板中,打开“任务计划程序”并为用户定义的脚本创建一个新的计划任务。

常规设置:任务名:acme 用户:root
计划:设置每周续订。例如,每周六上午 11:00。
任务设置:用户定义的脚本:

#renew certificates 
bash /volume1/docker/acme/AutoCert.sh >>/volume1/docker/acme/log.txt 2>&1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注