适用环境:CentOS 7/8、Ubuntu 18.04+、Debian 10+
支持 Web 服务器:Nginx、Apache、Caddy 等
证书有效期:90 天(自动续期,无需手动操作)
一、什么是 ZeroSSL?
ZeroSSL 是一个支持 ACME 协议的免费 SSL 证书颁发机构(CA)。与 Let’s Encrypt 一样,它提供免费、自动化、受浏览器信任的 SSL/TLS 证书。
为什么选择 acme.sh + ZeroSSL?
- 完全免费,无需注册账号
- 支持泛域名证书(需 DNS API)
- 自动续期,一劳永逸 一行命令安装,零依赖
- ZeroSSL 是 acme.sh 的默认 CA,开箱即用
二、准备工作
开始之前,请确保:
| 条件 | 说明 |
|---|---|
| 域名 | 已正确解析到服务器 IP |
| 端口 80 | 防火墙已放行(HTTP 验证需要) |
| 端口 443 | 防火墙已放行(HTTPS 服务需要) |
| 服务器 | 已安装 Nginx / Apache 等 Web 服务 |
验证域名解析:
ping your-domain.com
三、安装 acme.sh
SSH 登录服务器,执行以下命令:
海外用户/可以访问Github,执行:curl https://get.acme.sh | sh -s email=admin@your-domain.com
国内用户/无法访问Github,执行:git clone https://gitee.com/neilpang/acme.sh.git
# cd acme.sh
# ./acme.sh –install -m admin@your-domain.com
注意:请将
admin@your-domain.com替换为你自己的邮箱地址。此邮箱用于接收证书到期提醒。
安装完成后,使配置生效:
source ~/.bashrc
# 或
. ~/.bashrc
验证安装:
~/.acme.sh/acme.sh --version
https://github.com/acmesh-official/acme.sh
v3.1.3
四、申请 SSL 证书
4.1 确认 ZeroSSL 为默认 CA
~/.acme.sh/acme.sh --set-default-ca --server zerossl
acme.sh v3.0+ 默认使用 ZeroSSL。
4.2 选择验证方式
方式 A:HTTP Webroot 验证(推荐,最简单)
适用于 Web 服务已在运行、知道网站根目录的场景。
~/.acme.sh/acme.sh --issue \
-d your-domain.com \
-d www.your-domain.com \
-w /var/www/html
说明:
your-domain.com/www.your-domain.com→ 替换为你的域名/var/www/html→ 替换为你的网站根目录(宝塔面板通常为/www/wwwroot/你的域名)
方式 B:Standalone 模式
适用于没有运行 Web 服务,或 80 端口空闲的场景。注意:此模式会临时占用 80 端口。
# 先停止 Web 服务
systemctl stop nginx
# 申请证书
~/.acme.sh/acme.sh --issue \
-d your-domain.com \
-d www.your-domain.com \
--standalone
# 重新启动 Web 服务
systemctl start nginx
方式 C:DNS API 验证(支持泛域名)
适用于需要使用 *.your-domain.com 泛域名证书的场景。以下是 Cloudflare 示例:
export CF_Token="your-cloudflare-api-token"
~/.acme.sh/acme.sh --issue \
-d your-domain.com \
-d www.your-domain.com \
--dns dns_cf
更多 DNS 服务商支持:acme.sh DNS API 文档
4.3 验证证书是否申请成功
~/.acme.sh/acme.sh --list
输出示例:
Main_Domain KeyLength SAN_Domains Profile CA Created Renew
raisingstar.cn "ec-256" www.raisingstar.cn ZeroSSL.com 2026-08-10T05:58:22Z 2026-09-08T05:58:22Z
五、安装证书到 Web 服务器
Nginx(通用)
~/.acme.sh/acme.sh --install-cert \
-d your-domain.com \
--key-file /etc/nginx/ssl/your-domain.com/privkey.pem \
--fullchain-file /etc/nginx/ssl/your-domain.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
然后在 Nginx 配置中使用:
server {
listen 443 ssl http2;
server_name your-domain.com www.your-domain.com;
ssl_certificate /etc/nginx/ssl/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/your-domain.com/privkey.pem;
# ... 其他配置 ...
}
重载 Nginx:
nginx -t && systemctl reload nginx
宝塔面板(BT Panel)
~/.acme.sh/acme.sh --install-cert \
-d your-domain.com \
--key-file /www/server/panel/vhost/cert/your-domain.com/privkey.pem \
--fullchain-file /www/server/panel/vhost/cert/your-domain.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
Apache
~/.acme.sh/acme.sh --install-cert \
-d your-domain.com \
--cert-file /etc/apache2/ssl/your-domain.com/cert.pem \
--key-file /etc/apache2/ssl/your-domain.com/privkey.pem \
--fullchain-file /etc/apache2/ssl/your-domain.com/fullchain.pem \
--reloadcmd "systemctl reload apache2"
六、验证 HTTPS 是否正常
命令行验证
# 检查证书信息
echo | openssl s_client -connect your-domain.com:443 -servername your-domain.com 2>/dev/null \
| openssl x509 -noout -dates -subject -issuer
预期输出:
subject=CN=your-domain.com
issuer=C=AT, O=ZeroSSL GmbH, CN=ZeroSSL ECC DV SSL CA 2
notBefore=... # 证书颁发日期
notAfter=... # 证书到期日期(90天后)
在线工具验证
访问 SSL Labs SSL Test 输入你的域名,获取详细的 SSL 评分和安全报告。
七、自动续期(无需配置)
好消息:你已经完成了所有工作。
acme.sh 在安装时会自动添加 crontab 定时任务:
$ crontab -l | grep acme
26 19 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
工作机制:
每天19:26自动检查
↓
证书到期前 < 60 天?
↓ 是
自动续期(静默)
↓
自动执行 --reloadcmd(重载 Nginx)
↓
完成
手动验证续期流程(干跑,不会实际续期):
~/.acme.sh/acme.sh --renew -d your-domain.com --dry-run
八、常见问题
Q1:80 端口被防火墙拦截,HTTP 验证失败?
# CentOS (firewalld)
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# Ubuntu (ufw)
ufw allow 80/tcp
# 宝塔面板:在安全页面放行 80 端口
Q2:如何切换到 Let’s Encrypt?
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
# 然后重新申请证书
Q3:证书到期了但没有自动续期?
# 手动触发续期
~/.acme.sh/acme.sh --cron --force
# 检查日志
tail -100 ~/.acme.sh/acme.sh.log
Q4:如何删除旧证书?
~/.acme.sh/acme.sh --remove -d your-domain.com
Q5:需要更新联系邮箱?
# 编辑配置
nano ~/.acme.sh/account.conf
# 修改 ACCOUNT_EMAIL 字段
九、完整脚本(一键部署)
将以下脚本保存为 ssl.sh,修改前两行的高亮内容后执行:
#!/bin/bash
DOMAIN="your-domain.com"
EMAIL="admin@your-domain.com"
WEBROOT="/var/www/html"
# 安装 acme.sh
curl https://get.acme.sh | sh -s email="$EMAIL"
# 设置 CA
~/.acme.sh/acme.sh --set-default-ca --server zerossl
# 申请证书
~/.acme.sh/acme.sh --issue -d "$DOMAIN" -d "www.$DOMAIN" -w "$WEBROOT"
# 安装证书
~/.acme.sh/acme.sh --install-cert -d "$DOMAIN" \
--key-file /etc/nginx/ssl/"$DOMAIN"/privkey.pem \
--fullchain-file /etc/nginx/ssl/"$DOMAIN"/fullchain.pem \
--reloadcmd "systemctl reload nginx"
# 验证
echo | openssl s_client -connect "$DOMAIN":443 -servername "$DOMAIN" 2>/dev/null \
| openssl x509 -noout -dates -issuer
echo "=== 部署完成 ==="
十、总结
| 步骤 | 命令 | 频率 |
|---|---|---|
| 安装 | curl https://get.acme.sh | sh | 一次 |
| 申请 | acme.sh --issue -d domain -w /path | 一次 |
| 安装 | acme.sh --install-cert -d domain ... | 一次 |
| 续期 | 自动 | 每天检查,到期前 60 天续期 |
你只需操作一次,后续完全自动化。 这就是 ACME 协议 + acme.sh 的威力。