Files
--hp-socket-TCP--ssl--/项目总览.md
2026-01-23 08:39:07 +08:00

9.9 KiB
Raw Permalink Blame History

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. 运行测试

方案AServer + 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

方案BServer + 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 和 ClientHP-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 + ClientHP-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 + ClientHP-Socket

理由:

  1. 代码更简洁
  2. 维护成本低
  3. 功能更完善
  4. 社区支持好
  5. 跨平台Linux/Windows

对于学习研究

推荐对比学习 Client vs Client-Native

收获:

  1. 📚 理解SSL/TLS协议
  2. 📚 理解网络库封装
  3. 📚 学习底层API
  4. 📚 提升编程能力

扩展方向

基于HP-Socket扩展

  1. 添加JSON协议

    // 使用nlohmann/json解析数据
    auto json = nlohmann::json::parse(data);
    std::string machineCode = json["machineCode"];
    
  2. 添加数据库支持

    // 验证机器码时查询数据库
    bool isValid = CheckMachineCodeInDB(machineCode);
    
  3. 添加日志系统

    // 记录所有连接和操作
    Logger::Info("Client connected: {}", dwConnID);
    
  4. 添加配置文件

    // 从配置文件读取设置
    Config cfg("server.ini");
    int port = cfg.GetInt("port");
    

基于Client-Native扩展

  1. 实现异步I/O

    • 使用IOCPWindows
    • 提高并发性能
  2. 添加连接池

    • 复用SSL连接
    • 减少握手开销
  3. 实现自定义协议

    • 消息分包
    • 数据压缩
    • 自定义加密

故障排查

编译错误

找不到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

OpenSSL

SSL/TLS

常见问题

Q: 为什么有三个项目?

A: Server是服务器Client是客户端使用HP-SocketClient-Native是客户端不使用HP-Socket用于学习对比

Q: 实际项目应该用哪个?

A: 实际项目使用Server + ClientHP-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