文章

使用 acme.sh 免费自动申请和定期续签SSL证书

帮助你从网站配置https的麻烦中解放

使用 acme.sh 免费自动申请和定期续签SSL证书

前言


今天介绍一款 SSL 证书申请和自动续签的脚本 acme.sh,截止目前该项目已有 44k 的 star,但是 open 的 issue 也有上千,可见由于系统差异和多方参与的复杂性,在使用这个脚本过程中几乎不可避免会报错,我也只能尽我所能讲讲我配置过程中踩的坑,和我相同环境的朋友可以参考,不同的只能查查官方文档和问下 AI 了。

服务器:香港 2h4g

系统:Ubuntu 22.04.4 LTS

域名商:阿里云

面板:1Panel

安装 acme.sh


运维面板打开终端,或是 ssh 连接服务器

1
curl ``https://get.acme.sh`` | sh -s email=你的邮箱

这里的邮箱不需要验证,因为主要是用于签发机构给你发通知之类的

注意: 由于我是香港服务器,所以不会被墙,如果国内的服务器这一步很可能没法安装,可以到文章结尾的链接中去看看国内可以使用的下载地址

1
2
[Wed Aug 27 23:06:08 HKT 2025] Installing to /home/ubuntu/.acme.sh
[Wed Aug 27 23:06:08 HKT 2025] Installed to /home/ubuntu/.acme.sh/acme.sh

安装完成后,记一下输出的路径,一会要用

1
acme.sh --version

可以查看版本

申请证书


首先 acme 协议需要验证你对域名的控制权

一般有两种方式验证: HTTP(Webroot) 和 DNS 验证

通过 DNS 验证可以支持自动续签和签发泛域名的 SSL 证书

这里只讲 DNS 验证,域名不是阿里云的朋友需要注意下面的命令不同

其他域名服务商可以到文末的 dnsapi 的文档里找到对于命令

获取阿里云的 Key 和 Secret

这里是为了调用阿里云的 API 直接增删 DNS 解析记录

手动操作或点击 AccessKey

选择 RAM 访问控制,创建一个用户,来到用户管理或点击 用户

给你的用户添加权限 AliyunDNSFullAccess,这是 DNS 的所有操作权

记下 Ali_Key 和 Ali_Secret,只会出现一次

将密钥加入配置

执行命令添加

1
2
echo 'export Ali_Key=你的Key' >> ~/.bashrc
echo 'export Ali_Secret=你的Secret' >> ~/.bashrc

或者打开配置文件添加(用你输出的路径)

/home/ubuntu/.acme.sh/account.conf

开始申请证书

1
acme.sh --issue --dns dns_ali -d example.com -d '*.example.com' --dnssleep 120

example.com 是示例域名,这里同时申请了泛域名

dns_ali 是表示使用阿里云的 DNS,如果是 cloudflare 或腾讯云这里要改

--dnssleep 120 表示添加 DNS 解析后等待 120 秒再验证,这里可以自行调整,过早可能失败

注意: 如果之前签发过证书,可能会有残留的_acme-challenge 解析记录,需要先删除

这里大概率会报错,所以有红色报错就在命令后加上 --debug,再输出一遍,把整个扔给 AI

申请成功

如果成功就会有绿色输出:

1
2
3
4
Your cert is in: /home/ubuntu/.acme.sh/example.com_ecc/example.com.cer
Your cert key is in: /home/ubuntu/.acme.sh/example.com_ecc/example.com.key
The intermediate CA cert is in: /home/ubuntu/.acme.sh/example.com_ecc/ca.cer
And the full-chain cert is in: /home/ubuntu/.acme.sh/example.com_ecc/fullchain.cer

四个分别是:域名证书,私钥,中间证书,完整证书链

完整证书链 = 域名证书 + 中间证书

所以配置时,建议使用 fullchain.cer 和 example.com.key

安装证书


1Panel:证书 -> 上传证书-> 导入方式-> 选择服务器文件 -> 选择 fullchain.cer 和 example.com.key 即可

这里我用的是 1Panel 面板,所以会自动将证书复制一份

如果是手动在 Nginx 中配置,不能直接使用~/.acme.sh/下的证书,要先复制一份

1
2
3
4
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     "service nginx reload"

上面是官方给的命令,可以参考

自动续签


acme.sh 默认会在安装时加一个 cron 或 systemd 定时任务。你可以用下面命令查看:

1
crontab -l

你应该能看到类似:

1
0 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null
  • 表示每天凌晨会检查证书是否快过期,如果快过期会自动续签。

参考资料

https://github.com/acmesh-official/acme.sh

https://github.com/acmesh-official/acme.sh/wiki/说明

https://github.com/acmesh-official/acme.sh/wiki/dnsapi

本文由作者按照 CC BY 4.0 进行授权