acme.sh:强大的ACME协议Shell脚本,支持多DNS API

acme.sh:强大的ACME协议Shell脚本

项目描述

acme.sh是一个完全用Shell脚本编写的ACME协议客户端,专门设计用于从Let's Encrypt、ZeroSSL等证书颁发机构(CA)自动获取SSL/TLS证书。该项目支持ACME v2协议,包括通配符证书的签发,提供了简单易用的证书管理功能。

acme.sh的核心优势在于其丰富的DNS API支持,目前已经集成了超过100种DNS服务商的API接口,包括Cloudflare、阿里云、腾讯云、GoDaddy等主流服务商。这使得用户可以在各种DNS环境下实现证书的自动验证和续期。

功能特性

  • 多CA支持:支持Let's Encrypt、ZeroSSL、SSL.com、Google等多个证书颁发机构
  • 通配符证书:完整支持ACME v2协议,可签发通配符证书
  • DNS API集成:内置100+ DNS服务商的API支持,实现自动DNS验证
  • 跨平台兼容:纯Shell脚本实现,可在各种Unix-like系统上运行
  • 自动续期:内置证书自动续期机制,支持部署钩子
  • 零依赖:除Shell基本命令外无额外依赖,部署简单
  • 易于集成:提供丰富的部署脚本和Web服务器配置示例

安装指南

基本安装

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

或者使用wget:

wget -O -  https://get.acme.sh | sh

安装完成后,脚本会自动创建cron任务用于证书自动续期。

依赖要求

  • 支持的系统:Linux、BSD、macOS等Unix-like系统
  • 必需工具:curl或wget、openssl
  • Shell环境:兼容Bash、Dash等常见Shell

使用说明

基本证书签发

使用DNS API方式签发证书:

# 设置DNS API凭证
export CF_Key="your_cloudflare_key"
export CF_Email="your_email@example.com"

# 签发证书

DNS API配置示例

以Cloudflare为例的完整配置:

# 保存API凭证到配置文件中
acme.sh --set-default-ca --server letsencrypt
export CF_Key="your_cloudflare_api_key"
export CF_Email="your_cloudflare_account_email"

# 签发通配符证书

  -d example.com \
  -d *.example.com \
  --key-file /path/to/key.pem \
  --fullchain-file /path/to/fullchain.pem

证书部署

签发后自动部署到Web服务器:

# 部署到Nginx
acme.sh --install-cert -d example.com \
  --key-file /etc/nginx/ssl/example.com.key \
  --fullchain-file /etc/nginx/ssl/fullchain.cer \
  --reloadcmd "service nginx force-reload"

核心代码解析

主脚本结构

#!/usr/bin/env sh

VER=3.1.2
PROJECT_NAME="acme.sh"
PROJECT_ENTRY="acme.sh"
PROJECT="https://github.com/acmesh-official/$PROJECT_NAME"

# 默认安装目录
DEFAULT_INSTALL_HOME="$HOME/.$PROJECT_NAME"

# 支持的证书颁发机构
CA_LETSENCRYPT_V2="https://acme-v02.api.letsencrypt.org/directory"
CA_ZEROSSL="https://acme.zerossl.com/v2/DV90"
DEFAULT_CA=$CA_ZEROSSL

# 验证类型
VTYPE_HTTP="http-01"
VTYPE_DNS="dns-01"
VTYPE_ALPN="tls-alpn-01"

DNS API接口规范

每个DNS API模块都遵循相同的接口规范:

#!/usr/bin/env sh
# DNS API模块头信息
dns_provider_info='服务商信息
Site: 官方网站
Docs: 文档链接
Options:
 API_KEY_VAR API密钥变量说明
'

# 必需实现的函数
dns_provider_add() {
  fulldomain=$1
  txtvalue=$2
  # 添加TXT记录的实现
}

dns_provider_rm() {
  fulldomain=$1
  txtvalue=$2
  # 删除TXT记录的实现
}

证书签发核心逻辑


  # 验证域名所有权
  if [ -z "$FORCE_DNS" ] && [ -z "$FORCE_HTTP" ] && [ -z "$FORCE_TLS_ALPN" ]; then
    _select_verify_method
  fi
  
  # 执行验证
  if _validate_conditions; then
    if _trigger_validation; then
      _finalize
      _deploy
    fi
  fi
}

错误处理机制

_err() {
  printf "%s" "$@" >&2
  _logger "$@" >&2
  return 1
}

_debug() {
  if [ -z "$DEBUG" ]; then
    return
  fi
  printf "%s\n" "$@" >&2
  _logger "$@"
}

acme.sh通过模块化的设计和清晰的接口规范,使得新增DNS API支持变得简单直接。其健壮的错误处理和完善的日志系统确保了在各类环境下的稳定运行。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

posted @ 2025-09-25 11:01  qife  阅读(9)  评论(0)    收藏  举报