Files
--hp-socket-TCP--ssl--/SSL配置说明.md
2026-01-23 08:39:07 +08:00

8.1 KiB
Raw Permalink Blame History

SSL安全配置说明

当前SSL配置

服务器端配置Server/main.cpp

static const int g_s_iVerifyMode = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;

配置说明:

  • SSL_VM_PEER:要求验证对方(客户端)的证书
  • SSL_VM_FAIL_IF_NO_PEER_CERT:如果客户端没有提供证书,连接失败
  • 服务器配置了CA证书g_s_lpszCAPemCert)用于验证客户端证书的有效性

安全特性: 要求客户端必须提供合法证书 验证客户端证书是否由可信CA签发 防止未授权客户端连接 实现双向身份认证Mutual TLS

客户端配置Client/main.cpp

static const int g_c_iVerifyMode = SSL_VM_PEER;

配置说明:

  • SSL_VM_PEER:要求验证对方(服务器)的证书
  • 客户端配置了CA证书g_c_lpszCAPemCert)用于验证服务器证书的有效性

安全特性: 验证服务器证书的合法性 确保连接到正确的服务器 防止中间人攻击MITM 防止服务器伪造

SSL验证模式对比

1. SSL_VM_NONE已弃用

static const int g_s_iVerifyMode = SSL_VM_NONE;  // 旧配置
  • ⚠️ 不验证对方证书
  • ⚠️ 提供加密但不提供身份认证
  • ⚠️ 易受中间人攻击
  • ⚠️ 任何人都可以伪造服务器
  • 不推荐用于生产环境

2. SSL_VM_PEER当前配置

static const int g_c_iVerifyMode = SSL_VM_PEER;  // 客户端配置
  • 验证对方证书的有效性
  • 检查证书是否由可信CA签发
  • 提供加密 + 身份认证
  • 防止中间人攻击
  • 适合生产环境

3. SSL_VM_PEER + SSL_VM_FAIL_IF_NO_PEER_CERT当前配置

static const int g_s_iVerifyMode = SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT;  // 服务器配置
  • 强制要求对方提供证书
  • 如果对方未提供证书,连接失败
  • 实现严格的双向认证
  • 最高级别的安全保护
  • 适合高安全要求的生产环境

证书配置

证书文件说明

当前项目中内置了以下证书(嵌入在源码中):

  1. 服务器证书 (g_s_lpszPemCert)

    • 用于服务器向客户端证明身份
    • 包含服务器的公钥
    • 由CA签发
  2. 服务器私钥 (g_s_lpszPemKey)

    • 服务器的私钥(加密)
    • 密码:123456
    • 用于解密和签名
  3. 客户端证书 (g_c_lpszPemCert)

    • 用于客户端向服务器证明身份
    • 包含客户端的公钥
    • 由CA签发
  4. 客户端私钥 (g_c_lpszPemKey)

    • 客户端的私钥(加密)
    • 密码:123456
    • 用于解密和签名
  5. CA证书 (g_s_lpszCAPemCert / g_c_lpszCAPemCert)

    • 证书颁发机构的根证书
    • 用于验证对方证书的合法性
    • 双方使用相同的CA证书

证书验证流程

客户端连接服务器时:

  1. 服务器向客户端发送自己的证书

    • 客户端接收服务器证书
    • 客户端使用CA证书验证服务器证书的有效性
    • 验证证书签名是否由可信CA签发
    • 验证证书是否在有效期内
    • 验证通过,客户端信任服务器
  2. 客户端向服务器发送自己的证书

    • 服务器接收客户端证书
    • 服务器使用CA证书验证客户端证书的有效性
    • 因为配置了 SSL_VM_FAIL_IF_NO_PEER_CERT,如果客户端不提供证书,连接失败
    • 验证通过,服务器信任客户端
  3. 建立加密通道

    • 双方完成身份认证
    • 建立安全的加密通信通道
    • 后续所有数据都经过加密传输

安全优势

当前配置的安全等级:🔒 高度安全

  1. 双向身份认证

    • 服务器验证客户端身份
    • 客户端验证服务器身份
    • 防止任何一方伪造
  2. 数据加密

    • 所有通信数据经过TLS/SSL加密
    • 使用强加密算法
    • 防止数据窃听
  3. 防止中间人攻击

    • 证书验证确保连接到正确的对方
    • 无法在中间插入恶意代理
    • 无法篡改传输数据
  4. 访问控制

    • 只有持有合法证书的客户端才能连接
    • 实现基于证书的访问控制
    • 适合机器码授权等场景

