65.9K
CodeProject 正在变化。 阅读更多。
Home

SSL:轻松将普通套接字转换为 SSL 套接字

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (20投票s)

2008年3月14日

CPOL

3分钟阅读

viewsIcon

259010

downloadIcon

7093

一个简单的类,允许您在 Windows 下将现有的 SOCKET 句柄转换为 SSL

包含

  • SSL 类源代码文件 (SSL.CPP, Z.H, SSL.H)
  • 测试项目 TEL,使用 SSL 功能的 telnet 客户端和服务器。

引言

很多 SSL 东西已经存在,但它要么在 MFC、NET 中,要么在其他一些非原生格式中。 这是一个简单的类 SSL_SOCKET,允许您将现有的 SOCKET 句柄转换为 Windows 下的 SSL。 我从伟大的 CSslSocket - SSL/TLS 启用 CSocket MFC 文章中获得了大量信息,但我需要一个纯 Win32 的。

特点

  • 兼容 x86 / x64。
  • HTML 帮助。
  • 支持服务器和客户端。

许可证

免费,适用于任何类型或免费软件、共享软件、商业软件或任何类型的项目,只要您在您的“关于”框或您的应用程序的文档中为该库注明出处。

创建 SSL 客户端

首先,使用正常的套接字函数 (socket()connect()) 创建并连接您的套接字。 然后构造一个 SSL_SOCKET

// Say that X is a socket
SSL_SOCKET* SX = new SSL_SOCKET(X,0,0);

这为 SSL_CLIENT 创建一个 SSL_SOCKET 对象。 构造函数的最后一个参数表明该对象将创建一个临时的自签名证书,以便向 SSL 服务器进行身份验证。 如果您愿意,可以传递您自己的 PCERT_CONTEXT

下一步是调用 SSL_SOCKET::ClientInit()

// Initialize the Security Session
sX->ClientInit();

这也调用 SSL_SOCKET::ClientLoop() 来初始化 SSL 会话。 (如果您不想在此刻初始化 SSL 会话,请调用 ClientInit(true),然后稍后调用 ClientLoop())。 一旦循环返回 0(成功),您就可以使用以下函数

  • int SSL_SOCKET:: s_send(char* b, int sz); // 发送数据,如果出错则返回 0 或 -1 (类似于 normal send())。
  • int SSL_SOCKET:: s_ssend(char* b, int sz); // 发送数据,如果出错则返回 0 或 -1 (类似于 normal send())。 在所有字节都被发送或发生错误之前不会返回。
  • int SSL_SOCKET:: s_recv(char* b, int sz); // 接收数据,如果出错则返回 0 或 -1 (类似于 normal recv())。
  • int SSL_SOCKET:: s_ssend(char* b, int sz); // 接收数据,如果出错则返回 0 或 -1 (类似于 normal recv())。 在所有字节都被接收或发生错误之前不会返回。

如果您愿意,您还可以调用 send_pssend_precv_prrecv_p 来发送/接收原始字节(无需消息加密/解密),如果您可以自己加密/解密这些东西。

客户端连接的礼貌关闭是在调用 closesocket() 之前调用 SSL_SOCKET :: ClientOff()

创建 SSL 服务器

首先,使用正常的套接字函数 (socket()bind()listen()accept()) 创建并接受您的套接字。 然后构造一个 SSL_SOCKET

// Say that X is a socket
SSL_SOCKET* SX = new SSL_SOCKET(X,1,0);

这为 SSL_CLIENT 创建一个 SSL_SOCKET 对象。 构造函数的最后一个参数表明该对象将创建一个临时的自签名证书,以便向 SSL 服务器进行身份验证。 如果您愿意,可以传递您自己的 PCERT_CONTEXT。 请注意,某些客户端会测试证书并拒绝或警告它,因此您可能需要传递一个受信任的证书。

下一步是调用 SSL_SOCKET::ServerInit()

// Initialize the Security Session
sX->ServerInit();

这也调用 SSL_SOCKET::ServerLoop() 来初始化 SSL 会话。 (如果您不想在此刻初始化 SSL 会话,请调用 ServerInit(true),然后稍后调用 ServerLoop())。 一旦循环返回 0(成功),您就可以使用上面讨论的发送/接收函数。

通过调用 SSL_Socket :: ServerOff() 关闭服务器。

其他特性

这些是我想在将来实现的一些功能

  • 证书验证(尚未完成)
  • 文档 (SSL.CHM) 待定。

请留下您的问题和评论!

历史

  • 2007 年 3 月 13 日 - 发布原始版本
SSL : 以简单的方式将您的普通套接字转换为 SSL 套接字 - CodeProject - 代码之家
© . All rights reserved.