自动化部署证书 acme.sh 详细实践使用教程

前言

博主之前一直是使用手动的方式去申请和续签Let's Encrypt泛域名SSL证书.最近为了更方便的自动化部署,详细研究使用了acme.sh这个项目,并成功自动申请了多个域名证书.同时该项目还能够自动续签证书,自动安装证书,支持广泛的环境和场景的部署,功能非常强大.

acme.sh 是一款方便,强大的 Let's Encrypt 域名证书申请续签程序.支持一键脚本和 docker 部署.支持 http  DNS 两种域名验证方式,其中包括手动,自动 DNS  DNS alias 模式方便各种环境和需求.可同时申请合并多张单域名,泛域名证书,并自动续签证书和部署到项目.

acmesh-official/acme.sh

部署简介

域名证书的申请其实非常简单,只需证明域名的所有权,证书颁发机构即可为你颁发免费的证书文件.整个流程用户最繁琐的步骤就是验证域名的所有权,一般可分为httpDNS两种.http方式是将随机生成的验证文件放入网站的根目录,由机构扫描验证.而DNS方式则是将随机生成的验证码创建域名的TXT记录由机构扫描验证.验证通过即可颁发证书.

acme.sh 可以帮用户简化所有权验证的步骤.根据用户提供的Web 路径或者域名 DNS 的API,来自动为用户创建验证文件或验证 TXT 记录.并将颁发的证书部署到指定的环境,同时支持到期续签以保持域名有效期.

整个部署流程非常简单,具体为以下三个步骤:

  • 准备 DNS API
  • 安装 acme.sh
  • 执行申请部署命令

本文以最常规的 DNS API 验证模式并自动部署到 nginx 环境为例,其他方式请参考官方Wiki.


准备 DNS API

通过使用域名服务商提供的 API 密钥,让acme.sh自动创建域名验证记录以申请域名证书. acme.sh 支持全球各种域名服务商的 API ,本文将以阿里云,腾讯云,Cloudflare为例.更多 DNS API 支持,请查看:官方dnsapi

阿里云

推荐使用子账户,并赋予子账户 DNS 权限,以确保安全性.

登陆阿里云控制台 - 访问控制 RAM - 用户管理 新建用户并勾选为该用户自动生成AccessKey

自动化部署证书 acme.sh 详细实践使用教程插图

 

授权该用户,搜索DNS,并将AliyunDNSFullAccess移动至右侧确定.

自动化部署证书 acme.sh 详细实践使用教程插图1

根据官方dnsapi获取阿里云的API格式为:

export Ali_Key="LTAI4Fd8J9qs4fxxxxxxxxxx"
export Ali_Secret="Xp3Z7NDOW0CJcPLKoUwqxxxxxxxxxx"

腾讯云

腾讯云的域名由dnspod.cn管理,登陆管理控制台,右上角选择密钥管理,创建密钥并复制保存好生成的IDToken.

自动化部署证书 acme.sh 详细实践使用教程插图2

根据官方dnsapi获取DNSPod.cnAPI格式为:

export DP_Id="124xxx"
export DP_Key="54ddaa41245837600ce713xxxxxxxxxx"

一键脚本部署

安装脚本

登陆 VPS 服务器使用官方一键安装脚本安装acme.sh

wget -O -  https://get.acme.sh | sh 自动化部署证书 acme.sh 详细实践使用教程插图3

配置 DNS API

acme.sh 程序目录为隐藏目录.acme.sh存放在root下.执行以下命令进入目录,并编辑account.conf,根据上文获取的 API 格式,复制粘贴到文件中保存.

cd ~/.acme.sh
vi account.conf 自动化部署证书 acme.sh 详细实践使用教程插图4

注意目前account.conf仅支持一个 DNS API ,多个域名服务商的域名需单独加--accountconf参数:相关 issues 链接

申请证书

自动 DNS 模式标准命令:

acme.sh --issue --server letsencrypt --dns dns_dp -d example.com -d www.example.com

其中dns_dp腾讯云DNSPod.cn服务商,自行根据官方dnsapi修改.例如:dns_ali阿里云,dns_cfCLoudflare.

以本站域名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

多域名申请证书会将多个证书合并为一个证书,并存放到以第一个域名命名的文件夹内,证书信息仅显示第一个域名的信息.

 

同一个 DNS 服务商通过 API 签发证书,只能保存一个域名的 Token 信息。而解决方法有三种,推荐前两种:

  1. 使用不同的 Linux 用户进行证书申请。
  2. 签发时指定 home 文件路径,通过添加 --config-home 参数实现:
mkdir /root/.acme2
acme.sh --config-home /root/.acme2 --issue --dns dns_cf -d domain.tld

此时你的 crontab 自动任务也要做出对应的修改,新增一个任务,并且时间最好和默认的 acme.sh 任务错开:

# 默认任务
20 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
# 新增任务
40 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --config-home "/root/.acme2" > /dev/null
  1. 签发证书时指定配置文件,通过添加 --accountconf 参数实现:
acme.sh --issue --dns dns_cf -d domain.tld --accountconf /root/.acme.sh/account-custom.conf

同样,crontab 自动任务也要做出对应的修改。

 

自动部署

acme.sh 还支持自动部署证书到指定目录并重启nginxapache服务,以确保新证书生效.官方参考如下:

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 执行模式

docker executable 执行模式 acme.sh 容器无需常驻运行,执行 docker run 命令申请证书.并自动删除容器.

手动创建~/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

由于Let's Encrypt的政策经常更新,请及时更新 acme.sh 镜像,docker executable 执行模式请在执行前手动docker pull更新镜像.

docker daemon 守护模式

docker daemon 守护模式 acme.sh 容器将常驻运行,执行 docker exec 命令申请证书.

守护模式启动命令,将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

由于Let's Encrypt的政策经常更新,请及时更新 acme.sh 镜像,docker daemon 守护模式可以搭配之前推荐的Watchtower来实时更新容器镜像.


结语

生成的证书文件务必使用含有完整证书链的fullchain.cer域名.key来部署,避免因证书不完整出现的错误.博主就是因为出现过几次证书问题才决心研究使用此方案.以上即是博主近期使用的经历,分享给大家以供参考.

温馨提示:
本文最后更新于:2024-01-25 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
版权声明 1. 本网站名称:稻草人笔记   永久网址:https://www.facekun.com
2. 本文链接:自动化部署证书 acme.sh 详细实践使用教程: https://www.facekun.com/arts/1368.html
3. 部分文章内容来源于网络,仅作为学习展示之用,版权归原作者所有
4. 因部分文章网络流转次数较多,已无法追溯至原作者,若遗漏导致侵犯了您的权益,请您来信告知我,确认后会尽快删除。
5. 本站禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6. 如无特别声明本文即为原创文章仅代表个人观点,版权归《稻草人笔记》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
< <上一篇
下一篇>>