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






4.83/5 (20投票s)
一个简单的类,允许您在 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_p
、ssend_p
、recv_p
、rrecv_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 日 - 发布原始版本