【问题标题】:How to implement secure socket communication in c++ application using winsock?如何使用winsock在c++应用程序中实现安全套接字通信?
【发布时间】:2018-07-13 15:49:33
【问题描述】:

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

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

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

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

非常感谢任何帮助!

【问题讨论】:

  • 主题太宽泛,不适合 SO 格式。甚至可能基于意见。
  • 如果你的目标是 Windows 10,你可以使用Windows.Networking.Sockets。使用 C++/WinRT 从 C++ 应用程序访问此命名空间中的类。
  • 关于 SChannel 的问题到底是什么?说文档令人困惑并没有真正说明什么。
  • 我对 schannel 的主要问题是一般如何使用它?我不知道如何实现它。
  • @mplouque MSDN 有使用 SChannel 的示例,你看过吗?它到底有什么令人困惑的地方?

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


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

  • 我们知道服务器是http服务器吗?
  • 没关系:https 服务器无处不在,如果您至少可以连接到它,那么您就知道您已经做了足够多的工作来让您的客户协商大部分正确。否则,您将无法确定协商失败是否是您的客户端或服务器实现中的错误
  • 当然很重要!如果 OP 的服务器(无论如何,在原始问题的上下文中这似乎是一个模糊的概念)不是网络服务器,那么他就不能使用 SChannel。所以我们需要做的就是问他(我确实尝试过,但我没有得到回应)。
  • 请注意,使用 schannel 可以很容易地使用 windows 事件日志来跟踪正在发生的事情。 (即,缺少证书,还有其他问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 2019-01-13
  • 2012-04-07
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多