第一次使用 acme.sh 的时候,各种教程翻来覆去,总给我一个看懂了但有没啥用的感觉
(脑子:我会了;手:不,你没有!)

PS:这篇博客没啥用,acme.sh的官方WiKi更详细

安装acme.sh

curl https://get.acme.sh | sh -s email=输入自己的邮箱

手搓代码,一键将 acme.sh 安装在当前用户的家目录下,即~/.acme.sh

安装完成后添加环境变量:

1
2
3
4
5
vim ~/.bashrc
# 添加下面这一句
source ~/.acme.sh/acme.sh.env
# 重载环境变量
source ~/.bashrc

设置默认CA

acme.sh 在 v3.0 以上的版本使用 ZeroSSL 作为默认CA,如果需要更改,使用以下命令:

1
2
3
4
5
# 改为Let's Encrypt
acme.sh --set-default-ca --server letsencrypt

# 改为ZeroSSL
acme.sh --set-default-ca --server zerossl

颁发SSL证书

acme.sh 有两种方式,可细分为三种,请按照需要直接跳转到需要到方式查看对应的文字

1. HTTP方式

该方式只需指定域名和域名所在的网站根目录,并且需要开启80端口,保证端口空闲即可,然后使用以下命令颁发证书:

1
2
3
4
acme.sh --issue -d 域名 --webroot 域名根目录

# 对于多域名
acme.sh --issue -d 域名1 -d 域名2 --webroot 域名根目录

2. 手动DNS方式

手动DNS即手动添加一条TXT解析记录该方式无法自动更新证书

  1. 生成TXT解析记录
1
2
acme.sh --issue --dns -d 域名 \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

输出如下:

1
2
3
4
5
<省略>                       
[Tue Jun 12 03:00:07 UTC 2022] Add the following TXT record:
[Tue Jun 12 03:00:07 UTC 2022] Domain: '_acme-challenge.mydomain.com'
[Tue Jun 12 03:00:07 UTC 2022] TXT value: 'uWWS6tp3g8vusnS5P5HaMr5w4He6mXroDDkofALCCpU'
<省略>
  1. 向DNS解析添加TXT记录
    按照其输出,在名称填入_acme-challenge.mydomain.com,值填入uWWS6tp3g8vusnS5P5HaMr5w4He6mXroDDkofALCCpU

  2. 验证DNS记录并颁发证书

1
2
acme.sh --issue --dns -d 域名 \
--yes-I-know-dns-manual-mode-enough-go-ahead-please --renew

3. 自动DNS方式

即使用DNS API自动添加TXT记录并完成验证

注:Freenom注册的 tk / ml / ga / cf / gq 等免费域名无法使用API验证


  1. 获取域名提供商API的IDKEY,以CloudFlare为例
    Cloudflare有全局API密钥和API令牌之分,安全起见,推荐使用API令牌

点击进入我的个人资料 ⇒ API令牌 ⇒ 创建令牌
toAPI

创建自定义令牌,权限为区域,DNS的读取和编辑权限
editAPI

显示摘要,确认创建
showAPI

复制API令牌,该令牌只显示一次
APIvalue

  1. 将API令牌写入环境变量
1
2
export CF_Token="API令牌"
export CF_Account_ID="账户ID" #进入某一个绑定的域名页面,其概述页面右下角即可复制账户ID
  1. 颁发证书
1
acme.sh --issue --dns dns_cf -d 域名

不同的DNS解析商的环境变量不同,下表列出几个常用DNS解析商,具体访问acme.sh WIKI

DNS 环境变量名 –dns
CloudFlare CF_Token; CF_Account_ID dns_cf
DNSPod.cn DP_Id; DP_Key dns_dp
Aliyun Ali_Key; Ali_Secret dns_ali
Amazon Route53 AWS_ACCESS_KEY_ID; AWS_SECRET_ACCESS_KEY dns_aws

安装证书

1
2
3
4
5
acme.sh --install-cert -d 域名 \
--cert-file 指定路径 \ #证书路径,指定为你在Nginx/Apache配置文件设置的证书路径,该参可省略,使用fullchain
--key-file 指定路径 \ #密钥路径,指定为你在Nginx/Apache配置文件设置的密钥路径
--fullchain-file 指定路径 #证书与中间证书,指定为你在Nginx/Apache配置文件设置的证书路径,Nginx必须使用fullchain
--reloadcmd "service nginx force-reload" #Apache是service apache2 force-reload。重启Nginx/Apache加载证书

更新证书

除手动添加DNS生成证书之外,acme.sh会自动更新证书,仅需保证定时程序cron/crontab等安装正确即可