在当今信息化高速发展的社会,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门户里已经上传的默认证书的描述相同。描述不同的话只会新增加一张证书,并不会替换原有的证书。
运行容器:
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
4、添加计划任务
定时执行
最后一步就是添加一个计划任务,每个月定时更新一次证书。控制面板->计划任务->新增,我设置为每月运行一次,运行脚本
在 DSM 控制面板中,打开“任务计划程序”并为用户定义的脚本创建一个新的计划任务。
常规设置:任务名:acme 用户:root
计划:设置每周续订。例如,每周六上午 11:00。
任务设置:用户定义的脚本:
#renew certificates
bash /volume1/docker/acme/AutoCert.sh >>/volume1/docker/acme/log.txt 2>&1
方案一完成更新
方案二、本地脚本更新,无需群晖的账号
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)