Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions BUSINESS_FLOW.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
# acme.sh 业务流程图

## 整体架构流程

```mermaid
graph TD
A[用户命令] --> B{命令类型}

B -->|--issue| C[证书申请流程]
B -->|--renew| D[证书续期流程]
B -->|--install-cert| E[证书安装流程]
B -->|--deploy| F[证书部署流程]
B -->|--install| G[安装 acme.sh]

C --> H[域名验证]
D --> H
H --> I{验证方式}

I -->|HTTP-01| J[Webroot/Standalone验证]
I -->|DNS-01| K[DNS验证]
I -->|TLS-ALPN-01| L[TLS-ALPN验证]

J --> M[CA验证通过]
K --> M
L --> M

M --> N[生成证书]
N --> O[保存证书文件]
O --> P[执行钩子脚本]

E --> Q[复制证书到目标位置]
Q --> R[重载服务]

F --> S[调用部署钩子]
S --> T[部署到具体服务]
```

## 证书申请详细流程

```mermaid
sequenceDiagram
participant U as 用户
participant A as acme.sh
participant CA as Certificate Authority
participant DNS as DNS Provider
participant WEB as Web Server

U->>A: acme.sh --issue -d domain.com
A->>A: 检查配置和参数
A->>A: 生成账户密钥(如果不存在)
A->>CA: 注册账户
CA-->>A: 账户注册成功

A->>CA: 请求证书订单
CA-->>A: 返回验证挑战

alt DNS验证模式
A->>DNS: 添加 TXT 记录
DNS-->>A: 记录添加成功
A->>CA: 通知验证就绪
CA->>DNS: 验证 TXT 记录
DNS-->>CA: 验证通过
else HTTP验证模式
A->>WEB: 创建验证文件
WEB-->>A: 文件创建成功
A->>CA: 通知验证就绪
CA->>WEB: 访问验证文件
WEB-->>CA: 返回验证内容
end

CA-->>A: 验证通过
A->>CA: 请求签发证书
CA-->>A: 返回证书
A->>A: 保存证书文件
A->>A: 执行后置钩子
A-->>U: 证书申请完成
```

## DNS API 验证流程

```mermaid
graph TD
A[开始DNS验证] --> B[检查DNS API配置]
B --> C{API类型}

C -->|Cloudflare| D[使用CF API]
C -->|阿里云| E[使用阿里云API]
C -->|其他| F[使用对应API]

D --> G[获取Zone ID]
E --> G
F --> G

G --> H[添加TXT记录]
H --> I[等待DNS传播]
I --> J[通知CA验证]
J --> K[CA验证DNS记录]
K --> L{验证结果}

L -->|成功| M[删除TXT记录]
L -->|失败| N[报告错误]

M --> O[验证完成]
N --> P[验证失败]
```

## 证书续期流程

```mermaid
graph TD
A[Cron定时任务] --> B[扫描所有证书]
B --> C{证书是否需要续期}

C -->|是| D[读取证书配置]
C -->|否| E[跳过此证书]

D --> F[执行续期前钩子]
F --> G[调用issue函数]
G --> H{续期是否成功}

H -->|成功| I[执行续期后钩子]
H -->|失败| J[记录错误日志]

I --> K[重载相关服务]
J --> L[发送通知]

E --> M[检查下一个证书]
K --> M
L --> M

M --> N{还有证书?}
N -->|是| C
N -->|否| O[续期任务完成]
```

## 部署钩子系统

```mermaid
graph TD
A[证书生成完成] --> B[检查部署钩子]
B --> C{钩子类型}

C -->|nginx| D[nginx部署脚本]
C -->|apache| E[apache部署脚本]
C -->|docker| F[docker部署脚本]
C -->|自定义| G[自定义部署脚本]

D --> H[复制证书文件]
E --> H
F --> H
G --> H

H --> I[更新配置文件]
I --> J[重载/重启服务]
J --> K[验证部署结果]
K --> L[部署完成]
```

## 主要数据结构

### 证书配置文件结构
```
~/.acme.sh/domain.com/
├── domain.com.conf # 证书配置
├── domain.com.key # 私钥
├── domain.com.cer # 证书
├── ca.cer # CA证书
└── fullchain.cer # 完整证书链
```

### 配置参数
- `Le_Domain`: 主域名
- `Le_Alt`: 备用域名
- `Le_Webroot`: Web根目录
- `Le_PreHook`: 前置钩子
- `Le_PostHook`: 后置钩子
- `Le_RenewHook`: 续期钩子
- `Le_DeployHook`: 部署钩子

## 关键业务逻辑

1. **ACME协议实现**: 完整实现 RFC 8555 ACME 协议
2. **多CA支持**: 支持 Let's Encrypt, ZeroSSL, SSL.com 等多个CA
3. **自动化续期**: 默认60天自动续期机制
4. **灵活验证**: 支持多种域名验证方式
5. **钩子系统**: 丰富的钩子机制支持自动化部署
6. **跨平台**: 支持多种操作系统和Shell环境
156 changes: 156 additions & 0 deletions IMPLEMENTATION_SUMMARY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# acme.sh Go 重新实现总结

## 项目概述

本项目成功分析了 acme.sh 的业务逻辑,并用 Go 语言重新实现了其核心功能。acme.sh 是一个纯 Shell 脚本实现的 ACME 协议客户端,用于自动申请和续期 SSL/TLS 证书。