生产环境建议

证书管理

  1. 不要在源码中硬编码证书(当前演示用)

    • 生产环境应从文件或安全存储加载证书
    • 使用 SetupSSLContext() 代替 SetupSSLContextByMemory()
  2. 保护私钥安全

    • 私钥密码不要使用简单密码
    • 考虑使用硬件安全模块HSM
    • 定期轮换证书和密钥
  3. 使用正规CA证书

    • 当前是自签名证书(仅用于演示)
    • 生产环境建议使用正规CA签发的证书
    • 或搭建企业内部PKI体系

代码示例:从文件加载证书

// 推荐:从文件加载证书
if (!server->SetupSSLContext(
    g_s_iVerifyMode,           // 验证模式
    "server-cert.pem",          // 服务器证书文件路径
    "server-key.pem",           // 服务器私钥文件路径
    g_s_lpszKeyPassword,        // 私钥密码
    "ca-cert.pem"))             // CA证书文件路径
{
    // 错误处理
}

常见问题

Q: 为什么需要CA证书

A: CA证书用于验证对方证书的合法性。就像身份证需要公安局盖章一样SSL证书也需要CA签名才能被信任。

Q: 客户端证书和服务器证书有什么区别?

A: 技术上没有本质区别都是X.509证书。区别在于用途:

  • 服务器证书:证明服务器身份
  • 客户端证书:证明客户端身份

Q: SSL_VM_PEER和SSL_VM_NONE有什么区别

A:

  • SSL_VM_NONE:只加密,不验证身份(类似:对话加密了,但不知道对方是谁)
  • SSL_VM_PEER:加密+验证身份(类似:对话加密了,并且验证了对方身份证)

Q: 为什么服务器要用SSL_VM_FAIL_IF_NO_PEER_CERT

A: 这是最严格的验证模式,强制要求客户端必须提供证书。适合需要高安全性的场景,例如:

  • 金融交易系统
  • 机器码授权系统
  • 企业内部系统
  • 需要严格访问控制的服务

Q: 当前配置是否足够安全?

A: 当前配置提供了TLS/SSL的最高安全等级

  • 双向认证Mutual TLS
  • 数据加密
  • 防中间人攻击
  • 防伪造服务器/客户端

但请注意:

  • ⚠️ 证书硬编码在源码中(仅适合演示)
  • ⚠️ 使用自签名证书生产环境建议使用正规CA证书
  • ⚠️ 私钥密码过于简单(生产环境应使用复杂密码)

测试验证

验证SSL配置

运行程序后,观察日志输出:

[服务器] 正在初始化SSL环境...
[服务器] SSL环境初始化成功
[服务器] 服务器启动成功,监听端口: 5555

[客户端] 正在初始化SSL环境...
[客户端] SSL环境初始化成功
[客户端] 正在连接服务器 127.0.0.1:5555 ...
[客户端] OnHandShake - SSL握手完成ID=1
[客户端] 已连接到服务器,可以开始发送消息

如果看到 "SSL握手完成",说明双向认证成功!

修改验证模式测试

可以尝试修改配置来测试不同场景:

  1. 测试:客户端不提供证书

    // 修改服务器配置去掉FAIL_IF_NO_PEER_CERT
    static const int g_s_iVerifyMode = SSL_VM_PEER;  // 允许客户端不提供证书
    
  2. 测试:不验证证书

    // 修改为不验证(不推荐)
    static const int g_c_iVerifyMode = SSL_VM_NONE;  // 客户端不验证服务器
    

总结

当前项目已经配置为 SSL_VM_PEER + 双向认证 模式这是SSL/TLS提供的最高安全级别。

配置概要:

  • 服务器验证客户端证书SSL_VM_PEER | SSL_VM_FAIL_IF_NO_PEER_CERT
  • 客户端验证服务器证书SSL_VM_PEER
  • 双方使用CA证书验证对方
  • 所有数据加密传输
  • 防止中间人攻击
  • 防止服务器/客户端伪造

适用场景:

  • 高安全要求的通信系统
  • 机器码授权和许可证管理
  • 企业内部加密通信
  • 金融交易系统
  • 任何需要双向身份认证的场景

编译日期: 2026年1月13日
HP-Socket版本 6.0.7
SSL配置 VM_PEER + 双向认证Mutual TLS