14

这是我的问题。

现在我有一个与 Windows C++ 客户端应用程序(Visual Studio 9,Qt 4.5)通信的 Linux 服务器应用程序(使用 C++ - gcc 编写)。

在不完全破坏现有协议的情况下,向双方添加 SSL 支持以确保通信安全的最简单方法什么?

这是一个 VOIP 应用程序,它使用 UDP 和 TCP 的组合来初始设置连接并进行端口隧道处理,然后使用 UDP 传输数据。

过去,我在从头开始创建安全证书时遇到了很多问题,这是让这些东西正常工作所必需的。

现有的工作示例代码将是理想的。

谢谢!

4

5 回答 5

11

SSL 非常复杂,因此您将需要使用库。

有几个选项,例如KeyczarBotancryptlib等。这些库中的每一个(或其他人建议的库,例如 Boost.Asio 或 OpenSSL)都将具有示例代码。


回答您的第二个问题(如何将库集成到现有代码中而不会造成太多痛苦):这将取决于您当前的代码。如果您已经拥有调用 Winsock 或套接字方法来发送/接收等int的简单函数,strings那么您只需要重写这些函数的内容即可。当然,首先要更改设置套接字的代码。

另一方面,如果您直接调用 Winsock/socket 函数,那么您可能希望编写具有相似语义但发送加密数据的函数,并用这些函数替换您的 Winsock 调用。

但是,您可能需要考虑切换到Google Protocol BuffersApache Thrift(又名 Facebook Thrift)之类的东西。谷歌的协议缓冲区文档说:“在协议缓冲区之前,有一种请求和响应的格式,它使用请求和响应的手动编组/解组,并且支持许多版本的协议。这导致了一些非常丑陋的代码。 ……”

您目前处于手动编组/解组阶段。它可以工作,事实上我从事的一个项目确实使用了这种方法。但是把它留给图书馆要好得多。尤其是一个已经考虑过将来更新软件的库。

如果你走这条路,你将使用 SSL 库设置网络连接,然后将 Thrift/Protocol Buffer 数据推送到这些连接上。就是这样。它确实涉及大量重构,但最终需要维护的代码更少。当我们在我提到的那个项目的代码库中引入协议缓冲区时,我们能够摆脱大约 300 行编组/解组代码。

于 2009-07-09T19:59:02.487 回答
4

我建议在客户端和服务器端都使用GnuTLS ,仅用于 TCP 连接。暂时忘记 UDP 数据。GnuTLS 文档包含用于编写客户端和服务器的示例代码。请理解,至少服务器端(通常是 TCP 响应者)需要有证书;客户端可以使用匿名标识(尽管甚至有一个没有服务器证书的示例,仅使用 DH 密钥交换 - 这将允许中间人攻击)。

一般来说,无论您使用什么库,您都可能必须了解 SSL 的原理。库替代方案是 OpenSSL(Unix 和 Windows)和 SChannel(仅限 Windows)。

于 2009-07-09T18:45:47.877 回答
2

您是否尝试过Boost.AsioACE中的 SSL 支持?两者都在底层使用OpenSSL,并为 TCP、UDP 和 SSL 提供类似的抽象。Boost.Asio 和 ACE 发行版中都提供了示例代码。

您可能需要记住的一件事是 SSL 是面向记录的,而不是面向流的(TCP 和 UDP 都是如此)。这可能会影响您多路复用事件的方式,例如,您必须先读取完整的 SSL 记录,然后才能调用读取操作完成。

于 2009-07-09T18:47:48.870 回答
2

为了在不更改应用程序的情况下帮助处理此问题,您可能需要查看 stunnel 项目 ( http://www.stunnel.org/ )。我不认为它会为你处理 UDP。

于 2009-07-18T02:07:32.837 回答
2

yaSSL 和 CyaSSL 嵌入式 SSL/TLS 库过去对我来说效果很好。针对嵌入式系统,它们针对速度和大小进行了优化。yaSSL 是用 C++ 编写的,而 CyaSSL 是用 C 编写的。相比之下,CyaSSL 可以比 OpenSSL 小 20 倍。

两者都支持最新的行业标准(最高 TLS 1.2),提供一些很酷的功能,例如流密码,并且在 GPLv2 和商业许可证下获得双重许可(如果您需要商业支持)。

他们有一个 SSL 教程,其中涉及将 CyaSSL 添加到您现有的代码中:http ://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html

产品页面:http: //yassl.com/yaSSL/Products.html

问候,
克里斯

于 2010-09-27T22:03:17.540 回答