# free-ssl-api
**Repository Path**: luckythc/free-ssl-api
## Basic Information
- **Project Name**: free-ssl-api
- **Description**: 免费证书申请API服务
- **Primary Language**: NodeJS
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-23
- **Last Updated**: 2025-12-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SSL 证书服务 API
这是一个基于 Node.js 和 Express 开发的 SSL 证书服务 API,提供证书申请、状态查询和下载功能。
## 文档
- **项目说明**:本 README.md 提供项目概述和快速开始指南
- **详细API使用手册**:请参考 文件,包含完整的API接口说明、HMAC签名算法详解和各种语言的示例代码
## 功能特点
- ✅ 真实Let's Encrypt证书申请
- ✅ DNS验证支持(阿里云、百度云、华为云、腾讯云、Cloudflare、Google DNS)
- ✅ DNS凭证预先验证
- ✅ 证书状态查询接口
- ✅ 证书下载接口
- ✅ 参数验证
- ✅ 错误处理
- ✅ 日志记录
- ✅ 回调通知
- ✅ 证书存在性检查
- ✅ API接口认证(HMAC签名验证)
## 项目结构
```directory
api/
├── config/ # 配置文件
├── controllers/ # 控制器
├── middlewares/ # 中间件
├── routes/ # 路由
├── services/ # 业务逻辑层
├── utils/ # 工具函数
├── app.js # Express 应用配置
├── index.js # 应用入口
├── package.json # 项目配置
└── README.md # 项目说明
```
## 安装依赖
```bash
npm install
```
### 核心依赖
- `express`: Web框架
- `express-validator`: 参数验证
- `winston`: 日志记录
- `axios`: HTTP请求(用于回调通知)
- `greenlock-express`: Let's Encrypt客户端
- `le-acme-core`: ACME协议核心功能
- `uuid`: 生成唯一标识符
- `@alicloud/pop-core`: 阿里云SDK
- `tencentcloud-sdk-nodejs`: 腾讯云SDK
- `@huaweicloud/huaweicloud-sdk-core`: 华为云SDK核心
- `@huaweicloud/huaweicloud-sdk-dns`: 华为云DNS SDK
- `cloudflare`: Cloudflare API客户端
- `@google-cloud/dns`: Google DNS API客户端
## 启动服务
### 使用NPM命令启动
```bash
# 启动服务
npm start
# 开发模式启动
npm run dev
```
### 使用启动脚本
```bash
# Windows环境
./start.bat
# Linux/Mac环境
chmod +x start.sh
./start.sh
```
服务默认运行在
## 环境变量
- `PORT`: 服务端口,默认3000
- `NODE_ENV`: 运行环境,默认development
- `LETSENCRYPT_EMAIL`: Let's Encrypt账户邮箱
- `LETSENCRYPT_SERVER`: Let's Encrypt服务器地址
- 测试环境: `https://acme-staging-v02.api.letsencrypt.org/directory` (默认)
- 生产环境: `https://acme-v02.api.letsencrypt.org/directory`
- `CERT_STORAGE_PATH`: 证书存储路径,默认`./certificates`
## API 接口
### 1. 注册API访问凭证
**请求路径**: `POST /api/auth/register`
**请求参数**:
```json
{
"username": "admin",
"password": "admin123"
}
```
**响应**: 成功时返回token和secretKey
```json
{
"code": 200,
"message": "注册成功",
"data": {
"token": "your-token",
"secretKey": "your-secret-key",
"createdAt": "2024-01-01T00:00:00.000Z"
}
}
```
**说明**:
- 使用用户名和密码获取API访问凭证
- 返回的token和secretKey用于后续接口的HMAC签名认证
- 每个用户只生成一对token和secretKey(重复注册返回已有凭证)
### 2. 申请证书
**请求路径**: `POST /api/certificate/apply`
**请求头**:
- `x-token`: 注册时获取的token
- `x-signature`: HMAC-SHA256签名
- `x-timestamp`: 当前时间戳(秒)
**请求参数**:
```json
{
"domain": "example.com",
"dnsProvider": {
"id": "aliyun", // 可选值: aliyun, baidu, huawei, tencent, cloudflare, google
// 以下为阿里云配置示例
"accessKeyId": "your_access_key_id",
"accessKeySecret": "your_access_key_secret"
},
"certificateProvider": "letsencrypt", // 可选,默认为 letsencrypt
"callbackUrl": "https://your-server.com/callback" // 可选
}
```
**各DNS提供者配置说明**:
1. **阿里云**:
```json
{
"id": "aliyun",
"accessKey": "your_access_key_id",
"secretKey": "your_access_key_secret"
}
```
2. **百度云**:
```json
{
"id": "baidu",
"accessKey": "your_baidu_ak",
"secretKey": "your_baidu_sk"
}
```
3. **华为云**:
```json
{
"id": "huawei",
"projectId": "your_project_id",
"accessKey": "your_huawei_ak",
"secretKey": "your_huawei_sk"
}
```
4. **腾讯云**:
```json
{
"id": "tencent",
"accessKey": "your_secret_id",
"secretKey": "your_secret_key"
}
```
5. **Cloudflare** (支持两种认证方式):
```json
// 方式1: API Token (推荐)
{
"id": "cloudflare",
"apiToken": "your_cloudflare_api_token"
}
// 方式2: API Token + Email
```json
{
"id": "cloudflare",
"apiToken": "your_cloudflare_api_token",
"email": "your_cloudflare_email"
}
```
6. **Google DNS**:
```json
{
"id": "google",
"credentials": {"type":"service_account", ...},
"projectId": "your-project-id"
}
```
**说明**:
- 系统会先验证DNS凭证(AccessKeyId和AccessKeySecret)的正确性
- 凭证无效时会立即返回错误信息
- 系统会检查证书是否已存在,如存在则直接返回
- 不存在时会通过Let's Encrypt API申请新证书
- 申请过程中会执行DNS验证
- 证书成功后会自动保存在配置的存储路径中
**响应**: 成功时返回请求ID
```json
{
"code": 200,
"message": "证书申请已提交",
"data": {
"requestId": "uuid-request-id"
}
}
```
### 2. 查询请求状态
**请求路径**: `GET /api/certificate/status?requestId=uuid-request-id`
**请求头**:
- `x-token`: 注册时获取的token
- `x-signature`: HMAC-SHA256签名
- `x-timestamp`: 当前时间戳(秒)
**响应**:
```json
{
"code": 200,
"message": "查询成功",
"data": {
"requestId": "uuid-request-id",
"domain": "example.com",
"status": "success", // pending, processing, success, failed
"certificateId": "uuid-certificate-id", // 成功时返回
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}
```
### 3. 下载证书
**请求路径**: `GET /api/certificate/download/:certificateId`
**请求头**:
- `x-token`: 注册时获取的token
- `x-signature`: HMAC-SHA256签名
- `x-timestamp`: 当前时间戳(秒)
**响应**: 返回二进制证书数据(包含证书和私钥)
## 健康检查
**请求路径**: `GET /health`
**响应**:
```json
{
"code": 200,
"message": "服务运行正常",
"data": {
"timestamp": "2024-01-01T00:00:00.000Z",
"version": "1.0.0"
}
}
```
## 错误响应格式
```json
{
"code": 错误码,
"message": "错误消息",
"data": 错误详情
}
```
## 日志
- `error.log`: 错误日志
- `combined.log`: 所有日志
## HMAC签名计算方法
所有需要认证的接口都需要在请求头中提供以下参数:
```headers
x-token: 注册获取的token
x-signature: HMAC-SHA256签名
x-timestamp: 当前时间戳(秒)
```
签名计算步骤:
1. 构建签名字符串:`{method}\n{path}\n{timestamp}[\n{body}]`
- method: HTTP请求方法(大写)
- path: 请求路径(如/api/certificate/apply)
- timestamp: 请求头中的x-timestamp值
- body: 如果有请求体,需要序列化为JSON字符串
2. 使用注册时获取的secretKey作为密钥,计算HMAC-SHA256哈希值
3. 将计算结果作为x-signature请求头的值
示例代码(Node.js):
```javascript
const crypto = require('crypto');
function generateSignature(method, path, timestamp, body, secretKey) {
let dataToSign = `${method}\n${path}\n${timestamp}`;
if (body && Object.keys(body).length > 0) {
dataToSign += `\n${JSON.stringify(body)}`;
}
return crypto.createHmac('sha256', secretKey)
.update(dataToSign)
.digest('hex');
}
```
## 注意事项
1. 本项目目前使用内存和文件系统存储请求和证书信息,生产环境建议使用数据库
2. 证书申请是异步处理的,需要通过状态查询接口获取处理结果
3. 如果提供了 callbackUrl,证书申请成功后会向该地址发送通知
4. 本项目仅作为示例,实际生产环境需要添加更多安全措施
5. 当前支持的DNS提供者:aliyun、baidu、huawei、tencent、cloudflare、google
6. 当前支持的证书提供者:letsencrypt
7. HMAC签名验证提供了防重放保护,时间戳与服务器时间偏差不应超过5分钟
8. 除了健康检查接口和认证注册接口外,所有其他接口都需要HMAC认证