9.9 KiB
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. 编译所有项目
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(推荐)
# 终端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(学习对比)
# 终端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双向认证:
// 服务器:要求客户端提供证书
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
证书管理
当前证书(内置演示用)
- CA证书:jessma.org
- 服务器证书:CN=localhost
- 客户端证书:CN=MyClient
- 私钥密码:123456
- 有效期:10年
生成新证书
# 使用自动化脚本
.\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)
理由:
- ✅ 代码更简洁
- ✅ 维护成本低
- ✅ 功能更完善
- ✅ 社区支持好
- ✅ 跨平台(Linux/Windows)
对于学习研究
推荐对比学习 Client vs Client-Native
收获:
- 📚 理解SSL/TLS协议
- 📚 理解网络库封装
- 📚 学习底层API
- 📚 提升编程能力
扩展方向
基于HP-Socket扩展
-
添加JSON协议
// 使用nlohmann/json解析数据 auto json = nlohmann::json::parse(data); std::string machineCode = json["machineCode"]; -
添加数据库支持
// 验证机器码时查询数据库 bool isValid = CheckMachineCodeInDB(machineCode); -
添加日志系统
// 记录所有连接和操作 Logger::Info("Client connected: {}", dwConnID); -
添加配置文件
// 从配置文件读取设置 Config cfg("server.ini"); int port = cfg.GetInt("port");
基于Client-Native扩展
-
实现异步I/O
- 使用IOCP(Windows)
- 提高并发性能
-
添加连接池
- 复用SSL连接
- 减少握手开销
-
实现自定义协议
- 消息分包
- 数据压缩
- 自定义加密
故障排查
编译错误
找不到OpenSSL头文件
error C1083: 无法打开包括文件: "openssl/ssl.h"
**解决:**检查项目属性中的包含目录路径
链接错误
error LNK2019: 无法解析的外部符号
**解决:**确保添加了所有必需的库:
- ws2_32.lib
- libssl.lib
- libcrypto.lib
- crypt32.lib
运行错误
SSL初始化失败
可能原因:
- 证书格式错误
- 私钥密码不正确
- CA证书缺失
**解决:**检查证书内容和密码
连接失败
可能原因:
- 服务器未启动
- 端口被占用
- 防火墙阻止
解决:
# 检查端口占用
netstat -ano | findstr :5555
# 检查防火墙
# Windows设置 -> 防火墙 -> 允许应用通过防火墙
SSL握手失败
可能原因:
- 证书不匹配
- CA证书不正确
- 验证模式不兼容
**解决:**确保客户端和服务器使用相同的CA证书
参考资料
HP-Socket
- 官方网站:https://github.com/ldcsaa/HP-Socket
- 文档:查看项目Doc目录
OpenSSL
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