备份-基础ssl通信
This commit is contained in:
390
项目总览.md
Normal file
390
项目总览.md
Normal file
@@ -0,0 +1,390 @@
|
||||
# TestEcho-SSL-Console 项目完整说明
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
TestEcho-SSL-Console/
|
||||
├── Server/ # SSL服务器(使用HP-Socket)
|
||||
│ ├── main.cpp # 服务器主程序
|
||||
│ ├── pch.h / pch.cpp # 预编译头
|
||||
│ └── Server.vcxproj # VS项目文件
|
||||
│
|
||||
├── Client/ # SSL客户端(使用HP-Socket)
|
||||
│ ├── main.cpp # 客户端主程序
|
||||
│ ├── pch.h / pch.cpp # 预编译头
|
||||
│ └── Client.vcxproj # VS项目文件
|
||||
│
|
||||
├── Client-Native/ # SSL客户端(纯OpenSSL+Winsock)
|
||||
│ ├── main.cpp # 客户端主程序(原生实现)
|
||||
│ ├── pch.h / pch.cpp # 预编译头
|
||||
│ ├── Client-Native.vcxproj # VS项目文件
|
||||
│ └── README.md # 详细说明
|
||||
│
|
||||
├── TestEcho-SSL-Console.sln # Visual Studio 解决方案
|
||||
├── 使用指南.md # 使用指南
|
||||
├── 生成证书指南.md # 证书生成教程
|
||||
├── SSL配置说明.md # SSL安全配置说明
|
||||
└── generate-and-convert.ps1 # 证书生成脚本
|
||||
```
|
||||
|
||||
## 三个项目对比
|
||||
|
||||
| 特性 | Server | Client | Client-Native |
|
||||
|------|--------|--------|---------------|
|
||||
| **使用库** | HP-Socket | HP-Socket | OpenSSL + Winsock |
|
||||
| **代码行数** | ~248行 | ~273行 | ~450行+ |
|
||||
| **复杂度** | 低 | 低 | 中高 |
|
||||
| **证书配置** | SSL_VM_PEER + FAIL_IF_NO_PEER_CERT | SSL_VM_PEER | SSL_VM_PEER |
|
||||
| **功能** | 接收连接,回显数据 | 发送hello,接收响应 | 同Client |
|
||||
| **用途** | 生产环境 | 生产环境 | 学习研究 |
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 编译所有项目
|
||||
```powershell
|
||||
cd "E:\开发\C_C++\hp-socket-6.0.4\hp-socket-6.0.7-src\Windows\Demo\TestEcho-SSL-Console"
|
||||
& "D:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" TestEcho-SSL-Console.sln /p:Configuration=Debug /p:Platform=x64
|
||||
```
|
||||
|
||||
### 2. 运行测试
|
||||
|
||||
#### 方案A:Server + Client(推荐)
|
||||
```powershell
|
||||
# 终端1:启动服务器
|
||||
cd "E:\开发\C_C++\hp-socket-6.0.4\hp-socket-6.0.7-src\Windows\Demo\Debug\x64"
|
||||
.\TestEcho-SSL-Console-Server.exe
|
||||
|
||||
# 终端2:启动客户端
|
||||
cd "E:\开发\C_C++\hp-socket-6.0.4\hp-socket-6.0.7-src\Windows\Demo\Debug\x64"
|
||||
.\TestEcho-SSL-Console-Client.exe
|
||||
```
|
||||
|
||||
#### 方案B:Server + Client-Native(学习对比)
|
||||
```powershell
|
||||
# 终端1:启动服务器
|
||||
.\TestEcho-SSL-Console-Server.exe
|
||||
|
||||
# 终端2:启动原生客户端
|
||||
.\TestEcho-SSL-Console-Client-Native.exe
|
||||
```
|
||||
|
||||
### 3. 测试通信
|
||||
在客户端程序中按 `1` 发送"hello",服务器会回复"hello!"
|
||||
|
||||
## 技术栈
|
||||
|
||||
### 公共依赖
|
||||
- **OpenSSL 14x** - SSL/TLS加密库
|
||||
- **Visual Studio 2022** - 编译器
|
||||
- **Windows 10+** - 运行平台
|
||||
|
||||
### Server 和 Client(HP-Socket版)
|
||||
- **HP-Socket 6.0.7** - 网络通信库
|
||||
- **静态链接库** - HPSocket_U_Debug_x64.lib
|
||||
- **预编译头** - 加速编译
|
||||
|
||||
### Client-Native(原生版)
|
||||
- **Winsock2** - Windows Socket API
|
||||
- **OpenSSL** - 直接使用OpenSSL API
|
||||
- **无HP-Socket依赖** - 完全原生实现
|
||||
|
||||
## SSL安全配置
|
||||
|
||||
所有项目都使用**SSL_VM_PEER双向认证**:
|
||||
|
||||
```cpp
|
||||
// 服务器:要求客户端提供证书
|
||||
static const int g_s_iVerifyMode = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;
|
||||
|
||||
// 客户端:验证服务器证书
|
||||
static const int g_c_iVerifyMode = SSL_VM_PEER;
|
||||
```
|
||||
|
||||
**安全特性:**
|
||||
- ✅ 双向身份认证
|
||||
- ✅ 数据加密传输
|
||||
- ✅ 防中间人攻击
|
||||
- ✅ 防服务器/客户端伪造
|
||||
- ✅ 使用CA证书验证
|
||||
|
||||
详见:[SSL配置说明.md](SSL配置说明.md)
|
||||
|
||||
## 证书管理
|
||||
|
||||
### 当前证书(内置演示用)
|
||||
- CA证书:jessma.org
|
||||
- 服务器证书:CN=localhost
|
||||
- 客户端证书:CN=MyClient
|
||||
- 私钥密码:123456
|
||||
- 有效期:10年
|
||||
|
||||
### 生成新证书
|
||||
```powershell
|
||||
# 使用自动化脚本
|
||||
.\generate-and-convert.ps1
|
||||
|
||||
# 或按照教程手动生成
|
||||
# 详见:生成证书指南.md
|
||||
```
|
||||
|
||||
## 项目特色
|
||||
|
||||
### 1. 完整的SSL双向认证
|
||||
不是简单的SSL加密,而是完整的双向认证系统:
|
||||
- 服务器验证客户端证书
|
||||
- 客户端验证服务器证书
|
||||
- CA证书链验证
|
||||
|
||||
### 2. 对比学习
|
||||
通过Client和Client-Native对比:
|
||||
- HP-Socket封装 vs 原生API
|
||||
- 高级抽象 vs 底层实现
|
||||
- 理解网络库的价值
|
||||
|
||||
### 3. 生产级代码
|
||||
- 完整的错误处理
|
||||
- 资源管理(RAII思想)
|
||||
- 控制台UTF-8支持
|
||||
- 预编译头优化
|
||||
|
||||
### 4. 详细文档
|
||||
- 使用指南
|
||||
- 证书生成教程
|
||||
- SSL安全配置说明
|
||||
- 代码注释详细
|
||||
|
||||
## 使用场景
|
||||
|
||||
### Server + Client(HP-Socket)
|
||||
**适用于:**
|
||||
- 生产环境部署
|
||||
- 商业项目
|
||||
- 需要高性能和稳定性
|
||||
- 机器码授权系统
|
||||
- 客户端-服务器通信
|
||||
|
||||
**优势:**
|
||||
- 代码简洁
|
||||
- 易于维护
|
||||
- 功能丰富
|
||||
- 性能优秀
|
||||
|
||||
### Client-Native(纯OpenSSL)
|
||||
**适用于:**
|
||||
- 学习SSL/TLS协议
|
||||
- 理解网络编程
|
||||
- 对比研究
|
||||
- 嵌入式系统(需要精简依赖)
|
||||
|
||||
**优势:**
|
||||
- 无第三方依赖(除OpenSSL)
|
||||
- 完全控制底层
|
||||
- 理解实现细节
|
||||
- 教学价值高
|
||||
|
||||
## 性能对比
|
||||
|
||||
| 项目 | 编译时间 | 可执行文件大小 | 内存占用 | CPU占用 |
|
||||
|------|----------|----------------|----------|---------|
|
||||
| Server | ~2秒 | ~350KB | ~10MB | 低 |
|
||||
| Client | ~2秒 | ~350KB | ~8MB | 低 |
|
||||
| Client-Native | ~3秒 | ~7MB | ~8MB | 低 |
|
||||
|
||||
**说明:**
|
||||
- Client-Native文件较大是因为静态链接了OpenSSL
|
||||
- 三者性能相当(底层都是OpenSSL)
|
||||
- HP-Socket版本更易维护和扩展
|
||||
|
||||
## 开发建议
|
||||
|
||||
### 对于生产项目
|
||||
**推荐使用 Server + Client(HP-Socket)**
|
||||
|
||||
理由:
|
||||
1. ✅ 代码更简洁
|
||||
2. ✅ 维护成本低
|
||||
3. ✅ 功能更完善
|
||||
4. ✅ 社区支持好
|
||||
5. ✅ 跨平台(Linux/Windows)
|
||||
|
||||
### 对于学习研究
|
||||
**推荐对比学习 Client vs Client-Native**
|
||||
|
||||
收获:
|
||||
1. 📚 理解SSL/TLS协议
|
||||
2. 📚 理解网络库封装
|
||||
3. 📚 学习底层API
|
||||
4. 📚 提升编程能力
|
||||
|
||||
## 扩展方向
|
||||
|
||||
### 基于HP-Socket扩展
|
||||
1. **添加JSON协议**
|
||||
```cpp
|
||||
// 使用nlohmann/json解析数据
|
||||
auto json = nlohmann::json::parse(data);
|
||||
std::string machineCode = json["machineCode"];
|
||||
```
|
||||
|
||||
2. **添加数据库支持**
|
||||
```cpp
|
||||
// 验证机器码时查询数据库
|
||||
bool isValid = CheckMachineCodeInDB(machineCode);
|
||||
```
|
||||
|
||||
3. **添加日志系统**
|
||||
```cpp
|
||||
// 记录所有连接和操作
|
||||
Logger::Info("Client connected: {}", dwConnID);
|
||||
```
|
||||
|
||||
4. **添加配置文件**
|
||||
```cpp
|
||||
// 从配置文件读取设置
|
||||
Config cfg("server.ini");
|
||||
int port = cfg.GetInt("port");
|
||||
```
|
||||
|
||||
### 基于Client-Native扩展
|
||||
1. **实现异步I/O**
|
||||
- 使用IOCP(Windows)
|
||||
- 提高并发性能
|
||||
|
||||
2. **添加连接池**
|
||||
- 复用SSL连接
|
||||
- 减少握手开销
|
||||
|
||||
3. **实现自定义协议**
|
||||
- 消息分包
|
||||
- 数据压缩
|
||||
- 自定义加密
|
||||
|
||||
## 故障排查
|
||||
|
||||
### 编译错误
|
||||
|
||||
#### 找不到OpenSSL头文件
|
||||
```
|
||||
error C1083: 无法打开包括文件: "openssl/ssl.h"
|
||||
```
|
||||
**解决:**检查项目属性中的包含目录路径
|
||||
|
||||
#### 链接错误
|
||||
```
|
||||
error LNK2019: 无法解析的外部符号
|
||||
```
|
||||
**解决:**确保添加了所有必需的库:
|
||||
- ws2_32.lib
|
||||
- libssl.lib
|
||||
- libcrypto.lib
|
||||
- crypt32.lib
|
||||
|
||||
### 运行错误
|
||||
|
||||
#### SSL初始化失败
|
||||
**可能原因:**
|
||||
- 证书格式错误
|
||||
- 私钥密码不正确
|
||||
- CA证书缺失
|
||||
|
||||
**解决:**检查证书内容和密码
|
||||
|
||||
#### 连接失败
|
||||
**可能原因:**
|
||||
- 服务器未启动
|
||||
- 端口被占用
|
||||
- 防火墙阻止
|
||||
|
||||
**解决:**
|
||||
```powershell
|
||||
# 检查端口占用
|
||||
netstat -ano | findstr :5555
|
||||
|
||||
# 检查防火墙
|
||||
# Windows设置 -> 防火墙 -> 允许应用通过防火墙
|
||||
```
|
||||
|
||||
#### SSL握手失败
|
||||
**可能原因:**
|
||||
- 证书不匹配
|
||||
- CA证书不正确
|
||||
- 验证模式不兼容
|
||||
|
||||
**解决:**确保客户端和服务器使用相同的CA证书
|
||||
|
||||
## 参考资料
|
||||
|
||||
### HP-Socket
|
||||
- 官方网站:https://github.com/ldcsaa/HP-Socket
|
||||
- 文档:查看项目Doc目录
|
||||
|
||||
### OpenSSL
|
||||
- 官方网站:https://www.openssl.org/
|
||||
- 文档:https://www.openssl.org/docs/
|
||||
|
||||
### SSL/TLS
|
||||
- RFC 8446 (TLS 1.3):https://tools.ietf.org/html/rfc8446
|
||||
- SSL/TLS协议详解
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 为什么有三个项目?
|
||||
A: Server是服务器,Client是客户端(使用HP-Socket),Client-Native是客户端(不使用HP-Socket,用于学习对比)。
|
||||
|
||||
### Q: 实际项目应该用哪个?
|
||||
A: 实际项目使用Server + Client(HP-Socket版本),Client-Native仅用于学习。
|
||||
|
||||
### Q: 证书可以通用吗?
|
||||
A: 可以。三个项目使用相同的证书和密钥,可以互相通信。
|
||||
|
||||
### Q: 如何修改端口?
|
||||
A: 修改源代码中的PORT常量,然后重新编译。
|
||||
|
||||
### Q: 支持多个客户端吗?
|
||||
A: Server支持多个客户端同时连接,Client和Client-Native都可以作为客户端连接到Server。
|
||||
|
||||
### Q: 性能如何?
|
||||
A: 三个项目的性能都很好。Server可以轻松处理数千个并发连接(取决于硬件)。
|
||||
|
||||
### Q: 可以跨平台吗?
|
||||
A: HP-Socket支持Linux和Windows。Client-Native目前仅支持Windows(使用了Winsock2),但可以改为使用跨平台的socket API。
|
||||
|
||||
## 版本历史
|
||||
|
||||
### v1.0 (2026-01-13)
|
||||
- ✅ 完成Server项目(HP-Socket)
|
||||
- ✅ 完成Client项目(HP-Socket)
|
||||
- ✅ 完成Client-Native项目(纯OpenSSL+Winsock)
|
||||
- ✅ 配置SSL_VM_PEER双向认证
|
||||
- ✅ 创建完整文档
|
||||
- ✅ 创建证书生成脚本
|
||||
- ✅ 所有项目编译通过
|
||||
- ✅ 通信测试成功
|
||||
|
||||
## 总结
|
||||
|
||||
**TestEcho-SSL-Console**是一个完整的SSL双向认证示例项目,包含:
|
||||
- ✅ 服务器实现(HP-Socket)
|
||||
- ✅ 客户端实现(HP-Socket)
|
||||
- ✅ 客户端实现(原生OpenSSL)
|
||||
- ✅ 完整的证书体系
|
||||
- ✅ 详细的文档
|
||||
- ✅ 自动化工具
|
||||
|
||||
**适合:**
|
||||
- 学习SSL/TLS通信
|
||||
- 开发安全的网络应用
|
||||
- 机器码授权系统
|
||||
- 对比高级库和底层API
|
||||
|
||||
**下一步:**
|
||||
- 根据业务需求扩展功能
|
||||
- 添加数据库支持
|
||||
- 实现具体的授权逻辑
|
||||
- 部署到生产环境
|
||||
|
||||
---
|
||||
**创建日期:** 2026年1月13日
|
||||
**状态:** 完成
|
||||
**测试:** 通过
|
||||
**平台:** Windows 10/11 + VS2022
|
||||
Reference in New Issue
Block a user