群晖部署Let’s Encrypt 泛域名SSL证书自动更新

我们都知道可以使用 Let’s Encrypt 免费申请 HTTPS 证书。acme协议支持泛域名(wildcard),可以只申请一个类似*.xxx.com的证书,而不需要单独为每个子域名申请证书了。

1 docker部属

注册表搜索acme,下载,运行

2 高级设置

1)映射文件夹如下

2)环境变量

Ali_Key : 填入第一步获取的 AccessKey ID

Ali_Secret : 填入第一步获取的 AccessKey Secret

SYNO_DID : 填入第二步获取的 DID (没有设置两步验证的忽略)

SYNO_Port : 填入群晖内网的端口号(我用的默认端口5000未修改)

SYNO_Username : 登录群晖的用户名

SYNO_Password : 登录群晖的密码

SYNO_Certificate :空字符串("")为替换默认证书

3)网络选host,命令中输入”daemon“

4)下一步,运行容器

Docker设置好后并不会申请证书,要配合脚本使用来触发,并且可以通过将脚本放入任务计划来自动更新证书。

3 配置定时任务

本地新建一个.sh脚本文件,cert.sh,填写如下内容:

#!/bin/bash

# 域名

DOMAIN='xxx.com'

# # DNS类型,dns_ali dns_dp dns_gd dns_aws dns_linode根据域名服务商而定,CloudFlare就是dns_cf

DNS='dns_dp'

# DNS API 生效等待时间 值(单位:秒),一般120即可

# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)

DNS_SLEEP=120

# 证书服务商,letsencrypt

CERT_SERVER='letsencrypt'

generateCrtCommand="acme.sh --force --log --issue --server ${CERT_SERVER} --dns ${DNS} --dnssleep ${DNS_SLEEP} -d "${DOMAIN}" -d "*.${DOMAIN}""

installCrtCommand="acme.sh --deploy -d "${DOMAIN}" -d "*.${DOMAIN}" --deploy-hook synology_dsm"

docker exec acme $generateCrtCommand

docker exec acme $installCrtCommand

此处注意最后两行,我的Docker创建的容器实例名字就叫做acme,在编写脚本时注意改为实际docker实例名字

4 自动运行

为了实现自动更新证书,我们把脚本上传至群晖内某个特定文件夹,并右键查看文件属性,得到文件的实际存储位置,例如我放在了/volume3docker/acme.sh/acme.sh

打开控制面板-任务计划,新增一个计划的任务-用户定义的脚本

用户选root,在计划选项卡下设置为在以下日期运行-每月重复,这样就可以每月自动更新一次证书。

任务设置选项卡下的运行命令中,输入如下脚本:

bash /volume3/docker/acme.sh/acme.sh>>/volume3/docker/acme.sh/log.txt 2>&1

其中前面为脚本所在路径,后面为希望存放日志文件的路径。

保存即可。

5 运行

创建计划任务之后,可以手动运行一次,随后在先前设定的目录下查看日志文件,看见如下内容,即是部署成功。

[Wed Nov 15 12:10:46 UTC 2023] Cert success.

打开控制面板,就可以在证书中看见刚刚部署好的证书了。

 

注意:

SYNO_Certificate变量值与群晖默认证书的描述不一致

解决方法1:如果按照站内教程设置过变量SYNO_Certificate="",则将群晖内默认证书的描述改为""。或者根据日志内escaped_certificate的值修改为对应描述(注意不要把转义带进去)

 

解决方法2: 如果不想给证书写描述,则可以将容器设置里的变量SYNO_Certificate删掉,并将域名配置文件内的SAVED_SYNO_CERTIFICATE设置为''。

域名配置文件路径为:/docker/acme/xxxx_ecc/xxxx.conf

评论