0

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

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

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

我已经在两者之间建立了一个虚拟客户端和服务器,我只是想保护和加密该通信。

任何帮助是极大的赞赏!

4

1 回答 1

2

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

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

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

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

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

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

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

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

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

于 2018-07-14T20:25:50.937 回答