acme.sh 生成 ssl DV 证书的方法
acme.sh 项目地址:https://github.com/acmesh-official/acme.sh
1. 安装 acme.sh
https://github.com/acmesh-official/acme.sh/wiki/How-to-install
通过官方网站安装(此方式推荐国外的主机安装)
curl https://get.acme.sh | sh -s email=my@example.com
# 或
wget -O -  https://get.acme.sh | sh -s email=my@example.com
 
通过 GitHub RAW 文件安装
curl https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  my@example.com
# 或
wget -O -  https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  my@example.com
 
通过 Git 命令安装
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
高级安装
git clone https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install  \
--home ~/myacme \
--config-home ~/myacme/data \
--cert-home  ~/mycerts \
--accountemail  "my@example.com" \
--accountkey  ~/myaccount.key \
--accountconf ~/myaccount.conf \
--useragent  "this is my client."
2. 配置 DNS
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
将 DNS API 添加到 ~/.bashrc 内,并使之生效 source ~/.bashrc
export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Account_ID="xxxxxxxxxxxxx"
3. 配置 DNS 别名模式(推荐)
别名模式好处:
- 可让不支持的 DNS 厂商通过现有已支持的厂商得到扩展支持;
 
- 可通过一个不重要的账号来统一生成证书,防止重要的 DNS Token 泄露;
 
https://github.com/acmesh-official/acme.sh/wiki/DNS-alias-mode
首先设置域名别名(CNAME)
aliasDomainForValidationOnly.com 域名为 CloudFlare 上,的域名别名,example.com 域名为将要生成证书的域名。
将需要生成证书的域名 example.com 的主机名 _acme-challenge 设置为 _acme-challenge.aliasDomainForValidationOnly.com
_acme-challenge.example.com
   =>   _acme-challenge.aliasDomainForValidationOnly.com
即
_acme-challenge.example.com	IN	CNAME	_acme-challenge.aliasDomainForValidationOnly.com.
 
签发证书
acme.sh --issue  \
  -d  example.com --challenge-alias aliasDomainForValidationOnly.com --dns dns_cf
 
多个证书域名可以设置同一个别名
_acme-challenge.example.com
  =>   _acme-challenge.aliasDomainForValidationOnly.com
_acme-challenge.www.example.com
  =>   _acme-challenge.aliasDomainForValidationOnly.com
_acme-challenge.sub.example.com
  =>   _acme-challenge.aliasDomainForValidationOnly.com
_acme-challenge.example.net
  =>   _acme-challenge.aliasDomainForValidationOnly.com
_acme-challenge.example.org
  =>   _acme-challenge.aliasDomainForValidationOnly.com
支持泛域名
acme.sh --issue  \
  -d  example.com --challenge-alias aliasDomainForValidationOnly.com --dns dns_cf \
  -d  example.net \
  -d  example.org \
  -d  *.example.com \
  -d  *.example.net \
  -d  *.example.org
 
多个域名分别不同的提供商
_acme-challenge.example.com
  =>   _acme-challenge.aliasDomainForValidationOnly.com
_acme-challenge.example.net
  => _acme-challenge.aliasDomainForValidationOnly2.com
签发证书
acme.sh --issue  \
  -d  example.com --challenge-alias aliasDomainForValidationOnly.com --dns dns_cf \
  -d  example.net --challenge-alias aliasDomainForValidationOnly2.com
不同的 DNS 提供商
acme.sh --issue  \
  -d  example.com --challenge-alias aliasDomainForValidationOnly.com --dns dns_cf \
  -d  example.net --challenge-alias aliasDomainForValidationOnly2.com  --dns dns_gd
 
混合提供商
_acme-challenge.extern1.example.net
  =>   _acme-challenge.aliasDomainForValidationOnly.com
签发证书
./acme.sh/acme.sh --issue \
   -d host1.example.com   --challenge-alias no \
   -d host2.example.com   --challenge-alias no \
   -d extern1.example.net --challenge-alias aliasDomainForValidationOnly.com \
   --dns dns_infoblox
 
设置完成并签发证书后,不要移除相关的别名,否则会影响续签功能。
 
参数 challenge-alias or domain-alias 的不同
CNAME:
_acme-challenge.A.com
   =>   _acme-challenge.B.com
签发证书
acme.sh --issue -d  a.com  --challenge-alias  b.com  --dns dns_cf
若使用 --domain-alias,则别名 CNAME 应该设置为
CNAME:
_acme-challenge.A.com
   =>    myalias.B.com
签发证书
acme.sh --issue -d  a.com  --domain-alias  myalias.B.com   --dns dns_cf
案例
以 ZeroSSL 为例
注册账号
acme.sh  --register-account  -m myemail@example.com --server zerossl
或
acme.sh  --register-account  --server zerossl \
        --eab-kid  xxxxxxxxxxxx  \
        --eab-hmac-key  xxxxxxxxx
 
签发证书
acme.sh --issue -d a.com --dns dns_cf --challenge-alias  b.com -d *.a.com --keylength ec-256 --ecc --force
 
布署证书
acme.sh --install-cert --ecc -d  a.com --key-file /usr/local/nginx/conf/ssl/a.com.key --fullchain-file /usr/local/nginx/conf/ssl/a.com.fullchain.cer --reloadcmd "systemctl reload nginx"
温馨提示:   
若是想在本来就已签注的域名证书下,修改为别名模式,可通过修改对应域名的配置文件,再续签。
/acme.sh/a.com_ecc/a.com.conf
# 比如域名别名在 CloudFlare
Le_Webroot='dns_cf'
# 域名别名为 alias.com
Le_ChallengeAlias='alias.com,'
实例二
   
# 签发证书
acme.sh --issue -d aaa.com --dns dns_cf --challenge-alias xxx.xyz -d aaa.com -d *.bbb.com -d *...com --keylength ec-256 --ecc --force
# 部署证书
acme.sh --install-cert --ecc -d aaa.com --key-file /data/ssl/nginx/aaa.com.key --fullchain-file /data/ssl/nginx/aaa.com.fullchain.cer --reloadcmd "systemctl reload nginx"