外观
自动生成ssl免费证书
约 1390 字大约 5 分钟
2025-06-19
介绍
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书,并保持自动更新.
推荐使用dns验证的方式生成证书,这样可以添加泛解析ssl证书
参考网站:https://github.com/acmesh-official/acme.sh
安装acme.sh
安装很简单, 一个命令:
curl https://get.acme.sh | sh
# 会自动生成一条类似如下的定时器
13 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install
安装过程不会污染已有的系统任何功能和文件
提醒:
如果你的安装服务器位于中国大陆境内, 访问 github 可能会不成功. 所以安装可能会失败. 推荐从这里下载安装: https://gitee.com/neilpang/acme.sh
生成证书
acme.sh 实现了 ACME 协议支持的所有验证方式,主要有以下三种:
方式一:HTTP 验证
需要在网站根目录下放置验证文件,完成域名所有权验证后生成证书。
acme.sh --issue -d mydomain.com -d *.mydomain.com --webroot /home/wwwroot/mydomain.com/只需指定域名和网站根目录,acme.sh 会自动:
- 生成验证文件
- 放置到网站根目录
- 完成验证
- 自动删除验证文件
整个过程无任何副作用。
针对 Apache / Nginx 的智能验证
如果使用 Apache 服务器,acme.sh 可以智能地从 Apache 配置中自动完成验证:
acme.sh --issue -d mydomain.com --apache如果使用 Nginx 服务器或反向代理,acme.sh 也可以智能地从 Nginx 配置中自动完成验证:
acme.sh --issue -d mydomain.com --nginx注意
Apache/Nginx 模式在完成验证后,会恢复到你原来的配置状态,不会自动修改 SSL 配置。因此你需要手动配置 HTTPS,否则证书虽然生成成功但网站仍无法通过 HTTPS 访问。出于安全考虑,建议手动配置。
方式二:DNS 手动验证
无需服务器和公网 IP,只需在域名管理面板中添加 TXT 记录即可完成验证。
acme.sh --issue --dns -d mydomain.com运行后会输出需要添加的 TXT 记录信息,前往域名管理面板添加即可。解析完成后重新生成证书:
acme.sh --renew -d mydomain.com第二次使用
--renew而非--issue。
提醒
手动 DNS 验证方式的缺点是:如果不配置 Automatic DNS API,证书更新时需要再次手动解析验证域名所有权。
方式三:DNS API 自动验证(推荐)
通过域名解析商提供的 API 自动添加 TXT 记录,实现证书的完全自动化申请和续期。
acme.sh 支持 Cloudflare、DNSPod、CloudXNS、GoDaddy、OVH 等数十种解析商。
以 DNSPod 为例,需要先登录 DNSPod 账号生成 API ID 和 API Key(免费):
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d aa.com -d *.aa.com证书将自动签发。API ID 和 API Key 会被自动记录,后续使用时无需再次指定:
acme.sh --issue -d mydomain2.com --dns dns_dp多级子域名
如需为三级子域名申请证书,需要单独申请:
acme.sh --issue -d xxx.aa.com -d *.xxx.aa.com --dns dns_dp更多支持的 DNS API 参见:acme.sh DNS API 文档
安装证书
证书生成后,需要使用 --install-cert 命令将证书复制到目标位置。
重要提醒
默认生成的证书存放在 ~/.acme.sh/ 目录下,请勿直接使用此目录下的文件。该目录为内部使用,结构可能随时变化。
正确做法是使用 --install-cert 命令,证书文件会被自动复制到指定位置。
Apache 示例
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "systemctl reload apache2"Nginx 示例
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "systemctl reload nginx"提示
- 这里使用的是
force-reload(或systemctl reload),而非普通的reload。据测试,普通reload可能不会重新加载证书,建议使用force-reload。 - Nginx 的
ssl_certificate应指向 fullchain 证书文件(完整证书链),而非单个域名证书,否则 SSL Labs 测试会报Chain issues Incomplete错误。
--install-cert 命令携带的参数会被自动记录,未来证书自动续期时会再次调用这些参数。
更多参数详见:acme.sh 证书安装文档
证书续期
证书在 60 天后会自动续期,通常无需任何操作。
手动续期
# 续期单个域名
acme.sh --renew -d xxx.com --force
# 续期所有已注册域名
acme.sh --renew-all手动更新证书
acme.sh --renew -d xxx.com --force --dnssleep
acme.sh --renew-all
更新 acme.sh
由于 ACME 协议和 Let's Encrypt CA 频繁更新,建议保持 acme.sh 为最新版本。
手动升级
acme.sh --upgrade开启自动升级
acme.sh --upgrade --auto-upgrade开启后 acme.sh 会在每次证书续期时自动检查并升级到最新版本。
关闭自动升级
acme.sh --upgrade --auto-upgrade 0调试与排错
如果遇到问题,添加调试参数查看详细日志:
# 一级调试
acme.sh --issue -d mydomain.com --debug
# 二级调试(更详细)
acme.sh --issue -d mydomain.com --debug 2更多调试信息参见:acme.sh 调试文档
卸载证书
# 列出所有证书
acme.sh --list
# 撤销并删除证书
acme.sh --revoke -d mydomain.com
acme.sh --remove -d mydomain.com--revoke:销毁服务器端的证书--remove:从 acme.sh 已知的证书列表中删除
更多信息
更多高级功能和使用方法,请参考:acme.sh Wiki
