«

Acme.sh源码安装及简单应用

冰城心无泪 发布于 阅读:2866 Linux应用


Acme.sh的作用是免费SSL证书申请并自动续期,主要是免费,这对于自建网站的兄弟来说,绝对是个福音。以前的方法已经不好用了,因此今天来更新一把(2025.12.31)。

网上也有很多教程教大家去安装和使用,只不过在安装的时候,大多数教程都是用命令去git上面拉取脚本执行安装,这对于无法访问git的兄弟来说,这会是一个很麻烦的事情,当然也有国内的备用地址,只是我在安装的时候,时常也会安装失败,当然多试几次也会成功,就很烦,尤其是在比较忙的时候。

所以我就在想,将源码下载下来安装使用,这样就避免了因网络原因导致安装失败。

下面附上acme.sh源码包的下载地址,版本是 V3.1.2 下载与git的日期为2025年12月30日: 点击下载acme.sh

本次介绍通过DNS API以及文件验证的方式自动更新证书(DNS API以腾讯云为例)。

前置条件:

首先,你要有自己的域名

其次,你要有一个外网IP

最后,你要可以登录DNS服务商获取API(如果DNS服务商无法提供API,就用文件验证的方式)

如果前置条件不满足,下面的就不用看了。

方式一 DNS API申请证书(以腾讯云为例)

获取腾讯云DNS API

1、登录控制台后,点击访问管理

2、API秘钥管理

3、新建一个API秘钥-鼠标放置箭头处,可以微信扫描获取动态码

4、按流程填写好后,可获取到SecretId以及SecretKey,这两个值复制下来备用

这两个值的作用就是使acme.sh申请证书时,可以自动调用,来添加DNS的TXT记录,省去我们每次手动添加的麻烦。

获取证书申请命令

1、打开Freessl官网 https://freessl.cn/user/login ,登录(没有就创建一个账号)

2、点击证书自动化-ACME账号管理--新增EAB(若申请过,可直接使用)

3、EAB申请完成后,即可进入申请证书引导

选择申请证书引导


选择EAB

DNS服务商选择腾讯云

填写域名

获取命令,这里的命令都是范例,实际使用需要有所更改,此页面先不要关闭,后续还需要用到此页面提供的命令。

服务器申请证书,步骤与证书引导页面一致。

1、安装acme.sh

使用ssh工具如Nxshell、WindTerm、Xshell等连接到服务器,在系统内创建文件存放目录 /Tools,放置证书的目录 /Nginx/SSL 这个不是必须的,主要是为了方便管理文件,这只是我自己的习惯,各位可根据自己的习惯去选择或者创建。将下载到的acme.sh源码包传输到服务器创建的目录中,这个过程就略过了。
mkdir /Tools
mkdir -p /Nginx/SSL
安装依赖
yum -y install wget unzip vim socat
acme.sh源码压安装
unzip acme.sh-master.zip
进入已解压出来的acme.sh目录
cd acme.sh-3.1.2/
执行安装,后面这个邮件地址改成你自己的。
./acme.sh --install -m my@example.com


使acme.sh保持自动更新
/root/.acme.sh/acme.sh --upgrade --auto-upgrade
这样就安装好了,默认的安装目录为用户的主目录,我这是root用户所以是在 /root/.acme.sh 这时候直接使用命令acme.sh是无法使用的,因为变量没生效

下面就是想办法让变量生效,总不能使用绝对路径来用吧(/root/.acme.sh/acme.sh),重新打开终端或者重启服务器都可以实现,但是我嫌烦。
方法一
alias acme.sh=~/.acme.sh/acme.sh
方法二
source ~/.bashrc

2、配置环境变量

将腾讯云获取到的SecretId以及SecretKey配置为环境变量,以便acme.sh申请证书时调用,(这里声明变量只是临时生效,
但是acme.sh在进行调用时,会把这个变量添加到acme.sh全局设置配置文件中 ~/.acme.sh/account.conf 以便自动续期时调用)命令如下:
export Tencent_SecretId="腾讯云获取到的SecretId值"
export Tencent_SecretKey="腾讯云获取到的SecretKey值"

3、注册ACME账户(首次运行)

如图:FreeSSL默认使用的是LiteSSL作为CA,但该 CA 可能存在接入限制,容易出现API 初始化失败问题

因此切换回 Let's Encrypt执行证书操作,命令如下
acme.sh --set-default-ca --server letsencrypt

切换后就可以执行绑定操作了(因为以设置默认server,因此无需在加--server参数),命令如下(就是复制原FreesSSL网页上绑定命令,删掉 --server 参数):
acme.sh --register-account \
--eab-kid 你自己的kid \
--eab-hmac-key 你自己的key

4、申请证书

绑定完成后,就可以申请证书了(此处也是在原命令的基础上删除了--server参数,若acme.sh配置目录存在已申请却未过期的证书,那就需要在后面添加 --force 参数来强制更新):

acme.sh --issue \
--dns dns_tencent \
-d "你自己的域名" \
--keylength ec-256

5、部署证书

