前言
博主之前一直是使用手动的方式去申请和续签Let's Encrypt
泛域名SSL证书.最近为了更方便的自动化部署,详细研究使用了acme.sh
这个项目,并成功自动申请了多个域名证书.同时该项目还能够自动续签证书,自动安装证书,支持广泛的环境和场景的部署,功能非常强大.
部署简介
域名证书的申请其实非常简单,只需证明域名的所有权,证书颁发机构即可为你颁发免费的证书文件.整个流程用户最繁琐的步骤就是验证域名的所有权,一般可分为http
和DNS
两种.http
方式是将随机生成的验证文件放入网站的根目录,由机构扫描验证.而DNS
方式则是将随机生成的验证码创建域名的TXT
记录由机构扫描验证.验证通过即可颁发证书.
acme.sh 可以帮用户简化所有权验证的步骤.根据用户提供的Web 路径
或者域名 DNS 的API
,来自动为用户创建验证文件或验证 TXT 记录.并将颁发的证书部署到指定的环境,同时支持到期续签以保持域名有效期.
整个部署流程非常简单,具体为以下三个步骤:
- 准备 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"
一键脚本部署
安装脚本
登陆 VPS 服务器使用官方一键安装脚本安装acme.sh
wget -O - https://get.acme.sh | sh
配置 DNS API
acme.sh 程序目录为隐藏目录.acme.sh
存放在root
下.执行以下命令进入目录,并编辑account.conf
,根据上文获取的 API 格式,复制粘贴到文件中保存.
cd ~/.acme.sh
vi account.conf
申请证书
自动 DNS 模式标准命令:
acme.sh --issue --server letsencrypt --dns dns_dp -d example.com -d www.example.com
其中dns_dp
为 腾讯云DNSPod.cn 服务商,自行根据官方dnsapi修改.例如:dns_ali
为阿里云,dns_cf
为CLoudflare.
以本站域名ioiox.com
为例,申请泛域名证书.执行以下命令:
acme.sh --issue --server letsencrypt --dns dns_dp -d ioiox.com -d *.ioiox.com
多域名证书
acme.sh 可以同时申请多个域名.例如拥有域名aaa.com
,bbb.com
,ccc.com
,只需要在命令后加上-d 空格 域名
即可.
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
自动部署
acme.sh 还支持自动部署证书到指定目录并重启nginx
或apache
服务,以确保新证书生效.官方参考如下:
acme.sh --installcert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
博主的服务器使用的是军哥 LNMP
环境,其中证书路径为/usr/local/nginx/conf/ssl
,重载命令为nginx -s reload
.参考命令为:
acme.sh --installcert -d ioiox.com \
--key-file /usr/local/nginx/conf/ssl/ioiox.com.key \
--fullchain-file /usr/local/nginx/conf/ssl/ioiox.com.cer \
--reloadcmd "nginx -s reload"
更多环境部署直接参考官方文档的参数配置.
自动续签证书
由于 Let's Encrypt 的证书有效期为三个月
.为避免证书失效 acme.sh 会每60
天根据你的历史申请记录和部署记录重新续签证书并部署.
docker 部署
作为忠实的docker fans
,推荐使用 docker 容器部署,支持以下两种方式:
- docker executable 执行模式
- docker daemon 守护模式
docker executable 执行模式
手动创建~/acme.sh
目录,并创建account.conf
文件,粘贴 API 信息.执行以下命令:
docker run --rm -it \
-v ~/acme.sh:/acme.sh \
neilpang/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 守护模式
守护模式启动命令,将DNS API 配置文件
和证书文件
挂载到root
目录下的acme.sh
中.
docker run -itd \
-v ~/acme.sh:/acme.sh \
--net=host \
--name=acme.sh \
--restart=always \
neilpang/acme.sh daemon
进入~/acme.sh
目录,手动创建account.conf
文件并粘贴 API 信息.执行以下命令申请证书:
docker exec 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
结语
生成的证书文件务必使用含有完整证书链的fullchain.cer
和域名.key
来部署,避免因证书不完整出现的错误
.博主就是因为出现过几次证书问题才决心研究使用此方案.以上即是博主近期使用的经历,分享给大家以供参考.当然 acme.sh 还有很多的玩法请参考官方项目:
27 条评论
感谢大佬的教程,我一步步跟着操作,到申请证书这一步,输入指令后,提示以下错误,可以帮忙指教怎么处理吗?感谢!
root@localhost:~# acme.sh --issue --dns dns_cf -d genieoutdoor.com -d a.genieoutdoor.com
[Wed 07 Apr 2021 04:16:02 PM UTC] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Wed 07 Apr 2021 04:16:02 PM UTC] Multi domain='DNS:genieoutdoor.com,DNS:a.genieoutdoor.com'
[Wed 07 Apr 2021 04:16:02 PM UTC] Getting domain auth token for each domain
[Wed 07 Apr 2021 04:16:03 PM UTC] Getting webroot for domain='genieoutdoor.com'
[Wed 07 Apr 2021 04:16:04 PM UTC] Getting webroot for domain='a.genieoutdoor.com'
[Wed 07 Apr 2021 04:16:04 PM UTC] Adding txt value: jy3PqB0CCVXiw9fswIMn5J_gPhPuG4FOEsXSK-Dl-KA for domain: _acme-challenge.genieoutdoor.com
[Wed 07 Apr 2021 04:16:04 PM UTC] invalid domain
[Wed 07 Apr 2021 04:16:04 PM UTC] Error add txt for domain:_acme-challenge.genieoutdoor.com
[Wed 07 Apr 2021 04:16:04 PM UTC] Please add '--debug' or '--log' to check more details.
[Wed 07 Apr 2021 04:16:04 PM UTC] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
提示域名问题.
这个问题按照教程打出日志提交issue吧
https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
好的,我先重新操作试试,谢谢大佬。
使用的阿里域名,容器运行提示无效域名
截图看下错误信息
博主,多个域名服务商的域名需单独加 --accountconf。
能详细说明下如何单独加--accountconf。有相关示例命令吗?
谢谢
--accountconf "/root/.acme.sh/bbb.account.conf"
命令中加这个,自己改下其他conf的路径试试.
我自己没试过这种方案,在官方github issue里找的
这个方法救了我,不知道什么原因啊。不带就提示 invalid domain
IOIOX,帮我看看,出现错误,在保存token到.conf的时候,webshell无法退出,我就把他关了,
就去执行~/.acme.sh/acme.sh --issue --dns dns_namesilo --dnssleep 900 -d cnvc.top -d *.cnvc.top
命令 了,出现一下问题:
[RT-N56UB1-newif2D1-256M 3.4.3.9-099_20-03-1]# 2020-03-10 15:47:58[RT-N56U_B1 /opt/home/admin]# ~/.acme.sh/acme.sh --issue --dns dns_namesilo --dnssleep 900 -d cnvc.top -d .cnvc.top[Tue Mar 10 15:48:39 CST 2020] Multi domain='DNS:cnvc.top,DNS:.cnvc.top' [Tue Mar 10 15:48:39 CST 2020] Getting domain auth token for each domain [Tue Mar 10 15:48:45 CST 2020] Getting webroot for domain='cnvc.top' [Tue Mar 10 15:48:45 CST 2020] Getting webroot for domain='*.cnvc.top' [Tue Mar 10 15:48:45 CST 2020] Adding txt value: _7gknmiChEJZKmA1tp6WaqpMiquiVX4GAY8lyEcLXeI for domain: _acme-challenge.cnvc.top [Tue Mar 10 15:48:45 CST 2020] API token for namesilo.com is missing.[Tue Mar 10 15:48:45 CST 2020] Please specify that in your environment variable.[Tue Mar 10 15:48:45 CST 2020] Error add txt for domain:_acme-challenge.cnvc.top[Tue Mar 10 15:48:45 CST 2020] Please add '--debug' or '--log' to check more details.[Tue Mar 10 15:48:45 CST 2020] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh[RT-N56U_B1 /opt/home/admin]#
这个你只能输出debug发issue了.
你在执行完vi account.conf后,复制token进去后,用什么命令保存退出的?我总觉得这步出错
esc 然后 :wq 回车
不用vi account.conf这部,不好粘贴,直接执行export 就可以了,证书下载了,配置了,还是不行,Frp还要设置吗?谢谢您的指导
博主,我挂了泛域名证书,但是独立门户访问时候还是提示证书错误?为什么呢
要在群晖安全性证书里对每个需要使用证书的项目启用
现在好了,好像是缓存的问题……