使用acme.sh配置自动证书
证书的申请、安装、续期,都是一些麻烦的事情,还容易忘记。因此,我选择找一个自动化工具全自动完成这些事情,也就是acme.sh
安装acme
这个过程很简单,一句话就行
curl https://get.acme.sh | sh
安装过程如下
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1032 0 1032 0 0 2816 0 --:--:-- --:--:-- --:--:-- 2811
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 221k 100 221k 0 0 364k 0 --:--:-- --:--:-- --:--:-- 365k
[Mon Jun 16 11:49:25 AM CST 2025] Installing from online archive.
[Mon Jun 16 11:49:25 AM CST 2025] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Mon Jun 16 11:49:28 AM CST 2025] Extracting master.tar.gz
[Mon Jun 16 11:49:28 AM CST 2025] Installing to /root/.acme.sh
[Mon Jun 16 11:49:28 AM CST 2025] Installed to /root/.acme.sh/acme.sh
[Mon Jun 16 11:49:28 AM CST 2025] Installing alias to '/root/.bashrc'
[Mon Jun 16 11:49:28 AM CST 2025] Close and reopen your terminal to start using acme.sh
[Mon Jun 16 11:49:28 AM CST 2025] Installing cron job
[Mon Jun 16 11:49:28 AM CST 2025] bash has been found. Changing the shebang to use bash as preferred.
[Mon Jun 16 11:49:30 AM CST 2025] OK
[Mon Jun 16 11:49:30 AM CST 2025] Install success!
这个安装脚本会自动创建一个别名acme.sh
,但我觉得这个不太方便,所以在.bashrc
中把它创建的别名改成了acme
,然后重新加载.bashrc
(source ~/.bashrc
),则可马上使用acme
完成接下来的步骤
~/.bashrc
alias acme='~/.acme.sh/acme.sh'
安装完成后,启用acme的自动更新:
acme --upgrade --auto-upgrade
注册帐号
acme需要使用邮箱在CA服务器注册一个帐号
acme --register-account -m 邮箱
申请证书
这里需要分情况讨论,针对不同的情况,有不同的申请方式。但无论是哪种方式,amce都会在完成后把申请过程中的影响全部消除
使用Nginx部署了网站
acme --issue --nginx -d example.com -d www.example.com -d cp.example.com
使用Apache部署了网站
acme --issue --apache -d example.com -d www.example.com -d cp.example.com
如果网站根路径可被读写
acme --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
没有网站,80端口空闲
acme可以临时当一个服务器完成完成验证
acme --issue --standalone -d example.com -d www.example.com -d cp.example.com
连服务器也没有
这种情况只需要在DNS服务商处添加记录,即可完成认证
可以手动添加,也可以自动完成
但这里推荐使用自动方式,因为手动模式下acme无法完成域名所有权验证,无法完成证书的自动更新
自动方式
目前为止,acme支持177家DNS服务商的API,可以自动完成验证,且完成后清除所有影响
有一点需要注意,这里选择DNS服务商的决策点,是你的NameServer,不是域名购买商!
所有服务商的验证方式,acme都有描述其大致的过程和注意事项
这里,针对阿里云的云解析DNS,给出详细操作流程:
登录阿里的RAM访问控制页面,创建一个RAM用户。注意一定选择『使用永久 AccessKey 访问』选项
注意保存AccessKey ID和AccessKey Secret,这是页面关闭后无法再次获取的信息!
为刚创建的RAM用户添加
AliyunDNSFullAccess
权限在服务器上,创建以下环境变量
export Ali_Key="<AccessKey ID>"
export Ali_Secret="<AccessKey Secret>"
使用以下命令进行证书申请
acme --issue --dns dns_ali -d example.com -d *.example.com --dnssleep 30
dnssleep是通过API创建认证信息后,等待域名记录的添加生效的时间,单位是秒
以阿里云的效率来说,应该是不需要等太久的,所以我设置了30秒
如果实际操作中发现时间不够导致验证失败,适当延长时间即可
这个命令会完成证书申请的全部操作,出现如下提示时,表示域名申请完成
[Mon Jun 16 01:03:09 PM CST 2025] Your cert is in: /root/.acme.sh/example.net_ecc/example.net.cer
[Mon Jun 16 01:03:09 PM CST 2025] Your cert key is in: /root/.acme.sh/example.net_ecc/example.net.key
[Mon Jun 16 01:03:09 PM CST 2025] The intermediate CA cert is in: /root/.acme.sh/example.net_ecc/ca.cer
[Mon Jun 16 01:03:09 PM CST 2025] And the full-chain cert is in: /root/.acme.sh/example.net_ecc/fullchain.cer
手动方式
这种方式需要手动在域名的解析设置处添加TXT记录,记录内容以如下方式获取
acme --issue --dns -d example.com -d www.example.com -d subdomain.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
这个命令会生成如下信息:
[Mon Jun 16 06:09:09 PM CST 2025] Using CA: https://acme.zerossl.com/v2/DV90
[Mon Jun 16 06:09:09 PM CST 2025] Creating domain key
[Mon Jun 16 06:09:09 PM CST 2025] The domain key is here: /root/.acme.sh/example.com_ecc/example.com.key
[Mon Jun 16 06:09:09 PM CST 2025] Multi domain='DNS:example.com,DNS:www.example.com,DNS:subdomain.example.com'
[Mon Jun 16 06:09:34 PM CST 2025] Getting webroot for domain='example.com'
[Mon Jun 16 06:09:34 PM CST 2025] Getting webroot for domain='www.example.com'
[Mon Jun 16 06:09:34 PM CST 2025] Getting webroot for domain='subdomain.example.com'
[Mon Jun 16 06:09:35 PM CST 2025] Add the following TXT record:
[Mon Jun 16 06:09:35 PM CST 2025] Domain: '_acme-challenge.example.com'
[Mon Jun 16 06:09:35 PM CST 2025] TXT value: 'b6yJjlPUAfz3zln_0S9bSCGebpMZ5VZMipuJRDNhlL8'
[Mon Jun 16 06:09:35 PM CST 2025] Please make sure to prepend '_acme-challenge.' to your domain
[Mon Jun 16 06:09:35 PM CST 2025] so that the resulting subdomain is: _acme-challenge.example.com
[Mon Jun 16 06:09:35 PM CST 2025] Add the following TXT record:
[Mon Jun 16 06:09:35 PM CST 2025] Domain: '_acme-challenge.www.example.com'
[Mon Jun 16 06:09:35 PM CST 2025] TXT value: 'eC6E_Yhs3zqdbXwV0BreGF5eZGRCmcQ3xrO_hxcfbnI'
[Mon Jun 16 06:09:35 PM CST 2025] Please make sure to prepend '_acme-challenge.' to your domain
[Mon Jun 16 06:09:35 PM CST 2025] so that the resulting subdomain is: _acme-challenge.www.example.com
[Mon Jun 16 06:09:35 PM CST 2025] Add the following TXT record:
[Mon Jun 16 06:09:35 PM CST 2025] Domain: '_acme-challenge.subdomain.example.com'
[Mon Jun 16 06:09:35 PM CST 2025] TXT value: '7eHBmlAog3HHK7S_DMhiL12sRzjjZ6oRcEzchWb6y5o'
[Mon Jun 16 06:09:35 PM CST 2025] Please make sure to prepend '_acme-challenge.' to your domain
[Mon Jun 16 06:09:35 PM CST 2025] so that the resulting subdomain is: _acme-challenge.subdomain.example.com
[Mon Jun 16 06:09:35 PM CST 2025] Please add the TXT records to the domains, and re-run with --renew.
[Mon Jun 16 06:09:35 PM CST 2025] Please check log file for more details: /root/.acme.sh/acme.sh.log
其中,关键信息是Add the following TXT record下边的Domain和TXT value值。
有几个,在域名的解析记录处添加几个条目。
以上边的信息为例,其中记录以如下方式填写:
解析记录填写完成,等待以确保记录生效之后,使用如下命令完成验证:
acme --renew -d example.com -d www.example.com -d subdomain.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
如果你的证书带有SHA CSR,在命令中添加
--force
参数:
acme --renew -d example.com -d www.example.com -d subdomain.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please --force
如果你的证书带有ECC CSR,在命令中添加
--ecc --force
参数:
acme --renew -d example.com -d www.example.com -d subdomain.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please --ecc --force
如果验证成功,TXT记录就可以删除了。
如果验证时失败,请删除TXT记录,重复以上流程,等待足够长时间后再验证!
注意,手动方式申请的证书无法自动续签,需要每90天手动重复以上流程!
域名申请时出现Pending
错误
acme默认使用ZeroSSL作为CA服务器,如果申请证书时频繁出现这样的提示,可以换成Let's Encrypt:
提示CA正在处理订单,请稍候
Pending,The CA is processing your order,please just wait.
更换acme的默认CA服务器
acme --set-default-ca --server letsencrypt
安装证书
证书生成好以后,需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。
注意,必须使用 --install-cert
命令把证书复制到目标文件,不可直接使用 ~/.acme.sh/
目录下的证书文件!
那个目录下的文件都是acme内部使用的!
nginx
acme --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx reload"
apache
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
reloadcmd是一个在证书续签完成后自动执行的命令,如果一行命令不够,可以创建一个有执行权限的sh文件,供它使用
复杂命令
acme --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "/path/to/complex.sh"
查看已安装证书信息
acme.sh --info -d example.com
DOMAIN_CONF=/root/.acme.sh/example.com/example.com.conf
Le_Domain=example.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr 7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun 6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem