acme.sh 使用指南:Linux SSL 证书自动化管理

在当今的互联网环境中,HTTPS 已成为网站的标配。Let's Encrypt 提供免费的 SSL 证书,使得任何网站都能轻松启用加密连接。acme.sh 是一款优秀的 ACME 协议客户端,它完全用 Shell 脚本编写,无需 Python 等依赖,支持多种验证方式和 DNS 提供商,是证书自动化管理的理想选择。

本文将全面介绍 acme.sh 的安装方法、核心功能以及实际应用场景,帮助你构建自动化的 SSL 证书管理体系。

acme.sh 核心概念

什么是 acme.sh?

acme.sh 是一个用纯 Shell 语言编写的 ACME 协议客户端,用于从 Let's Encrypt、ZeroSSL、Buypass 等 CA 机构自动申请和更新 SSL/TLS 证书。它支持完整的证书生命周期管理,包括申请、更新、安装和撤销。

acme.sh 的优势

纯 Shell 实现。与 certbot 等基于 Python 的客户端不同,acme.sh 仅依赖基础 Shell 工具,大大减少了系统依赖和安装体积。

自动化程度高。内置自动更新机制和定时任务,证书到期前自动续期,无需人工干预。

支持多种验证方式。提供 HTTP 验证、DNS 验证、TLS-ALPN-01 验证等多种域名验证方式,适应不同的部署环境。

丰富的 DNS 服务商支持。内置 100+ 家 DNS 服务商的 API 支持,包括 Cloudflare、阿里云、腾讯云、GoDaddy 等,轻松实现 DNS 验证。

Docker 支持。提供官方 Docker 镜像,适合容器化部署场景。

安装方法

在线安装(推荐)

使用官方提供的在线安装脚本,简单快捷:

1# 使用 curl 安装
2curl https://get.acme.sh | sh -s email=your@example.com
3
4# 或使用 wget 安装
5wget -O - https://get.acme.sh | sh -s email=your@example.com

安装过程会自动完成以下操作:

  • 创建工作目录 ~/.acme.sh/
  • 安装 cron 任务用于自动更新证书
  • 创建别名命令 acme.sh

安装完成后,重新加载 Shell 配置:

1source ~/.bashrc
2# 或
3source ~/.zshrc

离线安装

对于无法访问外网的环境,可以离线安装:

1# 1. 克隆仓库
2git clone https://github.com/acmesh-official/acme.sh.git
3cd acme.sh
4
5# 2. 安装
6./acme.sh --install -m your@example.com

Docker 安装

使用 Docker 运行 acme.sh:

1# 拉取镜像
2docker pull neilpang/acme.sh
3
4# 运行容器
5docker run --rm -itd -v /path/to/certs:/acme.sh \
6  -e Ali_Key=key -e Ali_Secret=secret \
7  --name acme.sh neilpang/acme.sh daemon

升级 acme.sh

acme.sh 支持自动升级,也可以手动升级:

 1# 自动升级(通过 cron 任务)
 2acme.sh --upgrade
 3
 4# 手动升级到最新开发版
 5acme.sh --upgrade -b master
 6
 7# 开启自动升级
 8acme.sh --set-auto-upgrade 1
 9
10# 关闭自动升级
11acme.sh --set-auto-upgrade 0

基础配置

指定证书颁发机构

acme.sh 默认使用 ZeroSSL,也可以切换到 Let's Encrypt:

 1# 使用 Let's Encrypt
 2acme.sh --set-default-ca --server letsencrypt
 3
 4# 使用 ZeroSSL(默认)
 5acme.sh --set-default-ca --server zerossl
 6
 7# 使用 Buypass
 8acme.sh --set-default-ca --server buypass
 9
10# 使用 Google Public Domain Registry
11acme.sh --set-default-ca --server google

账户管理

1# 查看当前账户信息
2acme.sh --list-account
3
4# 注册新账户(指定邮箱)
5acme.sh --register-account -m your@example.com
6
7# 切换到不同的 CA(需要重新注册)
8acme.sh --set-default-ca --server letsencrypt

配置文件位置

acme.sh 的配置和证书文件存储位置:

  • 主目录: ~/.acme.sh/
  • 证书目录: ~/.acme.sh/example.com/
  • 配置文件: ~/.acme.sh/account.conf
  • 日志文件: ~/.acme.sh/acme.sh.log

HTTP 验证方式

HTTP 验证适用于拥有 Web 服务器且 80 端口可访问的场景。

单域名申请

1# 申请单域名证书
2acme.sh --issue -d example.com -w /var/www/html
3
4# 指定 Web 根目录
5acme.sh --issue -d example.com --webroot /var/www/html

多域名和通配符申请

1# 多域名(SAN 证书)
2acme.sh --issue -d example.com -d www.example.com -w /var/www/html
3
4# 通配符证书(需要使用 DNS 验证)
5acme.sh --issue -d "*.example.com" --dns dns_cf

Nginx 集成

acme.sh 可以自动配置 Nginx 验证:

1# 自动配置 Nginx 验证
2acme.sh --issue -d example.com --nginx
3
4# 申请后安装证书到 Nginx
5acme.sh --install-cert -d example.com \
6  --cert-file /etc/nginx/ssl/example.com.crt \
7  --key-file /etc/nginx/ssl/example.com.key \
8  --fullchain-file /etc/nginx/ssl/fullchain.crt \
9  --reloadcmd "nginx -s reload"

Nginx 配置示例:

 1server {
 2    listen 443 ssl http2;
 3    server_name example.com;
 4
 5    ssl_certificate /etc/nginx/ssl/fullchain.crt;
 6    ssl_certificate_key /etc/nginx/ssl/example.com.key;
 7
 8    ssl_protocols TLSv1.2 TLSv1.3;
 9    ssl_ciphers HIGH:!aNULL:!MD5;
10    ssl_prefer_server_ciphers on;
11
12    # 其他配置...
13}
14
15server {
16    listen 80;
17    server_name example.com;
18    return 301 https://$server_name$request_uri;
19}

Apache 集成

1# 自动配置 Apache 验证
2acme.sh --issue -d example.com --apache
3
4# 安装证书
5acme.sh --install-cert -d example.com \
6  --cert-file /etc/apache2/ssl/example.com.crt \
7  --key-file /etc/apache2/ssl/example.com.key \
8  --fullchain-file /etc/apache2/ssl/fullchain.crt \
9  --reloadcmd "systemctl reload apache2"

DNS 验证方式

DNS 验证适用于申请通配符证书或无法访问 Web 服务器的场景。

Cloudflare DNS 验证

 1# 1. 获取 API Token(推荐方式)
 2# 登录 Cloudflare Dashboard → My Profile → API Tokens
 3# 创建具有 "Zone:DNS:Edit" 权限的 Token
 4
 5# 2. 设置环境变量
 6export CF_Token="your_api_token"
 7
 8# 3. 申请证书
 9acme.sh --issue -d example.com -d "*.example.com" --dns dns_cf
10
11# 或使用 Global Key(不推荐)
12export CF_Key="your_api_key"
13export CF_Email="your@email.com"
14acme.sh --issue -d example.com --dns dns_cf

阿里云 DNS 验证

1# 获取 AccessKey 和 Secret
2# 访问 https://ram.console.aliyun.com/manage/ak
3
4export Ali_Key="your_access_key"
5export Ali_Secret="your_access_secret"
6
7# 申请证书
8acme.sh --issue -d example.com -d "*.example.com" --dns dns_ali

腾讯云 DNS 验证

1# 获取 SecretId 和 SecretKey
2# 访问 https://console.cloud.tencent.com/cam/capi
3
4export DP_Id="your_secret_id"
5export DP_Key="your_secret_key"
6
7# 申请证书
8acme.sh --issue -d example.com -d "*.example.com" --dns dns_dp

DNSPod 验证

1export DP_Id="your_id"
2export DP_Key="your_key"
3
4acme.sh --issue -d example.com --dns dns_dp

GoDaddy 验证

1export GD_Key="your_api_key"
2export GD_Secret="your_api_secret"
3
4acme.sh --issue -d example.com --dns dns_gd

保存 DNS 凭据

为了避免每次都设置环境变量,可以将凭据保存到配置文件:

1# 方式 1: 使用 --saveaccount-conf
2acme.sh --issue -d example.com --dns dns_cf --saveaccount-conf
3
4# 方式 2: 手动编辑配置文件
5nano ~/.acme.sh/account.conf
6
7# 添加以下内容
8SAVED_CF_Token='your_api_token'
9SAVED_CF_Account_ID='your_account_id'

安全提示: 配置文件包含敏感信息,确保设置正确的权限:

1chmod 600 ~/.acme.sh/account.conf

支持的 DNS 服务商

acme.sh 支持 100+ 家 DNS 服务商,常用服务商包括:

