标签搜索

群晖DSM7.x通过acme.sh全自动更新并部署SSL证书(2024年)

摸鱼仔
2024-03-07 / 0 评论 / 1,094 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年03月06日,已超过185天没有更新,若内容或图片失效,请留言反馈。
在当今信息化高速发展的社会,Https 的重要性不言而喻,所以对于我这种自己部署了很多服务并且要暴露在外网的人来说,维持自己的 ssl 证书是一件非常重要的事。

本文介绍 acme.sh 脚本实现群晖(也适用于 泛 Linux 服务器)证书自动申请续签、自动部署的全过程,因本人在互联网查询教程期间,发现网上大部分文章均已经过时,部分官方新特性未在大部分教程中看到,遂开此文章,望帮到更多人。

如果你有网络条件、设备基础、操作能力,强烈建议你直接参考 官方中文 指引,毕竟这是实时更新的 wiki ,理论上是不会过期的,也是更加准确的,但如果你命令行操作能力有限,可继续看下去。

请注意文章时效(2024-03-07)。

一、 开启root

参考:https://wp.gxnas.com/1385.html

二、 安装docker-compose

https://github.com/docker/compose/releases
下载对应的版本文件:docker-compose-linux-aarch64
更名为:docker-compose
上传到:/usr/local/bin
给执行权限:

sudo chmod +x /usr/local/bin/docker-compose

三、方法一:采用 acme docker容器+sh命令方式 (申请Cloudflare为例)

1、新建docker目录

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

可以自定义位置

2、新建docker-compose.yml

touch /volume1/docker/acme/docker-compose.yml 

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  # 容器镜像
        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门户里已经上传的默认证书的描述相同。描述不同的话只会新增加一张证书,并不会替换原有的证书。

Test

运行容器:

docker-compose up -d

3、新建AutoCert.sh

touch /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

Test

4、添加计划任务

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

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

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

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

Test
Test
Test
方案一完成更新

方案二、本地脚本更新,无需群晖的账号

1、安装 acme.sh

sudo su
cd ~
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 "email@gmailcom"
source ~/.profile

2、配置 DNS

对于 CloudFlare,我们将设置两个环境变量,acme.sh(特别是子目录中的脚本)将读取这些变量以设置 DNS 记录。您可以在此处获取 CloudFlare API 密钥。dns_cfdnsapi

export CF_Key="MY_SECRET_KEY_SUCH_SECRET"
export CF_Email="myemail@example.com"

如果您生成了 API 令牌,请改为设置 CF_Token,而不是使用您的全局帐户密钥。

export CF_Token="MY_SECRET_TOKEN_SUCH_SECRET"
export CF_Email="myemail@example.com"

如果您使用其他 DNS 服务,请查看目录和 DNS API 指南。许多DNS提供商的说明已经包含在内。您还可以在那里找到有关如何添加其他DNS服务的说明,尽管这需要一些软件开发技能。dnsapi

3、创建证书

现在是时候为您的域创建证书了:


# These commands assume you are still working in the same terminal and have ran necessary commands described above.

cd /usr/local/share/acme.sh
export CERT_DOMAIN="your-domain.tld"
export CERT_DNS="dns_cf"
./acme.sh --issue --server letsencrypt --home . -d "$CERT_DOMAIN" --dns "$CERT_DNS"

4、部署默认证书

(推荐)使用自动创建的临时管理员用户进行部署
如果您安装在 DSM 中,我们建议您尝试使用自动临时用户身份验证方法进行部署(DSM 应该已经有所需的内置工具,如果没有,我们会通知您):acme.sh

export SYNO_USE_TEMP_ADMIN=1
./acme.sh --deploy --home . -d "$CERT_DOMAIN" --deploy-hook synology_dsm

这样,您就不需要提供任何管理员凭据,部署 sciprt 本身将利用 Synology 内置的实用程序来完成身份验证,因此它设计为仅支持本地部署,不能用于在 docker 中部署或远程部署。

脚本将加载之前保存的 conf 以供后续部署,因此如果要使用现有管理员用户进行部署,则需要先执行。部署脚本退出后,临时管理员用户应该尚未创建或已被删除,但是如果脚本意外退出(例如,按“Ctrl+C”中止),它仍可能保留,在这种情况下,您可以通过“控制面板”安全地删除它。export CLEAR_SYNO_USE_TEMP_ADMIN=1

此外,为了防止混淆,必须以当前本地计算机为目标(可以是 或)的值,但是,如果自定义SYNO_HOSTNAME确实以当前本地计算机为目标,则应在部署之前执行。SYNO_HOSTNAMElocalhost127.0.0.1export SYNO_LOCAL_HOSTNAME=1

5、配置证书续订

若要在将来自动续订证书,需要在任务计划程序中配置任务。不建议将其设置为自定义 cronjob(如本 wiki 页面之前所述),因为 DSM 安全顾问会告诉您有关未知 cronjob 的严重警告。

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

常规设置:任务 - 更新默认证书。 用户 - root
计划:设置每周续订。例如,每周六上午 11:00。
任务设置:用户定义的脚本:

# renew certificates 
./acme.sh --cron --home .

参考文章详见:
https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide#deploy-the-default-certificate

0

评论 (0)

取消