## 业务逻辑分析

### 核心功能模块
1. **证书申请 (Issue)** - 向 CA 申请新证书
2. **证书续期 (Renew)** - 自动续期即将过期的证书
3. **证书安装 (Install)** - 将证书安装到服务器
4. **证书部署 (Deploy)** - 使用部署钩子自动部署证书
5. **域名验证** - 支持多种验证方式

### 支持的验证模式
- **HTTP-01**: Webroot 模式、Standalone 模式、Apache/Nginx 模式
- **DNS-01**: DNS API 模式、手动 DNS 模式
- **TLS-ALPN-01**: TLS-ALPN 验证模式

## Go 实现架构

### 项目结构
```
/workspace/
├── cmd/ # CLI 命令实现
│ ├── root.go # 根命令和配置
│ ├── issue.go # 证书申请命令
│ ├── renew.go # 证书续期命令
│ ├── install.go # 证书安装命令
│ ├── deploy.go # 证书部署命令
│ └── list.go # 证书列表命令
├── internal/
│ ├── acme/ # ACME 客户端核心逻辑
│ │ ├── client.go # 主要客户端实现
│ │ └── dns.go # DNS 提供商接口
│ └── config/ # 配置管理
│ └── config.go # 配置结构和加载
├── scripts/ # 部署脚本
│ ├── deploy-nginx.sh # Nginx 部署脚本
│ └── deploy-docker.sh # Docker 部署脚本
├── examples/ # 示例配置
│ └── config.yaml # 配置文件示例
├── main.go # 程序入口
├── go.mod # Go 模块定义
├── Makefile # 构建脚本
└── README.md # 项目文档
```

### 核心特性

#### 1. 命令行接口
使用 Cobra 库实现了完整的 CLI 接口,支持以下命令:
- `acme-go issue` - 申请证书
- `acme-go renew` - 续期证书
- `acme-go install-cert` - 安装证书
- `acme-go deploy` - 部署证书
- `acme-go list` - 列出证书

#### 2. 配置管理
- 支持 YAML 配置文件 (`~/.acme-go.yaml`)
- 环境变量支持
- 命令行参数覆盖配置

#### 3. ACME 客户端
- 基于 lego 库实现 ACME 协议
- 支持多个 CA (Let's Encrypt, ZeroSSL 等)
- 支持多种密钥类型 (RSA, ECDSA)

#### 4. 验证方法
- HTTP-01 验证 (Webroot, Standalone)
- DNS-01 验证 (支持多个 DNS 提供商)
- 手动 DNS 验证

#### 5. 证书管理
- 自动证书存储和管理
- 证书续期检查
- 证书安装到指定位置

#### 6. 部署系统
- 灵活的部署钩子系统
- 预置 Nginx 和 Docker 部署脚本
- 支持自定义部署脚本

## 业务流程图

项目包含详细的业务流程图,展示了:
1. 整体架构流程
2. 证书申请详细流程
3. DNS API 验证流程
4. 证书续期流程
5. 部署钩子系统

## 使用示例

### 基本证书申请
```bash
# HTTP 验证
acme-go issue -d example.com -w /var/www/html --email [email protected]

# DNS 验证
acme-go issue -d "*.example.com" --dns dns_cf --email [email protected]
```

### 证书安装
```bash
acme-go install-cert -d example.com \
--cert-file /etc/nginx/ssl/cert.pem \
--key-file /etc/nginx/ssl/key.pem \
--reload-cmd "systemctl reload nginx"
```

### 证书续期
```bash
# 续期单个证书
acme-go renew -d example.com

# 续期所有证书
acme-go renew --all
```

## 技术优势

### 相比原版 acme.sh 的优势
1. **性能**: Go 编译型语言,执行效率更高
2. **错误处理**: 更完善的错误处理和日志记录
3. **类型安全**: 静态类型检查,减少运行时错误
4. **并发处理**: Go 的并发特性,支持并行处理
5. **跨平台**: 单一二进制文件,跨平台部署
6. **配置管理**: 结构化配置文件,更易管理
7. **测试**: 更好的单元测试支持

### 保持的兼容性
1. **命令行接口**: 保持与 acme.sh 类似的命令结构
2. **验证方法**: 支持相同的验证方式
3. **DNS 提供商**: 支持主流 DNS 提供商
4. **部署钩子**: 兼容现有部署脚本

## 扩展性

### 易于扩展的设计
1. **插件化 DNS 提供商**: 通过接口轻松添加新的 DNS 提供商
2. **灵活的部署钩子**: 支持自定义部署脚本
3. **模块化架构**: 清晰的模块分离,便于维护和扩展
4. **配置驱动**: 通过配置文件轻松添加新功能

### 未来发展方向
1. **更多 DNS 提供商支持**
2. **图形用户界面**
3. **Web 管理界面**
4. **集群部署支持**
5. **监控和告警集成**

## 总结

本项目成功实现了 acme.sh 的核心功能,并在性能、可维护性和扩展性方面有显著提升。Go 实现提供了更好的错误处理、类型安全和跨平台支持,同时保持了与原版的兼容性。项目结构清晰,代码质量高,具有良好的可扩展性,为后续功能增强奠定了坚实基础。
Loading