如何使用Winsock在C ++应用程序中实现安全套接字通信?

时间:2018-07-13 15:49:34

标签: c++ ssl winapi tls1.2 schannel

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

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

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

我已经在虚拟客户端和服务器之间建立了通信,我只是试图保护并加密该通信。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您选择使用哪个SSL库,在此字段中,作为初学者,您需要了解以下几点:

服务器和客户端的实现最终将在某些地方看起来完全不同。

您的服务器绝对需要带私钥的证书。在开发过程中,您显然不希望从Verisign那里获得证书,因此您需要创建一个自签名证书。您可以使用openssl或其他工具来做到这一点。

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

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

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

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

很明显,不要同时编写客户端和服务器:首先从https服务器开始客户端。

这是流程的总体概述-当我第一次遇到SSL时,让我感到困惑的是,为什么没有一个样本像我希望的那样简单。