前言
上文已经介绍了 acme.sh 的详细实践使用教程,网上关于群晖NAS上使用acme.sh
来自动化申请和部署证书的相关文章已经有很多,由于群晖特殊的环境,只能通过 SSH 登陆到 Linux 环境使用命令来完成操作,对于新手可能并不友好.本文将详细介绍在群晖NAS的DSM 管理界面
利用 docker 部署 acme.sh 服务来申请证书.
部署简介
整个部署流程非常简单,具体为以下三个步骤:
- 准备 DNS API
- 安装 acme.sh
- 执行申请命令
准备 DNS API
通过使用域名服务商提供的 API 密钥,让acme.sh
自动创建域名验证记录以申请域名证书. acme.sh 支持全球各种域名服务商的 API ,本文将以阿里云
,腾讯云
,Cloudflare
为例.更多 DNS API 支持,请查看:官方dnsapi
阿里云
登陆阿里云控制台 - 访问控制 RAM - 用户管理
新建用户并勾选为该用户自动生成AccessKey
复制保存好生成的AccessKey
信息
授权该用户,搜索DNS
,并将AliyunDNSFullAccess
移动至右侧确定.
根据官方dnsapi
获取阿里云的API
格式为:
export Ali_Key="LTAI4Fd8J9qs4fxxxxxxxxxx"
export Ali_Secret="Xp3Z7NDOW0CJcPLKoUwqxxxxxxxxxx"
腾讯云
腾讯云的域名由dnspod.cn
管理,登陆管理控制台,右上角选择密钥管理
,创建密钥并复制保存好生成的ID
和Token
.
根据官方dnsapi
获取DNSPod.cn
的API
格式为:
export DP_Id="124xxx"
export DP_Key="54ddaa41245837600ce713xxxxxxxxxx"
Cloudflare
登陆 Cloudflare 点域名进入,右侧有如下图 API 信息.首先复制保存Account ID
.然后点击Get your API token
.
点击Create Token
创建新 API Token,具体参考如下:
复制保存生成的API Token
根据官方dnsapi
获取CloudFlare
的Using the new cloudflare api token
格式为:
export CF_Token="PfCA6tyLxxxxxxxx-sS6ANgqzuVexxxxxxx"
export CF_Account_ID="1fs48ec7e2063cb70hacc3xxxxxxxxxx"
群晖 docker 部署
群晖NAS的 docker 容器部署,支持以下两种方式:
- docker executable 执行模式
- docker daemon 守护模式
docker executable 执行模式
配置 DNS API
手动创建account.conf
文件.本文以/docker/acme
目录为例.
根据上文获取的 API 格式,复制粘贴并保存.
export DP_Id="xxxxx"
export DP_Key="xxxxxxxxxxxxxxxxxxxx"
AUTO_UPGRADE='1'
下载镜像启动容器
群晖 docker 注册表中搜索acme.sh
并下载latest
最新版.
映像中启动容器
配置容器
高级设置
卷
添加文件夹以挂载配置文件和证书输出目录,选择本文示例的docker/acme
,装载路径为/acme.sh
.
网络勾选
使用与 Docker Host 相同的网络
环境执行命令
中添加以下申请证书命令.本文以本站域名ioiox.com
为例,申请泛域名证书.
--issue --dns dns_dp -d ioiox.com -d *.ioiox.com
DNS 参数
请根据域名 DNS 服务商来修改命令,其中dns_dp
为 腾讯云DNSPod.cn 服务商,自行根据官方dnsapi修改.例如:dns_ali
为阿里云,dns_cf
为CLoudflare.
多域名证书
acme.sh 可以同时申请多个域名.例如拥有域名aaa.com
,bbb.com
,ccc.com
,只需要在命令后加上-d 空格 域名
即可.
--issue --server letsencrypt --dns dns_dp -d aaa.com -d *.aaa.com -d bbb.com -d *.bbb.com -d ccc.com -d *.ccc.com
运行容器
配置完执行命令后应用启动容器
选择容器详情
查看日志显示开始申请证书(右下角刷新日志)
申请成功(右下角刷新日志)
docker executable 执行模式 完成申请后会自动停止容器
证书生成到docker/acme
目录下
到期续签
容器在申请成功之后会自动停止,请保留不要删除.待证书快到期时,只需点击启动即可再次申请.真正实现一键申请证书的需求.
docker daemon 守护模式
docker daemon 守护模式 和 docker executable 执行模式 的 DNS API 配置和前期部署流程一样,依照上文执行到 环境 步骤.
环境
执行命令填写daemon
以常驻运行.
配置完执行命令后应用启动容器,选择容器详情.
选择终端机,点击新增右侧的箭头,通过命令启动.
输入sh
确定
选择sh
的终端,先执行更新命令.
acme.sh --upgrade --auto-upgrade
输入命令申请证书.本文以本站域名ioiox.com
为例,申请泛域名证书.
acme.sh --issue --server letsencrypt --dns dns_dp -d ioiox.com -d *.ioiox.com
开始申请证书
申请成功
DNS 参数及多域名证书
DNS 参数及多域名证书参照上文,注意守护模式的命令要多加一个acme.sh
.
acme.sh --issue --server letsencrypt --dns dns_dp -d aaa.com -d *.aaa.com -d bbb.com -d *.bbb.com -d ccc.com -d *.ccc.com
到期续签
docker daemon 守护模式 下acme.sh
容器会根据申请记录,每60天自动更新证书.
结语
本文讲解的两种部署方式可以根据实际需求选择使用,生成的证书文件务必使用含有完整证书链的fullchain.cer
和域名.key
来部署,避免因证书不完整出现的错误
.博主就是因为出现过几次证书问题才决心研究使用此方案.当然 acme.sh 还有很多的玩法请参考官方项目:
更多群晖NAS相关技巧,教程及信息,请持续关注本站群晖Synology专栏:
34 条评论
需要增加延迟参数--dnssleep 120 不然会报错失败
成功,感谢,但现在是不知道如何让证书自动更新,不然每3个月要手动去重新载入;
不支持,群晖的证书路径比较麻烦,建议自行申请后手动导入覆盖续签。
求指导,貌似链接好几次才连上,连上后,又提示错误
两次链接错误提示:
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 92
Can not init api for: https://acme-v02.api.letsencrypt.org/directory.
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35
Can not init api for: https://acme-v02.api.letsencrypt.org/directory.
第三次:
Using CA: https://acme-v02.api.letsencrypt.org/directory
Create account key ok.
Registering account: https://acme-v02.api.letsencrypt.org/directory
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 35
Registered
ACCOUNT_THUMBPRINT='YhVMwOJFAahmMLd7EqAxjUtNiP-QOhxgZ2y69cCSbNw'
Creating domain key
The domain key is here: /acme.sh/monsxxxx.fun/monsxxxx.fun.key
Multi domain='DNS:monsxxxx,DNS:*.monsxxxx.fun'
Getting domain auth token for each domain
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 28
Create new order error. Le_OrderFinalize not found.
Please add '--debug' or '--log' to check more details.
See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
看样子是你网络问题,国外这些api地址可能被dns污染之类的
现在好像是改了证书供应商,按照这个教程申请失败了,请问怎么改成用let这个供应商
文章更新过,在看看,命令里加 --server letsencrypt
能写个最新的zerossl的教程么,lets貌似要一致试验
把 --server letsencrypt 删除就默认是 zerossl 了
zero需要email,我不太理解格式,查了半天没查明白;
另外最新的docker,dsm 7.0.1,sh写命令,总提示不认
daemon模式下dns api好像就没有用到?
一样用到之前创建的 account.conf 文件,docker 启动时也挂载进去了。
博主回复太好啦。最近群晖上装了docker的qbittorrent,不知道博主接触过没,想用开启https登录,就找教程,遇到问题了,docker的qb是不是不支持群晖默认的.pem证书,然后群晖默认的synology.me域名也不能生成.crt和.key证书~
手动改下证书后缀名就行了。
额,头大,导出默认证书直接重命名了,然后放在qb文件夹certs文件夹里,qb软件里也做了设置,结果不行,现在都不知道是默认域名、证书问题还是路径问题了苦涩ノ,https://hub.docker.com/r/nevinee/qbittorrent 另外还用了个群晖自带的反向代理方法也不行
解决拉!几种方法都可以,还是nas内置的反代比较简单,端口别搞混了,不忘记端口映射,就是心细一点。导出证书重命名文件扩展名,粘贴去到docker容器说明的文件夹内的方法也可以,但是可能有的证书文件夹要做单独的目录映射。(。•ˇ‸ˇ•。)