而使用第三方工具来进行Let’s Encrypt 证书续签,网上资料也比较少,下面讲解下acme.sh这个工具在威联通QTS 5.0版本上的部署及使用,以及说下各种坑点。
功能及特点:
1.自动续签更新证书;
2.支持证书更新通知(QQ、Dingtalk钉钉、Telegra–m、Email等)
申请证书方式(分为http和dns两种):
1.http方式不适合于NAS使用,该方式需要通过80、443端口验证域名访问状态,而国,,,内—网络环境因素一般家用宽带是不给用80、443等端口的。
2.dns方式
先说下原理,如果你NAS用的域名在Cloudflare、阿里云、腾讯Dnspod等服务商处做过DDNS解析,就好理解了,首先在DNS服务商申请一个API Key,然后添加到acme.sh配置文件中,执行shell脚本+crontab定时任务,实现每3个月进行SSL证书的申请和更换(讲真威联通做的不如群晖,shell脚本和crontab在网页中配不了,必须连ssh去配)。
【截至目前支持75家DNS厂商的API】
国内常用的主要有Cloudflare、腾讯DNSPod.cn、GoDaddy、阿里云等。
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
【申请DNS-API】
关于DDNS用过阿里云、Dnspod的,结果发现兼容性最好的还是Cloudflare,还支持免费CDN加速。所以其他几家的配法我就不讲了,有兴趣的看完这篇文章后,自己搞搞。
1.注册Cloudflare账号
https://www.cloudflare.com/zh-cn/
【DNS解析并获取API】
2.自己域名的DNS解析权限迁移到Cloudfla(也就是改DNS名称服务器)
3.我的个人资料->API令牌->API密钥->查看并复制Global API Key,
注意!是API密钥下面的Global API Key。
注意!是API密钥下面的Global API Key。
注意!是API密钥下面的Global API Key
PS:避坑!
1.NAS环境准备
【开启威联通的SSH】
先打开,整个部署完后记得关闭,不安全。
【文件卷自定义目录下创建acme文件夹】
文件卷2(DataVol2)下创建Docker文件夹-创建acme文件夹
这个路径可以根据自己的需求自定义,后面的shell脚本中需同步修改
【找到acme文件夹绝对路径】
DataVol2对应的绝对路径是/share/CACHEDEV2_DATA/
则acme文件夹的绝对路径为/share/CACHEDEV2_DATA/Docker/acme/
【创建stunnel软连接】
ssh连到NAS上,用putty、Sercity CRT、Xs–hell等SSH连接工具都可以。
ln -s /etc/stunnel /share/CACHEDEV2_DATA/Docker/acme/
(/share/后面的路径根据自己设定的文件夹进行更改)
执行ls /share/CACHEDEV2_DATA/Docker/acme/stunnel/
命令,出现如下图证书等文件,说明软连接创建成功
2.打开ContainerStation,创建-搜索neilepang/acme.sh镜像,安装
3.这里也是坑点!此时弹出创建容器窗口,啥都不要动直接点创建,然后在把该镜像首次创建的容器删掉,保留镜像,镜像别删。
4.进入资源-镜像文件,找到镜像neilepang/acme.sh这行,点+符号再次创建容器(亲测首次创建的容器环境变量加载有问题,导致容器启动异常,所以第3步删除容器必须得操作)
5.建议容器名称一栏修改为acme.sh,如果不用这个名称也可以,后面配置shell脚本时要同步修改,否则会报错。命令一栏改为daemon。然后点高级设置
6.环境-设置CF_Key、CF_Email的值为你的API密钥和注册Cloudflare用的邮箱
8.新增存储空间下面留空,挂载路径如图默认;挂载本机共享文件夹选择前面创建的acme文件夹,挂载路径/acme.sh。挂载本机共享文件夹选择acme文件夹下创建的软连接stunnel文件夹
脚本下载链接:
点此下载:>>qnap_acme.sh
将qnap_acme.sh放到acme文件夹下,并设置执行权限。
如果你的acme文件夹路径和我的不一样,打开qnap_acme.sh脚本后,需将里面的/share/CACHEDEV2_DATA/Docker/acme/路径替换为自己的路径。然后手动将脚本中命令依次执行下,没有报错,即可往下配置crontab定时任务了**(重点:NAS自建的管理员会提示权限不够,需使用admin用户操作)**。
可参考下列图片中的输出文件,判断脚本命令执行是否正常
+执行申请证书命令成功后,acme文件夹中会自动新增*.xx.com文件夹(*.xx.com为你的域名)+
+acme文件夹下的account.conf文件中,会显示你环境变量中配的CF_Key和CF_Email值,并由此生成SAVED_HASH值+
+*.xx.com文件夹下会有后缀为.cer和.key的证书及私钥+
PS:这里注意下,由于威联通是将cer证书和key私钥合并到这个stunnel.pem文件里了,所以新证书是否替换成功,可通过该文件修改时间和修改前后文件内容来判断
Shell脚本使用过程中有任何问题,欢迎留言。看到后会回复
# 每两个月执行一次qnap_acme.sh脚本
echo "20 2 1 */2 * /bin/bash /share/CACHEDEV2_DATA/Docker/acme/qnap_acme.sh" >> /etc/config/crontab
# 查看最后一行计划任务是否添加成功
more /etc/config/crontab
# 重启crontab服务
crontab /etc/config/crontab && /etc/init.d/crond.sh restart
1.目前新版本的acme.sh默认证书分发机构为ZeroSSL,导致申请Let’s Encrypt证书时,总是提示各种报错(提示未设置Email、acme.sh版本需更新等等),这里很坑,最后看了官方文档需要先切换默认证书分发机构由ZeroSSL切换为Let’s Encry才可以,为啥不用阿里云、腾讯云的证书?懂得都懂,就是因为他们泛解析证书不免费,不然一年换一次多香都懒的配置自动续签了。
默认证书分发机构切换方式:
威联通docker方式部署好acme.sh工具后,SSH连到NAS上执行以下命令。
docker exec acme.sh --set-default-ca --server letsencrypt
2.申请证书时,报错You can get yours from here xx.xx.xx,Error add txt for domain:_acme-challenge.xx.xx,使用–debug模式,输出报错日志,提示:"errors":[{"code":6003,"message":"Invalid request headers","error_chain":[{"code":6103,"message":"Invalid format for X-Auth-Key header"}]}],"messages":[],"result":null}'
# 申请证书时,使用debug模式输出错误日志。
docker exec acme.sh --issue --debug 2 --dns dns_cf -d xx.com -d *.xx.com
如果debug模式下,报错code里有6003,这里一般是CF_Key和CF_Email的值错了,检查下Cloudflare注册邮箱、API密钥是否正确,这里我卡了很久,应该填API密钥,但错误的把API令牌给填进去了。
结束语
关于acme.sh的其它DNS服务商API配置方法,还有钉钉通知等功能可参考:
https://zhuanlan.zhihu.com/p/393423092