acme.sh安装与使用

一、前言

acme.sh 是一款基于 ACME 协议的开源免费SSL证书申请工具,支持Let’s Encrypt、ZeroSSL等多个CA机构,无需依赖复杂依赖库,操作简单且支持自动续期,是个人开发者和中小企业获取免费SSL证书的首选工具。本文将详细讲解其完整安装、配置及证书申请、部署流程,重点覆盖Cloudflare DNS验证方式(适配无公网IP或不想开放80/443端口的场景)。

二、安装 acme.sh

acme.sh 安装过程简洁,仅需依赖基础工具,支持主流Linux发行版(Ubuntu、CentOS、Debian等)。

2.1 安装前置依赖

acme.sh 依赖 curl(用于下载安装脚本)和 socat(用于部分验证模式),先执行以下命令安装:

1
2
3
apt-get install curl socat -y  # Debian/Ubuntu系列

# 若为CentOS/RHEL系列,执行:yum install curl socat -y

2.2 安装 acme.sh 核心工具

使用官方提供的一键安装脚本,自动完成安装及环境变量配置:

1
curl https://get.acme.sh | sh

2.3 解决「命令未找到」问题

安装完成后,若直接执行 acme.sh 提示“命令未找到”,原因是环境变量配置未即时生效。需根据当前使用的Shell类型执行对应命令:

1
2
3
source ~/.bashrc  # Bash Shell(大部分系统默认)
# 若使用Zsh:source ~/.zshrc
# 若使用Fish:source ~/.config/fish/config.fish

若仍无法识别,可手动创建软链接(需替换实际安装路径,默认路径通常为 ~/.acme.sh/acme.sh):

1
ln -s ~/.acme.sh/acme.sh /usr/local/bin/acme.sh

验证安装成功:执行 acme.sh --version,若输出版本信息则说明安装正常。

三、核心配置

申请证书前需完成两项关键配置:DNS API授权(本文以Cloudflare为例)、指定CA机构(适配acme.sh V3版本默认CA变更)。

3.1 配置Cloudflare DNS API(推荐)

采用DNS验证模式无需开放服务器80/443端口,适合内网服务器或端口被占用的场景。若域名DNS由Cloudflare托管,需配置其API密钥授权acme.sh自动添加解析记录。

步骤:

  1. 登录Cloudflare账户,进入「我的个人资料」→「API令牌」,创建一个具备「Zone.DNS」编辑权限的令牌(或直接使用「全局API密钥」,安全性略低);

  2. 在服务器中执行以下命令,设置环境变量(替换为实际的API密钥和邮箱):

1
2
export CF_Key="你的Cloudflare API令牌/全局密钥"
export CF_Email="你的Cloudflare注册邮箱"

注:该环境变量仅在当前终端会话有效,若需永久生效,可将上述命令添加到 ~/.bashrc 或对应Shell的配置文件中。

3.2 配置CA机构(acme.sh V3版本必看)

acme.sh V3版本后,默认CA机构从Let’s Encrypt切换为ZeroSSL。若需使用Let’s Encrypt(兼容性更广),需手动切换,两种方式可选:

方式1:设置默认CA为Let’s Encrypt(全局生效)

1
acme.sh --set-default-ca --server letsencrypt

方式2:申请证书时临时指定CA(单次生效)

在后续--issue 命令后添加 --server letsencrypt 参数即可。

参考链接:

四、获取SSL证书

核心流程:先通过 --issue 命令验证域名所有权并申请证书,再通过 --install-cert 命令将证书部署到目标服务(Nginx/Apache等)。

4.1 验证域名并申请证书(Cloudflare DNS模式)

执行以下命令,使用Cloudflare DNS验证方式申请ECC类型证书(ECC证书体积小、加密效率高,推荐优先使用):

acme.sh –issue –dns dns_cf -d yourdomain.com -k ec-256

参数详解:

  • --issue:核心参数,表示申请证书

  • -d yourdomain.com:指定要申请证书的域名,多域名可叠加 -d www.yourdomain.com -d api.yourdomain.com

  • --dns dns_cf:指定使用Cloudflare DNS验证模式(其他DNS服务商可参考 官方dnsapi文档)

  • -k ec-256:指定证书密钥算法为ECC,密钥长度256位;若需RSA证书,可改为 -k 2048(2048位足够安全,4096位兼容性略差)

执行成功后,证书文件会默认保存在~/.acme.sh/yourdomain.com/ 目录下。

4.2 安装证书到目标服务

申请到证书后,需将证书文件复制到服务的指定目录(如Nginx的 /etc/nginx/ssl/),并配置服务加载证书。acme.sh 提供 –install-cert 命令一键完成复制,并支持续期后自动重载服务。

1
2
3
4
5
acme.sh --install-cert -d yourdomain.com \
--fullchain-file /etc/nginx/ssl/yourdomain.fullchain.crt \
--key-file /etc/nginx/ssl/yourdomain.key \
--ecc \
--reloadcmd "systemctl restart nginx"

参数详解:

  • --install-cert:核心参数,表示安装/部署证书

  • -d yourdomain.com:指定对应域名(需与申请时一致)

  • --fullchain-file:指定全链证书(包含服务器证书和中间证书)的目标路径,服务端需加载该文件

  • --key-file:指定证书私钥的目标路径

  • --ecc:声明当前安装的是ECC证书(若申请的是RSA证书,需删除该参数)

  • --reloadcmd:证书续期后自动执行的命令(此处为重启Nginx,Apache可改为 “systemctl restart apache2”)

五、证书自动续期与管理

5.1 自动续期(默认开启)

acme.sh 安装时会自动添加crontab定时任务,默认每60天检查一次证书有效期,若剩余有效期小于30天则自动续期。可通过以下命令查看定时任务:

1
crontab -l

典型的定时任务内容:

1
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

5.2 手动续期(测试用)

若需测试续期功能,可执行以下命令手动触发续期:

1
2
acme.sh --renew -d yourdomain.com --ecc  # ECC证书
# RSA证书:acme.sh --renew -d yourdomain.com

5.3 查看已申请的证书

1
acme.sh --list

5.4 revoke(吊销)证书

1
2
acme.sh --revoke -d yourdomain.com --ecc  # ECC证书
# RSA证书:acme.sh --revoke -d yourdomain.com

六、常见问题与注意事项

  1. 权限问题:证书安装路径(如/etc/nginx/ssl/)需确保acme.sh有写入权限,建议提前创建目录并设置权限:mkdir -p /etc/nginx/ssl && chmod 755 /etc/nginx/ssl

  2. DNS验证失败:检查Cloudflare API密钥是否正确、域名是否托管在Cloudflare,若提示“解析记录添加失败”,可等待1-2分钟后重试(DNS缓存问题)。

  3. CA机构切换后生效:切换CA机构后,首次申请新证书时生效,已申请的证书续期时需指定对应CA(或重新设置默认CA)。

  4. 避免直接修改证书文件:acme.sh 续期后会自动覆盖 --install-cert 指定的路径文件,无需手动修改。

七、总结

acme.sh 凭借轻量化、自动化的优势,极大降低了免费SSL证书的申请和管理门槛。本文通过Cloudflare DNS验证方式,实现了无端口依赖的证书申请,适配多数场景;同时补充了自动续期、服务重载等关键配置,确保证书长期有效。若使用其他DNS服务商,可参考官方dnsapi文档替换对应验证方式,核心流程保持一致。