服务商验证参数
Cloudflaredns_cf
阿里云dns_ali
腾讯云dns_dp
DNSPoddns_dp
GoDaddydns_gd
Namecheapdns_namecheap
AWS Route53dns_aws
Google Cloud DNSdns_gcloud
Linodedns_linode
DigitalOceandns_dgon

查看完整支持列表:

1acme.sh --set-default-ca --server letsencrypt --help | grep "dns_"

证书管理

查看已安装证书

1# 列出所有证书
2acme.sh --list
3
4# 查看证书详细信息
5acme.sh --info -d example.com

安装证书到指定位置

1acme.sh --install-cert -d example.com \
2  --cert-file /path/to/cert.crt \
3  --key-file /path/to/cert.key \
4  --fullchain-file /path/to/fullchain.crt \
5  --ca-file /path/to/ca.crt \
6  --reloadcmd "service nginx reload"

参数说明:

  • --cert-file: 域名证书
  • --key-file: 私钥文件
  • --fullchain-file: 完整证书链(包含中间证书)
  • --ca-file: CA 根证书
  • --reloadcmd: 安装后执行的命令

更新证书

acme.sh 默认会在证书到期前 30 天自动更新,也可以手动更新:

1# 强制更新证书
2acme.sh --renew -d example.com --force
3
4# 更新所有证书
5acme.sh --renew-all --force

撤销证书

1# 撤销证书
2acme.sh --revoke -d example.com
3
4# 删除证书(从本地移除)
5acme.sh --remove -d example.com

设置自动更新

acme.sh 安装时会自动创建 cron 任务:

1# 查看 cron 任务
2crontab -l | grep acme.sh
3
4# 示例输出
5# 0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

自定义更新时间:

1# 编辑 crontab
2crontab -e
3
4# 添加自定义任务(如每天凌晨 2 点更新)
50 2 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

高级功能

ECC 证书

ECC(椭圆曲线加密)证书相比传统 RSA 证书具有更小的密钥尺寸和更高的性能:

 1# 申请 ECC 证书
 2acme.sh --issue -d example.com --keylength ec-256
 3
 4# 申请 ECC 证书(更长的密钥)
 5acme.sh --issue -d example.com --keylength ec-384
 6
 7# 安装 ECC 证书
 8acme.sh --install-cert -d example.com --ecc \
 9  --cert-file /etc/nginx/ssl/ecc.crt \
10  --key-file /etc/nginx/ssl/ecc.key \
11  --fullchain-file /etc/nginx/ssl/ecc.fullchain.crt \
12  --reloadcmd "nginx -s reload"

支持的密钥长度:

  • ec-256: prime256v1(推荐)
  • ec-384: secp384r1
  • 2048: RSA 2048 位(默认)
  • 3072: RSA 3072 位
  • 4096: RSA 4096 位

多级 SAN 证书

1# 添加多个域名到证书
2acme.sh --issue -d example.com \
3  -d www.example.com \
4  -d api.example.com \
5  -d cdn.example.com \
6  -w /var/www/html

泛域名证书

1# 单级泛域名
2acme.sh --issue -d "*.example.com" --dns dns_cf
3
4# 多级泛域名(需要多次申请)
5acme.sh --issue -d "*.example.com" -d "*.sub.example.com" --dns dns_cf

混合验证方式

同时使用 HTTP 和 DNS 验证:

1acme.sh --issue -d example.com -d "*.example.com" \
2  --webroot /var/www/html \
3  --dns dns_cf

强制更新和调试

1# 强制重新申请证书
2acme.sh --renew -d example.com --force
3
4# 启用调试模式
5acme.sh --issue -d example.com -w /var/www/html --debug
6
7# 更详细的调试输出
8acme.sh --issue -d example.com -w /var/www/html --debug 2

使用 ACME v2

Let's Encrypt 的 ACME v2 协议支持通配符证书:

1# 指定使用 ACME v2 服务器
2acme.sh --server https://acme-v02.api.letsencrypt.org/directory \
3  --issue -d "*.example.com" --dns dns_cf
4
5# 或使用简写
6acme.sh --issue -d "*.example.com" --dns dns_cf --server letsencrypt

实战场景

自动化 Nginx SSL 部署

完整流程:申请证书 → 安装证书 → 配置 Nginx → 自动更新

 1# 1. 申请证书(HTTP 验证)
 2acme.sh --issue -d example.com -d www.example.com \
 3  -w /var/www/html --force
 4
 5# 2. 安装证书
 6acme.sh --install-cert -d example.com \
 7  --cert-file /etc/nginx/ssl/example.com.crt \
 8  --key-file /etc/nginx/ssl/example.com.key \
 9  --fullchain-file /etc/nginx/ssl/fullchain.crt \
