群晖DSM7.1系统如何自动SSL证书更新

温馨提示:
本文最后更新于 2023-05-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1 利用acme.sh实现证书申请和续签

1.1 使用 docker 安装acme.sh

创建目录和文件:

acme.sh/data
account.conf

export CF_Key="填入Cloudflare的Api Key"
export CF_Email="填入Cloudflare的登录邮箱"
AUTO_UPGRADE='1'

  • 此处使用的是cloudflare进行域名托管

编写docker-compose.yaml文件

version: "3"
services:
  acme.sh:
    image: neilpang/acme.sh
    container_name: acme.sh
    restart: always
    command: daemon
    volumes:
      - ./data:/acme.sh
    network_mode: host

运行即可

1.2 申请泛域名证书

ssh切换root账户,输入

docker exec -it acme.sh sh

或者
在网页双击已运行的容器,切换到终端机页面,点击通过命令启动,输入sh后点确定(可选)

输入以下命令实现容器自动更新:

acme.sh --upgrade --auto-upgrade

然后输入以下命令申请证书:(以domain.com为例)

acme.sh --issue --dns dns_cf -d domain.com -d *.domain.com
  • dns_cf:表示此处使用的是cloudflare进行域名托管。dns_dp 代表腾讯云 DNSPod。 dns_ali 代表阿里云。更多可参考官方描述
  • 申请完成后可自动续期(command: daemon)

2 编写脚本定时替换系统证书文件

2.1 手动导入一遍证书,让群晖自动生成存储地址

已导入过的请跳过

2.2 找到群晖自动生成存储证书的地址

通过研究发现,DSM将所有证书信息存放在了/usr/syno/etc/certificate/_archive目录下,且/usr/syno/etc/certificate/_archive/DEFAULT文件中记录了当前的默认证书(通常用户自设为购买的证书)

先查询默认证书的名字

注意一直要root账户运行

cat /usr/syno/etc/certificate/_archive/DEFAULT

2.3 编写脚本

在自己找得到的位置编写update_certificate.sh

cp /volume2/docker/acme.sh/data/domain.com_ecc/fullchain.cer /usr/syno/etc/certificate/_archive/上面输出/fullchain.pem
cp /volume2/docker/acme.sh/data/domain.com_ecc/domain.com.cer /usr/syno/etc/certificate/_archive/上面输出/cert.pem
cp /volume2/docker/acme.sh/data/domain.com_ecc/domain.com.key /usr/syno/etc/certificate/_archive/上面输出/privkey.pem
systemctl reload nginx
systemctl restart nginx
  • 主要目的就是把最新的证书覆盖到群晖相应文件夹中并重启nginx
  • 默认是ecc加密的证书,安全,计算量小,所以文件夹后缀有"_ecc"

3 在群晖中新建计划任务

控制面板 -> 计划任务 ->新增

  • 用户账号:root
  • 每月1号执行一次
  • 在用户自定义脚本下方填入
bash 脚本绝对地址

 

文章来源:

群晖DSM7.1系统自动SSL证书更新 (pigcyan.com)

阅读剩余
THE END