部署命令如下,证书的后缀无所谓,注意证书部署路径,只要你在配置Nginx的时候不要配错就行:
acme.sh --install-cert -d 你的域名 \
--key-file /Nginx/SSL/你的域名.key \
--fullchain-file /Nginx/SSL/你的域名.crt \
--reloadcmd     "service nginx force-reload"

6、至此,证书就部署到服务器上面了,剩下的就是配置Nginx了

方式二 文件验证的方式申请证书

安装acme.sh

使用ssh工具如Nxshell、WindTerm、Xshell等连接到服务器,在系统内创建文件存放目录 /Tools,放置证书的目录 /Nginx/SSL 这个不是必须的,主要是为了方便管理文件,这只是我自己的习惯,各位可根据自己的习惯去选择或者创建。将下载到的acme.sh源码包传输到服务器创建的目录中,这个过程就略过了。
mkdir /Tools
mkdir -p /Nginx/SSL
安装依赖
yum -y install wget unzip vim socat
acme.sh源码压安装
unzip acme.sh-master.zip
进入已解压出来的acme.sh目录
cd acme.sh-3.1.2/
执行安装,后面这个邮件地址改成你自己的。
./acme.sh --install -m my@example.com


使acme.sh保持自动更新
/root/.acme.sh/acme.sh --upgrade --auto-upgrade
这样就安装好了,默认的安装目录为用户的主目录,我这是root用户所以是在 /root/.acme.sh 这时候直接使用命令acme.sh是无法使用的,因为变量没生效

下面就是想办法让变量生效,总不能使用绝对路径来用吧(/root/.acme.sh/acme.sh),重新打开终端或者重启服务器都可以实现,但是我嫌烦。
方法一
alias acme.sh=~/.acme.sh/acme.sh
方法二
source ~/.bashrc

获取证书申请命令

1、打开Freessl官网 https://freessl.cn/user/login ,登录(没有就创建一个账号)

2、点击证书自动化-ACME账号管理--新增EAB(若申请过,可直接使用)

3、EAB申请完成后,即可进入申请证书引导

选择申请证书引导


选择EAB

选择文件验证并输入网站根目录,acme.sh会在网站根目录创建验证目录及验证文件

输入你的域名,此处可以输入多个域名,如果你有多个域名。

绑定账号,如图

FreeSSL默认使用的是LiteSSL作为CA,但该 CA 可能存在接入限制,容易出现API 初始化失败问题,因此切换回 Let's Encrypt执行证书操作,命令如下
acme.sh --set-default-ca --server letsencrypt

切换后就可以执行绑定操作了(因为以设置默认server,因此无需在加--server参数),命令如下(就是复制原FreesSSL网页上绑定命令,删掉 --server 参数):
acme.sh --register-account \
--eab-kid 你自己的kid \
--eab-hmac-key 你自己的key

4、申请证书

绑定完成后,就可以申请证书了(此处也是在原命令的基础上删除了--server参数,若acme.sh配置目录存在已申请却未过期的证书,那就需要在后面添加 --force 参数来强制更新):

acme.sh --issue \
-w 网站根目录 \
-d "你的域名" \
--keylength ec-256

5、部署证书

部署命令如下,证书的后缀无所谓,注意证书部署路径,只要你在配置Nginx的时候不要配错就行:
acme.sh --install-cert -d 你的域名 \
--key-file /Nginx/SSL/你的域名.key \
--fullchain-file /Nginx/SSL/你的域名.crt \
--reloadcmd     "service nginx force-reload"

6、至此,证书就部署到服务器上面了,剩下的就是配置Nginx了

7、注意事项

1、必须保留 80 端口监听,即使全站 HTTPS,验证阶段也依赖 80 端口;
2、Nginx配置文件中,网站根目录必须与 acme.sh 命令中的 --webroot 参数完全一致,否则验证文件会找不到
3、如果存在网站访问限制配置,一定要放行acme验证文件访问,可以在Nginx配置文件中,sever段内增加下面一段配置
location /.well-known/acme-challenge/ {
    # 此处填写你的网站根目录(需与acme.sh --webroot参数一致)
    root /var/www/yourdomain;
    # 强制指定文件类型,避免解析异常
    default_type text/plain;
    # 直接访问文件,避免被其他规则拦截
    try_files $uri =404;
    # 关键:禁用反向代理相关配置(防止继承全局proxy配置)
    proxy_pass "";          # 如果配有反向代理,需要清空proxy_pass,强制不代理
    proxy_set_header "";    # 清空代理请求头
    proxy_buffering off;    # 关闭代理缓冲
    # 可选:限制访问方式,仅允许GET/HEAD(增强安全)
    limit_except GET HEAD {
    deny all;
}

若还未安装Nginx,那就看下CentOS7&8编译安装Nginx

已安装Nginx,不会配置,那就看下Nginx只允许域名访问网站

acme.sh常用操作

acme.sh 依赖于cron执行定时任务来完成证书自动更新的,查看acme.sh的定时任务
crontab -l

查看acme自动执行的计划任务(在什么时间更新哪些证书)
acme.sh --list

acme.sh删除域名,不在更新此域名证书
acme.sh --remove -d 要删除的域名

强制更新证书

"/root/.acme.sh"/acme.sh --renew -d 你的域名 --force