跳到主要内容

适用环境: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 的威力。


留下回复