# OpenSSL许可证验证系统使用说明

## 概述

本系统使用OpenSSL公钥/私钥对来确保许可证的安全性。通过数字签名技术，可以有效防止许可证被篡改或伪造。

## 密钥生成

系统会自动生成2048位的RSA密钥对：

- 私钥文件: `keys/private_key.pem` (用于生成许可证签名)
- 公钥文件: `keys/public_key.pem` (用于验证许可证签名)

### 手动生成密钥对

如果需要重新生成密钥对，可以使用以下命令：

```bash
# 生成私钥
openssl genrsa -out keys/private_key.pem 2048

# 从私钥导出公钥
openssl rsa -in keys/private_key.pem -pubout -out keys/public_key.pem
```

## 许可证签名机制

### 签名过程

1. 系统收集许可证的所有关键信息
2. 将信息序列化为JSON格式
3. 使用私钥对JSON数据进行SHA256签名
4. 将签名结果Base64编码后存储到数据库

### 验证过程

1. 客户端获取许可证信息和签名
2. 使用公钥验证签名的有效性
3. 检查许可证的其他约束条件（有效期、绑定信息等）

## API接口

### 获取公钥

```
GET /api/v1/license/get_public_key
```

返回公钥内容，供客户端验证使用。

### 申请许可证

```
POST /api/v1/license/apply
参数:
- software_id: 软件ID
- domain: 绑定域名（可选）
- ip: 绑定IP（可选）
- machine_code: 绑定机器码（可选）
```

### 验证许可证

```
POST /api/v1/license/validate
参数:
- license_key: 许可证密钥
- domain: 域名（可选）
- ip: IP地址（可选）
- machine_code: 机器码（可选）
```

## Python客户端验证

系统提供了Python客户端验证示例：

```python
from python_license_validator import LicenseValidator

# 创建验证器
validator = LicenseValidator(api_base_url="http://your-api-url/api/v1")

# 离线验证
result = validator.validate_offline(license_info, signature)
```

## 安全建议

1. **私钥保护**: 私钥文件应严格保护，不应暴露给客户端
2. **定期更换**: 建议定期更换密钥对以提高安全性
3. **传输安全**: 所有API调用应使用HTTPS加密传输
4. **备份密钥**: 妥善备份密钥对，防止丢失

## 故障排除

### 密钥文件不存在

确保[keys]目录下存在[private_key.pem]和[public_key.pem]文件。

### 签名验证失败

1. 检查许可证数据是否完整
2. 确认使用的公钥与生成签名时的私钥匹配
3. 验证数据序列化格式是否一致

## 技术细节

### 签名数据结构

```json
{
  "license_key": "许可证密钥",
  "software_id": "软件ID",
  "domain": "绑定域名",
  "ip_address": "绑定IP",
  "machine_code": "绑定机器码",
  "expires_at": "过期时间",
  "created_at": "创建时间"
}
```

### 签名算法

- 非对称算法: RSA 2048位
- 摘要算法: SHA256
- 填充方式: PKCS1v15