因为域名在阿里云买的,之前一直在阿里云购买单域名的证书,但是随着需要挂锁的网站越来越多,还是的弄个通配符证书,借助Acme.sh,实现了自动申请部署通配符证书,不用单个申请,也不用担心证书过期了。
本文介绍了在群晖下如何借助acme.sh脚本来自动申请并部署通配符证书,本域名使用CloudFlare进行解析。
获取CloudFlare的API令牌
登录CloudFlare之后,可以通过这个链接访问令牌页面:https://dash.cloudflare.com/profile/api-tokens
点击创建令牌
,使用编辑区域DNS
模板,在区域资源
中选择包括
-特定区域
-你的域名
。
随后设定一个令牌的有效期,点击继续即可生成令牌。
将令牌保存下来以备后用,因为CloudFlare是不保存令牌的,关掉页面就看不见了。
Docker配置
在注册表搜索安装neilpang/acme.sh
这个映像,随后安装。
创建一个文件夹用于存放文件,例如我创建在docker/acme
,将此文件夹映射到/acme.sh
。
网络选项卡选择使用与Docker Host相同的网络。
环境变量添加如下内容:
变量名 | 变量值 |
CF_TOKEN | 第一步获取的API令牌 |
SYNO_Port | 群晖的内网端口号,默认为5000 |
SYNO_Username | 登录群晖的用户名 |
SYNO_Password | 登录密码 |
SYNO_Certificate | 要添加的证书的名字,空字符串("")为替换默认证书 |
这里要借助群辉的端口,用户名,密码,才能自动登录到系统中部署证书。
环境变量设置完成后,在最下方命令处输入”daemon“,随后完成Docker设置并启动Docker。
脚本配置
Docker设置好后并不会申请证书,要配合脚本使用来触发,并且可以通过将脚本放入任务计划来自动更新证书。
本地新建一个.sh
脚本文件,填写如下内容:
#!/bin/bash
# 域名
DOMAIN='lufer.cc'
# # DNS类型,dns_ali dns_dp dns_gd dns_aws dns_linode根据域名服务商而定,CloudFlare就是dns_cf
DNS='dns_cf'
# DNS API 生效等待时间 值(单位:秒),一般120即可
# 某些域名服务商的API生效时间较大,需要将这个值加大(比如900)
DNS_SLEEP=120
# 证书服务商,zerossl 和 letsencrypt,我使用letsencrypt,使用zerossl还需要注册
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 neilpang-acme.sh1 $generateCrtCommand
docker exec neilpang-acme.sh1 $installCrtCommand
此处注意最后两行,我的Docker创建的容器实例名字就叫做 neilpang-acme.sh1
,在编写脚本时注意改为实际docker实例名字。
自动运行
为了实现自动更新证书,我们把脚本上传至群晖内某个特定文件夹,并右键查看文件属性,得到文件的实际存储位置,例如我放在了/volume1/docker/cert-docker.sh
。
打开控制面板
-任务计划
,新增一个计划的任务
-用户定义的脚本
。
在计划
选项卡下设置为在以下日期运行
-每月重复
,这样就可以每月自动更新一次证书。
在任务设置
选项卡下的运行命令
中,输入如下脚本:
bash /volume1/docker/cert-docker.sh >>/volume1/docker/log.txt 2>&1
其中前面为脚本所在路径,后面为希望存放日志文件的路径。
保存即可。
运行
创建计划任务之后,可以手动运行一次,随后在先前设定的目录下查看日志文件,看见如下内容,即是部署成功。
[Fri Jul 1 03:02:21 UTC 2022] Logging into localhost:5000
[Fri Jul 1 03:02:22 UTC 2022] Getting certificates in Synology DSM
[Fri Jul 1 03:02:22 UTC 2022] Generate form POST request
[Fri Jul 1 03:02:22 UTC 2022] Upload certificate to the Synology DSM
[Fri Jul 1 03:02:22 UTC 2022] http services were NOT restarted
[Fri Jul 1 03:02:22 UTC 2022] Success
打开控制面板,就可以在证书中看见刚刚部署好的证书了。
文章评论
存储文件夹那边,装载路径填什么呢?
@Enzo 创建一个文件夹用于存放文件,例如我创建在docker/acme,将此文件夹映射到/acme.sh。
所以文件夹就选docker/acme 装载路径就填/acme.sh
报错了博主,求助~
[Sat Sep 24 05:30:16 UTC 2022] Can not init api, for letsencrypt
/usr/local/bin/acme.sh: .: line 5693: can't open '/acme.sh/heyfly.tk
/heyfly.tk
.conf': No such file or directory
@匿名 这个文件夹下应该是自动生成的,你的域名的conf,你检查下你映射的文件夹是否给了everyone写权限?会不会是权限不足没有写入
麻烦问一下博主,通配符证书需要在网址前加*吗
@Sean 不需要,他默认就是通配下一级域名
请问华为云 变量名怎么写?
dns_huaweicloud
@snba 目前应该还不支持华为云,具体支持列表
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
@Lufer 支持huawei的 但是参数是在doker变量里写 还是映射目录里的文件里写呢?有的教程说是 创建 /docker/acme.sh 文件夹,再手动创建 account.conf 文件
You didn't specify a Cloudflare api key and email yet.
api都填了
@匿名 博主写错了,应该是CF_Token和CF_Email,可以看我这边的例子:
docker run -d \
--name acme \
--net=host \
-v /volume1/docker/acme:/acme.sh \
-e CF_Token=你的CFToken \
-e CF_Email=注册CF的邮箱 \
-e SYNO_Port=群晖http端口 \
-e SYNO_Username=群晖用户名 \
-e SYNO_Password="群晖密码" \
-e SYNO_Certificate="" \
neilpang/acme.sh:latest daemon
提示[Wed Jun 7 06:42:48 UTC 2023] Getting certificates in Synology DSM
[Wed Jun 7 06:42:48 UTC 2023] Generate form POST request
cat: /acme.sh/sanshaoyedejian.eu.org_ecc/sanshaoyedejian.eu.org.cer: No such file or directory
cat: /acme.sh/sanshaoyedejian.eu.org_ecc/ca.cer: No such file or directory
[Wed Jun 7 06:42:48 UTC 2023] Upload certificate to the Synology DSM
[Wed Jun 7 06:42:48 UTC 2023] Unable to update certificate, error code {"error":{"code":5510},"success":false}
[Wed Jun 7 06:42:48 UTC 2023] Error deploy for domain:sanshaoyedejian.eu.org
[Wed Jun 7 06:42:48 UTC 2023] Deploy error.
@匿名 这个日志是部署的时候没找到证书,要看一下前面的日志,是不是没有生成证书,或者生成的证书放在了哪里。
我试了,成功了,区域DNS那个令牌无效,必须用全局那个,就是查看里的密钥
谷歌ddns如何申请,用以上的代码不能申请
@匿名 全网找不到,我的也是谷歌ddns,无法申请