本文为博主转载并根据博主自身经验加以补充修改(cloudflare+acme.sh)
原文章:https://www.ioiox.com/archives/88.html
前言
上文已经介绍了 acme.sh 的详细实践使用教程,网上关于群晖NAS上使用acme.sh来自动化申请和部署证书的相关文章已经有很多,由于群晖特殊的环境,只能通过 SSH 登陆到 Linux 环境使用命令来完成操作,对于新手可能并不友好.本文将详细介绍在群晖NAS的DSM 管理界面利用 docker 部署 acme.sh 服务来申请证书.
由于全自动化部署的整个流程不确定因素过多,所以本文仅针对申请步骤实现真正的一键申请.为保险起见还是手动导入证书.
acme.sh 是一款方便,强大的 Let's Encrypt 域名证书申请续签程序.支持一键脚本和 docker部署.支持 http 和 DNS 两种域名验证方式,其中包括手动,自动 DNS 及 DNS alias 模式方便各种环境和需求.可同时申请合并多张单域名,泛域名证书,并自动续签证书和部署到项目.
部署简介
整个部署流程非常简单,具体为以下三个步骤:
准备 DNS API
安装 acme.sh
执行申请命令
本文以最常规的 DNS API 验证模式为例,其他方式请参考官方Wiki.
准备 DNS API
通过使用域名服务商提供的 API 密钥,让acme.sh自动创建域名验证记录以申请域名证书. acme.sh 支持全球各种域名服务商的 API ,本文将以阿里云,腾讯云,Cloudflare为例.更多 DNS API 支持,请查看:官方dnsapi
阿里云
推荐使用子账户,并赋予子账户 DNS 权限,以确保安全性.
登陆阿里云控制台 - 访问控制 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 分为 global api key 全局 API 和创建 new api token ,网上各种教程都是使用全局 API .为确保安全,推荐创建 new api token 来使用.
登陆 Cloudflare 点域名进入,右侧有如下图 API 信息.首先复制保存Account ID.然后点击Get your API token.
点击Create Token创建新 API Token,具体参考如下:
其中 Zone Resources 选择你的 Cloudflare 账户邮箱
复制保存生成的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 执行模式
群晖NAS的 DSM 中以 docker executable 执行模式 创建 docker 容器,会在创建时根据执行命令来申请证书,并在证书申请完成后停止容器.
配置 DNS API
手动创建account.conf文件.本文以/docker/acme目录为例.
根据上文获取的 API 格式,复制粘贴并保存.
实践过程中遇到自动生成的 AUTO_UPGRADE='1' 参数可能会导致 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.comDNS 参数
请根据域名 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 守护模式
群晖NAS的 DSM 中以 docker daemon 守护模式 创建 docker 容器,容器将常驻运行.通过容器终端机来执行证书申请命令.此方案适合经常申请证书的场景,无需多次配置容器参数.
配置 DNS API
手动创建account.conf文件.本文以/docker/acme目录为例.
根据上文获取的 API 格式,复制粘贴并保存.
实践过程中遇到自动生成的 AUTO_UPGRADE='1' 参数可能会导致 API 格式错误.建议手动加入.
export DP_Id="xxxxx"
export DP_Key="xxxxxxxxxxxxxxxxxxxx"
AUTO_UPGRADE='1'下载镜像启动容器
群晖 docker 注册表中搜索acme.sh并下载latest最新版.
映像中启动容器
配置容器
高级设置
卷
添加文件夹以挂载配置文件和证书输出目录,选择本文示例的docker/acme,装载路径为/acme.sh.
装载路径由镜像作者规定,不能修改,请直接复制粘贴.
网络勾选使用与 Docker Host 相同的网络
环境
执行命令填写daemon以常驻运行.
配置完执行命令后应用启动容器,选择容器详情.
选择终端机,点击新增右侧的箭头,通过命令启动.
输入sh确定
选择sh的终端,先执行更新命令.
acme.sh --upgrade --auto-upgrade原博主不是CF 所以下面的命令dns_dp需要修改到相应的CF格式dns_cf
输入命令申请证书.本文以本站域名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 还有很多的玩法请参考官方项目:https://github.com/acmesh-official/acme.sh