# acme.sh 安装操作
安装:
curl https://get.acme.sh | sh -s email=my@example.com | |
# or | |
wget -O - https://get.acme.sh | sh -s email=my@example.com |
普通用户和 root 用户皆可安装使用,命令执行完成后,acme.sh 的所有相关脚本和文件都会被统一安装到 ~/.acme.sh/
目录下,同时会在 ~/.bashrc
环境变量中写入 alias acme.sh=~/.acme.sh/acme.sh
以便执行 acme.sh
脚本。
安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中: ~/.acme.sh/
;安装完成后使用 acme.sh -v
测试,如若输出 -bash: acme.sh: command not found
,则需要手动执行:
source ~/.bashrc |
整个安装流程分为以下几步:
- 把 acme.sh 安装到你当前用户的 home 目录下:
~/.acme.sh/
; - 通过执行
. "~/.acme.sh/acme.sh.env"
载入到当前用户的环境变量并为其 alias; - 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。
note:
更多高级安装操作可看:https://github.com/acmesh-official/acme.sh/wiki/How-to-install
# SSL 证书签发
acme.sh 实现了 acme 协议支持的所有验证协议;一般有两种方式验证: HTTP 和 DNS 验证签发。
# HTTP 验证
先说明 HTTP 验证不适用于泛域名证书 *.example.com,并需要对服务器的网站根目录(webroot)具有有写入权限。
# 直接签发
只需要指定域名,并指定域名所在的对应的服务器的网站根目录(webroot), acme.sh 会全自动创建生成临时验证文件,待 CA 机构验证该文件的可访问性及验证该域名所有权后,将会颁发证书,并删除验证文件。
acme.sh --issue -d domain.com -d www.domain.com --webroot /<webroot_path>/ |
# 独立服务模式
适用场景:服务器上无运行中的 web 服务,80 /tcp 端口处于空闲状态。
以 root 用户,让 acme.sh 开一个 80 端口监听并完成验证:
acme.sh --issue --standalone -d example.com -d www.example.com |
# DNS 验证
DNS 验证与 HTTP 验证的区别在于:你不需要任何服务器,不需要任何公网 IP,只需要获取到 DNS 的解析记录即可为你的域名完成验证。
# 手动验证
>> 如果有自动更新证书的需求,请使用自动验证 <<
手动验证跟下面的自动验证操作仅有一步之差,那就是手动验证不需要 export Namesilo_Key="<key>"
,但需要你手动在域名上添加一条 TXT 记录,验证域名所有权。
申请签发:
acme.sh --issue --dns -d domain.com --keylength 2048 |
--issue
表明该命令执行用于申请发配证书。--dns
默认不带参数表示手动验证;如果带参数,eg:dns_namesilo
,则表明使用 Namesilo 的 DNS 插件,需要配置环境变量,看下文 "自动验证" 中的操作。-d
配置参数表示需要签发的域名,需要申请多个域名,追加-d example.com
即可。--keylength
参数用于指明密钥类型及长度,可选操作有:- RSA:
2048
,3072
,4096
,8192
- ECC:
ec-256
,ec-384
,ec-521
- RSA:
验证签发:
acme.sh --renew -d domain.com |
复制证书:
acme.sh --install-cert -d domain.com \ | |
--key-file /<path>/SSL/private.key \ | |
--fullchain-file /<path>/SSL/chain.pem \ | |
--capath /<path>/SSL/ca.pem \ |
# 自动验证
进入 SSL 证书签发流程(为了演示不同的操作,这里以泛域名为演示):
1、声明所需变量及设置 CA:
# 导入 Namesilo API Key | |
export Namesilo_Key="<key>" | |
# 设置默认 CA 为 Let's Encrypt | |
acme.sh --set-default-ca --server letsencrypt |
note:
export
声明的变量,根据 acme 提供的,使用不同的服务商,所需要的验证不一样,这里以 Namesilo 服务商为参考,具体可看:https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_namesilo参数
<key>
为对应服务商申请提供的 key,不同的服务商可能需要多个 key。
2、签发证书
因为以 Namesilo 服务商为参考,根据上方链接,填入相应的命令:
# 签发 RSA 证书 | |
acme.sh --issue --dns dns_namesilo -d '*.domain.com' --keylength 2048 --dnssleep 1800 |
note:
-d
配置参数表示需要签发的域名,因为这里只用泛域名,所以只有一个-d '*.domain.com'
,若需要多个则追加,建议主域放在第一个。dnssleep 1800
,原有默认使用 900S 等待,如果使用的是 Namesilo 建议修改成 1500+,若不进行适当的等待,在验证过程中可能会因为 DNS 记录尚未完全传播而导致验证失败,导致后面的证书不能正确申请。
在申请过程中,期间会自动解析一条名为 _acme-challenge
的 TXT 记录,此时如果你去域名管理页面中查看,,可以看到该 TXT 解析记录,等校验完成后会自动删除,所以建议大家选择 DNS 校验,最后将在指定路径下输出:
Your cert is in: /<path>/<*.domain.com>/xxx.cer | |
Your cert key is in: /<path>/<*.domain.com>/xxx.key | |
The intermediate CA cert is in: /<path>/<*.domain.com>/ca.cer | |
And the full-chain cert is in: /<path>/<*.domain.com>/fullchain.cer |
3、安装证书到指定位置
当上一步执行完毕并成功签发证书下来,即可执行如下操作:
# 安装 RSA 证书到指定路径 | |
acme.sh --install-cert -d '*.domain.com' \ | |
--key-file /<path>/SSL/RSA/private.key \ | |
--fullchain-file /<path>/SSL/RSA/chain.pem \ | |
--capath /<path>/SSL/RSA/ca.pem \ | |
--reloadcmd "service nginx reload" |
--install-cert
命令用于把证书复制到目标路径文件;请勿直接使用默认生成的~/.acme.sh/
目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会发生变化。
若是在 “签发证书” 过程中出现错误,仍执行这一步,会提示缺少证书文件。
4、ECC 证书签发并安装(如若不需,跳过即可)
ECC 证书获取跟上面的第二第三点类似,只须把部分参数更改一下即可:
--keylength 2048
参数换成--keylength ec-256
;acme.sh --install-cert
参数上追加成acme.sh --install-cert --ecc
。
ECC 签证完整操作:
# 签发 ECC 证书,若不需要,跳过即可 | |
acme.sh --issue --dns dns_namesilo -d '*.domain.com' --keylength ec-256 --dnssleep 1800 | |
# 安装 ECC 证书到指定路径 | |
acme.sh --install-cert -d '*.domain.com' --ecc \ | |
--key-file /<path>/SSL/ECC/private.key \ | |
--fullchain-file /<path>/SSL/ECC/chain.pem \ | |
--capath /<path>/SSL/ECC/ca.pem \ | |
--reloadcmd "service nginx reload" |
5、收尾
最后取消先前的 export <key>
的声明,避免 Key 泄露:
# 取消环境变量 | |
unset Namesilo_Key |
查看已签证证书:
acme.sh --list | |
Main_Domain KeyLength SAN_Domains CA Created Renew | |
*.domain.com "2048" no LetsEncrypt.org 2025-08-23T15:31:28Z 2025-10-21T15:31:28Z | |
*.domain.com "ec-256" no LetsEncrypt.org 2025-08-23T05:06:07Z 2025-10-21T05:06:07Z |
查看指定证书的详细信息:
# RSA | |
acme.sh --info -d <Main_Domain> | |
# ECC | |
acme.sh --info -d <Main_Domain> --ecc | |
# note:<Main_Domain> 为执行 'acme.sh --list' 输出给出的参数 |
# Namesilo 泛域名签发整流程
# 下方 <domain_conf_path> 为不同域名申请签发存储的文件路径 | |
# 下方 <path> 为调用 SSL 证书所存放的证书路径 | |
# 导入 Namesilo API Key | |
export Namesilo_Key="<key>" | |
# 设置默认 CA 为 Let's Encrypt | |
acme.sh --config-home /<domain_conf_path>/ --set-default-ca --server letsencrypt | |
# 签发 RSA 证书 | |
acme.sh --config-home /<domain_conf_path>/ --issue --dns dns_namesilo -d '*.domain.com' --keylength 2048 --dnssleep 1800 | |
# 安装 RSA 证书到指定路径 | |
acme.sh --config-home /<domain_conf_path>/ \ | |
--install-cert -d '*.domain.com' \ | |
--key-file /<path>/SSL/RSA/private.key \ | |
--fullchain-file /<path>/SSL/RSA/chain.pem \ | |
--capath /<path>/SSL/RSA/ca.pem \ | |
--reloadcmd "service nginx reload" | |
# 签发 ECC 证书,若不需要,跳过即可 | |
acme.sh --config-home /<domain_conf_path>/ --issue --dns dns_namesilo -d '*.domain.com' --keylength ec-256 --dnssleep 1800 | |
# 安装 ECC 证书到指定路径 | |
acme.sh --config-home /<domain_conf_path>/ \ | |
--install-cert -d '*.domain.com' --ecc \ | |
--key-file /<path>/SSL/ECC/private.key \ | |
--fullchain-file /<path>/SSL/ECC/chain.pem \ | |
--capath /<path>/SSL/ECC/ca.pem \ | |
--reloadcmd "service nginx reload" | |
# 取消环境变量 | |
unset Namesilo_Key | |
# 查看签证 | |
acme.sh --config-home /<domain_conf_path>/ --list | |
# 查看指定证书的详细信息 <Main_Domain> 为执行 "查看签证" 输出给出的参数 | |
acme.sh --config-home /<domain_conf_path>/ --info -d <Main_Domain> | |
# 创建证书续签检查 cron 任务 | |
crontab -e -u <user> | |
40 0 * * * "/home/<user>/.acme.sh"/acme.sh --cron --home "/home/<user>//.acme.sh" --config-home "/<domain_conf_path>" > /dev/null |
# Nginx 签证配置
关于在 Nginx 中使用 SSL 的配置方法放在 Nginx 反代理并安装 SSL 文章中,以便整体了解 Nginx 配置操作。
# 参考
使用 acme.sh 自动签发和更新证书
使用 acme.sh 进行 SSL 证书的申请和自动更新
acme.sh 中文文档
使用 acme.sh 颁发 TLS 证书并安装到 nginx/apache 实现网站 https 访问