10  --reloadcmd "nginx -s reload"
11
12# 3. 配置 Nginx
13cat > /etc/nginx/conf.d/example.conf << 'EOF'
14server {
15    listen 443 ssl http2;
16    server_name example.com www.example.com;
17
18    ssl_certificate /etc/nginx/ssl/fullchain.crt;
19    ssl_certificate_key /etc/nginx/ssl/example.com.key;
20    ssl_protocols TLSv1.2 TLSv1.3;
21    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
22    ssl_prefer_server_ciphers off;
23
24    root /var/www/html;
25    index index.html;
26}
27
28server {
29    listen 80;
30    server_name example.com www.example.com;
31    return 301 https://$server_name$request_uri;
32}
33EOF
34
35# 4. 测试并重载配置
36nginx -t && nginx -s reload
37
38# 5. 验证证书
39curl -I https://example.com

负载均衡环境证书部署

在多台负载均衡服务器上部署证书:

 1# 在主服务器上申请证书
 2acme.sh --issue -d example.com --dns dns_cf
 3
 4# 安装证书并同步到其他服务器
 5acme.sh --install-cert -d example.com \
 6  --cert-file /etc/nginx/ssl/example.com.crt \
 7  --key-file /etc/nginx/ssl/example.com.key \
 8  --fullchain-file /etc/nginx/ssl/fullchain.crt \
 9  --reloadcmd "
