C++ 将SSL支持添加到现有TCP&;UDP代码?

C++ 将SSL支持添加到现有TCP&;UDP代码?,c++,ssl,udp,tcp,ssl-certificate,C++,Ssl,Udp,Tcp,Ssl Certificate,这是我的问题 现在我有一个Linux服务器应用程序(用C++编写的),它与Windows C++客户端应用程序(Visual Studio 9,Qt 4.5)通信< < /P> 在不完全破坏现有协议的情况下,向双方添加SSL支持以确保通信安全的最简单方法是什么 这是一个VOIP应用程序,它使用UDP和TCP的组合来初始设置连接和端口隧道,然后使用UDP处理流数据 过去,我在从头开始创建安全证书时遇到了很多问题,而这些证书是让这些东西正常工作所必需的 现有的工作示例代码将是理想的 谢谢大家! 我建

这是我的问题

现在我有一个Linux服务器应用程序(用C++编写的),它与Windows C++客户端应用程序(Visual Studio 9,Qt 4.5)通信< < /P> 在不完全破坏现有协议的情况下,向双方添加SSL支持以确保通信安全的最简单方法是什么

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

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

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

谢谢大家!

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


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

您在或中尝试过SSL支持吗?两者都是在幕后使用,并为TCP、UDP和SSL提供类似的抽象。示例代码在Boost.Asio和ACE发行版中都可用

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

,因此您需要使用库

有几个选项,如、、等。每个库(或其他库建议的库,如Boost.Asio或OpenSSL)都有相应的示例代码


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

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

然而,你可能想考虑切换到类似或(脸谱网的节俭)之类的东西。Google的Protocol Buffers文档说,“在Protocol Buffers之前,有一种用于请求和响应的格式,它使用请求和响应的手动编组/解编组,并且支持多种版本的协议。这导致了一些非常难看的代码……”

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


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

为了在不改变应用程序的情况下帮助处理这个问题,您可能想看看stunnel项目()。不过,我认为它不会为您处理UDP。

yaSSL和CyaSSL嵌入式SSL/TLS库在过去对我来说工作得很好。针对嵌入式系统,它们在速度和大小方面都进行了优化。YASL是用C++编写的,CyaSSL是用C编写的,相比之下,CysAL可以比OpenSSL小20倍。 两者都支持最新的行业标准(最高达TLS 1.2),提供一些很酷的功能,如流密码,并且都是GPLv2和商业许可下的双重许可(如果您需要商业支持)

他们还提供了一个SSL教程,介绍了如何将CyaSSL添加到现有代码中:

产品页:

问候,

克里斯

嗨,麦克斯,谢谢你的补充细节。(也许我最初的问题没有说清楚。)你的回答增加了我的洞察力。我在代码中有一个非常难看的、基于套接字的手工编码过程,它与服务器进行某种“握手”,并专门设置UDP端口隧道。其余的网络代码被抽象为“SendXMLViaTCPAndWaitForResponse()”类型的帮助函数。仅仅咬子弹不应该那么难,除了辅助FCT之外,它应该很少涉及重新编码。再次感谢你的回答。嗨,克里斯,谢谢你的回答。不幸的是,我发帖已经一年多了,客户几周前取消了这个项目,把我从项目中甩了出去。听到这个消息很难过。我确实意识到你发帖已经很久了,但我想我至少应该发帖以备将来参考。