如何使用winsock在c++应用程序中实现安全套接字通信

How to implement secure socket communication in c++ application using winsock?

本文关键字:安全 实现 安全套 套接字 通信 应用程序 何使用 winsock c++      更新时间:2023-10-16

我正在尝试用c++实现服务器和客户端之间的安全通信。限制是客户端和服务器都必须在windows上运行,并且必须使用c++。这是我在大学里做的一个研究项目。

到目前为止,我发现SChannel是最好的选择,但文档非常混乱,我找不到任何关于如何使用它的指南/教程。我已经看过这个链接https://learn.microsoft.com/en-us/windows/desktop/secauthn/creating-a-secure-connection-using-schannel但仍然不知道如何让它发挥作用。如果这是最好的方法,有人能指导我吗?

我还研究了使用SSLStream,使用CLR在c++应用程序内部运行.net。但是我不能使用它,因为客户端应用程序是线程化的,线程不能与CLR一起使用。

我已经设置了一个虚拟客户端和服务器,用于两者之间的通信,我只是试图保护和加密通信。

非常感谢您的帮助!

无论您选择使用哪种SSL库,作为该领域的初学者,都需要了解以下几点:

服务器和客户端的实现在某些地方看起来会大不相同。

您的服务器绝对需要一个带有私钥的证书。在开发过程中,您显然不想从Verisign或其他地方获得证书,因此您需要创建一个自签名证书。您可以使用openssl或其他工具来完成此操作。

证书由私有部分和公共部分组成。公共部分需要转到客户端,并将用于验证连接。当您使用类似SChannel的东西时,证书(私有和公共(将需要分别安装在服务器和客户端的证书存储中。

SChannel不会为您发送或接收数据。因此,实现的核心是:当网络有数据时:从套接字读取密文并写入SChannel。从SChannel读取明文(如果有(并传递给应用程序。当应用程序有数据要发送时,从应用程序获取明文并传递给SChannel。从SChannel获取生成的密文缓冲区并写入套接字。

来自互联网的缓冲区可能是部分的,协商和重新协商意味着没有将数据传递到SChannel和将数据输出的1:1映射。

因此,您无法摆脱一个天真的实现,该实现调用SChannel一次以传入数据,然后再次获取未加密的数据。在获得任何应用程序字节之前,可能没有任何可用的数据包,或者需要在客户端和服务器之间发送大量数据包。即,您需要某种状态机来跟踪这一点。

显然,不要同时编写客户端和服务器:从使用https服务器的客户端开始。

这就是这个过程的大致轮廓——当我第一次遇到SSL时,让我感到困惑的事情,以及为什么没有一个样本像我希望的那样简单