10    scp /etc/nginx/ssl/*.crt user@server2:/etc/nginx/ssl/
11    scp /etc/nginx/ssl/*.key user@server2:/etc/nginx/ssl/
12    ssh user@server2 'nginx -s reload'
13    nginx -s reload
14  "

Docker 容器 SSL 证书

为 Docker 容器提供 SSL 证书:

 1# 1. 申请证书
 2acme.sh --issue -d example.com --dns dns_cf
 3
 4# 2. 安装证书到共享目录
 5acme.sh --install-cert -d example.com \
 6  --cert-file /docker/certs/example.com.crt \
 7  --key-file /docker/certs/example.com.key \
 8  --fullchain-file /docker/certs/fullchain.crt \
 9  --reloadcmd "docker restart nginx-container"
10
11# 3. Docker Compose 配置
12cat > docker-compose.yml << 'EOF'
13version: '3'
14services:
15  nginx:
16    image: nginx:alpine
17    ports:
18      - "443:443"
19      - "80:80"
20    volumes:
21      - ./nginx.conf:/etc/nginx/nginx.conf:ro
22      - /docker/certs:/etc/nginx/ssl:ro
23      - ./html:/usr/share/nginx/html
24    restart: unless-stopped
25EOF
26
27# 4. 启动容器
28docker-compose up -d

证书监控和告警

 1#!/bin/bash
 2# 证书过期监控脚本
 3
 4# 配置
 5DOMAINS=("example.com" "api.example.com" "cdn.example.com")
 6ALERT_DAYS=30
 7EMAIL="admin@example.com"
 8
 9for domain in "${DOMAINS[@]}"; do
10    # 获取证书过期时间
11    exp_date=$(openssl s_client -connect $domain:443 -servername $domain 2>/dev/null \
12      | openssl x509 -noout -enddate | cut -d= -f2)
13
14    # 转换为时间戳
15    exp_epoch=$(date -d "$exp_date" +%s)
16    now_epoch=$(date +%s)
17    days_left=$(( ($exp_epoch - $now_epoch) / 86400 ))
18
19    if [ $days_left -lt $ALERT_DAYS ]; then
20        echo "警告: $domain 证书将在 $days_left 天后过期" | \
21          mail -s "SSL 证书过期告警" $EMAIL
22    fi
23done

批量证书管理

 1#!/bin/bash
 2# 批量申请证书脚本
 3
 4# 域名列表
 5declare -A domains=(
 6    ["example.com"]="dns_cf"
 7    ["myapp.com"]="dns_ali"
 8    ["test.io"]="dns_dp"
 9)
10
11# 遍历申请证书
12for domain in "${!domains[@]}"; do
13    dns_provider="${domains[$domain]}"
14    echo "正在为 $domain 申请证书($dns_provider)..."
15
16    acme.sh --issue -d "$domain" -d "*.$domain" \
17      --dns "$dns_provider" \
18      --keylength ec-256 \
19      --force
20
21    if [ $? -eq 0 ]; then
22        echo "$domain 证书申请成功"
23    else
24        echo "$domain 证书申请失败"
25    fi
26done

安全最佳实践

私钥保护

1# 设置严格的文件权限
2chmod 600 /etc/nginx/ssl/*.key
3chown root:root /etc/nginx/ssl/*.key
4
5# 确保证书目录权限正确
6chmod 755 /etc/nginx/ssl
7chown root:root /etc/nginx/ssl

定期更新证书

1# 查看证书到期时间
2acme.sh --list
3
4# 手动测试续期
5acme.sh --renew -d example.com --force --dry-run

使用强加密套件

Nginx 配置推荐:

 1# 仅支持 TLS 1.2 和 1.3
 2ssl_protocols TLSv1.2 TLSv1.3;
 3
 4# 使用强加密套件
 5ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
 6ssl_prefer_server_ciphers off;
 7
 8# 启用 OCSP Stapling
 9ssl_stapling on;
10ssl_stapling_verify on;
11ssl_trusted_certificate /etc/nginx/ssl/ca.crt;
12
13# 设置 DH 参数
14ssl_dhparam /etc/nginx/ssl/dhparam.pem;
15
16# 生成 DH 参数
17openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

配置 HSTS

1# 启用 HSTS(强制使用 HTTPS)
2add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

备份证书

 1#!/bin/bash
 2# 证书备份脚本
 3
 4BACKUP_DIR="/backup/ssl/$(date +%Y%m%d)"
 5mkdir -p "$BACKUP_DIR"
 6
 7# 复制证书文件
 8cp -r /etc/nginx/ssl/* "$BACKUP_DIR/"
 9
10# 备份 acme.sh 配置
11cp -r ~/.acme.sh "$BACKUP_DIR/"
12
13# 压缩备份
14tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
15rm -rf "$BACKUP_DIR"
16
17# 保留最近 30 天的备份
18find /backup/ssl -name "*.tar.gz" -mtime +30 -delete

故障排查

常见问题

问题 1: DNS 验证失败

1# 检查 DNS 记录是否生效
2dig _acme-challenge.example.com TXT
3
4# 查看 acme.sh 日志
5tail -f ~/.acme.sh/acme.sh.log
6
7# 手动添加 TXT 记录测试
8acme.sh --issue -d example.com --dns --dns-manual-mode

问题 2: HTTP 验证失败

1# 检查 Web 根目录权限
2ls -la /var/www/html/
3
4# 测试访问验证文件
5curl http://example.com/.well-known/acme-challenge/test
6
7# 检查防火墙规则
8sudo ufw status
9sudo iptables -L -n | grep 80

问题 3: 证书安装失败

1# 检查目录是否存在
2ls -ld /etc/nginx/ssl/
3
4# 检查文件权限
5stat /etc/nginx/ssl/example.com.key
6
7# 手动测试重载命令
8sudo nginx -t
9sudo nginx -s reload

问题 4: Cron 任务未执行

1# 检查 cron 任务
2crontab -l
3
4# 查看 cron 日志
5grep CRON /var/log/syslog
6
7# 手动运行 cron 任务
8"/home/user/.acme.sh/acme.sh" --cron --home "/home/user/.acme.sh"

调试模式

1# 启用调试输出
2acme.sh --issue -d example.com -w /var/www/html --debug
3
4# 更详细的调试(级别 2)
5acme.sh --issue -d example.com -w /var/www/html --debug 2
6
7# 查看完整日志
8tail -100 ~/.acme.sh/acme.sh.log

性能优化

 1# 使用 ECC 证书减少握手时间
 2acme.sh --issue -d example.com --keylength ec-256
 3
 4# 启用 HTTP/2 提高性能
 5# 在 Nginx 配置中添加
 6listen 443 ssl http2;
 7
 8# 使用 OCSP Stapling
 9ssl_stapling on;
10ssl_stapling_verify on;

与其他工具集成

Systemd 服务

创建 systemd 服务管理 acme.sh:

1# 创建服务文件
2sudo nano /etc/systemd/system/acme-sh.service
 1[Unit]
 2Description=ACME.sh SSL Certificate Renewal
 3After=network-online.target
 4Wants=network-online.target
 5
 6[Service]
 7Type=oneshot
 8ExecStart=/home/user/.acme.sh/acme.sh --cron --home /home/user/.acme.sh
 9User=user
10Group=user
11
12[Install]
13WantedBy=multi-user.target
1# 创建定时器
2sudo nano /etc/systemd/system/acme-sh.timer
1[Unit]
2Description=ACME.sh SSL Certificate Renewal Timer
3
4[Timer]
5OnCalendar=daily
6Persistent=true
7
8[Install]
9WantedBy=timers.target
1# 启用服务
2sudo systemctl enable --now acme-sh.timer
3sudo systemctl status acme-sh.timer

与 CI/CD 集成

在 CI/CD 流水线中自动更新证书:

 1# .gitlab-ci.yml 示例
 2stages:
 3  - ssl_renew
 4  - deploy
 5
 6ssl_renew:
 7  stage: ssl_renew
 8  script:
 9    - curl https://get.acme.sh | sh
10    - ~/.acme.sh/acme.sh --issue -d $DOMAIN --dns dns_cf
11    - ~/.acme.sh/acme.sh --install-cert -d $DOMAIN --reloadcmd "true"
12  artifacts:
13    paths:
14      - ~/.acme.sh/$DOMAIN/
15    expire_in: 1 week
16
17deploy:
18  stage: deploy
19  dependencies:
20    - ssl_renew
21  script:
22    - scp ~/.acme.sh/$DOMAIN/*.crt $SERVER:/etc/nginx/ssl/
23    - ssh $SERVER "nginx -s reload"
24  only:
25    - main

监控集成

使用 Prometheus 监控证书状态:

 1#!/bin/bash
 2# 证书到期监控 exporter
 3
 4# 输出 Prometheus 格式指标
 5echo "# HELP ssl_certificate_days_until_expiry Days until SSL certificate expires"
 6echo "# TYPE ssl_certificate_days_until_expiry gauge"
 7
 8for domain in example.com www.example.com; do
 9    exp_date=$(date -d "$(openssl s_client -connect $domain:443 -servername $domain 2>/dev/null |
10      openssl x509 -noout -enddate | cut -d= -f2)" +%s)
11    now_epoch=$(date +%s)
12    days_left=$(( ($exp_date - $now_epoch) / 86400 ))
13
14    echo "ssl_certificate_days_until_expiry{domain=\"$domain\"} $days_left"
15done

对比其他方案

acme.sh vs certbot

特性acme.shcertbot
依赖仅 ShellPython
安装大小极小 (~200KB)较大 (~50MB)
通配符证书支持支持
DNS 服务商100+有限
Docker 支持官方镜像官方镜像
性能更快较慢
配置复杂度简单较复杂

选择建议

  • 选择 acme.sh: 追求轻量级、需要支持多种 DNS 服务商、容器化部署
  • 选择 certbot: 已经在使用、习惯 Python 生态、需要官方支持

最佳实践

自动化优先

手动管理证书容易出错且容易忘记更新。建立完善的自动化流程:

  • 使用 cron 或 systemd 定时器自动更新证书
  • 配置自动重载 Web 服务
  • 设置证书过期监控告警

安全加固

  • 使用 ECC 证书提升性能和安全性
  • 启用 HSTS 防止降级攻击
  • 定期轮换 API 凭据
  • 限制证书文件访问权限

云原生部署

在 Kubernetes 环境中,考虑使用 cert-manager 等专用工具:

 1# 使用 cert-manager 自动管理证书
 2apiVersion: cert-manager.io/v1
 3kind: ClusterIssuer
 4metadata:
 5  name: letsencrypt-prod
 6spec:
 7  acme:
 8    server: https://acme-v02.api.letsencrypt.org/directory
 9    solvers:
10    - dns01:
11        cloudflare:
12          email: your@email.com
13          apiTokenSecretRef:
14            name: cloudflare-token
15            key: api-token

总结

acme.sh 是一款功能强大、轻量级且易于使用的 SSL 证书管理工具。通过掌握其核心功能和高级特性,可以构建完全自动化的证书管理体系。

关键要点:

  • 支持多种验证方式,适应不同部署环境
  • 内置 100+ DNS 服务商支持,轻松实现 DNS 验证
  • 自动更新机制,无需担心证书过期
  • 纯 Shell 实现,无额外依赖
  • 丰富的部署场景支持

证书管理是保障网站安全的基础工作,使用 acme.sh 可以大幅简化这一过程,让 HTTPS 部署变得简单高效。

参考资源

通过系统学习和实践 acme.sh,你将能够构建可靠的 SSL 证书自动化管理体系,为网站提供安全、高效的 HTTPS 服务。