将OpenSSL与自定义渠道一起使用

时间:2013-02-04 11:12:20

标签: ssl openssl

我开发了(在CPP中)一种基于HTTP的唯一协议,我用它来与我的服务器通信。 现在,我想通过我的专有协议建立SSL连接以传输数据本身。

我可以使用OpenSSL吗?我搜索了网络,我找到的所有内容都与BIO有关,但我不明白如何使用它来满足我的需求..

无论如何,对我来说最好的解决方案是我可以通过OpenSSL传递我专有的发送和放大器的方式。接收功能,因此所有通信本身只能通过我的功能。

TNX未来:)

2 个答案:

答案 0 :(得分:10)

使用BIO对。您可以在ssltest.c程序中找到示例,搜索bio_pair的来源。基本思想是将OpenSSL引擎视为黑盒子。

您的代码有四件事要做:

  1. 当您通过与另一方的连接接收加密数据时,您必须将其写入SSL引擎的加密BIO。

  2. 当SSL引擎想要将加密数据发送到另一方时,您必须从SSL引擎的加密BIO中读取它并将其传输到另一方。

  3. 如果您有要加密和发送的纯文本,则必须将其写入SSL引擎的纯文本BIO。

  4. 当SSL引擎有明文时它已为您解密,您必须从SSL引擎的明文BIO中读取它。

  5. OpenSSL纯粹作为遵循SSL协议并在两个BIO之间移动数据的引擎。它为您完成所有协议协商和操作,只要您保持所有这四个数据流都在移动。

    我可以给你一个警告 - 不要假设这些事情之间有任何特殊的关系。例如,您可能有一些要加密和发送的明文,当您将其写入SSL引擎的纯文本BIO时,SSL引擎可能无法继续前进,直到从另一端收到一些加密数据。将SSL引擎视为黑盒子,尽可能做所有这四件事。不要试图“浏览”SSL引擎,例如,期望因为您将SSL引擎传递给某些加密数据,它必然会为您提供明文。它可能,但它可能还需要将加密数据发送到另一方。

    另一个警告:SSL引擎只有一个状态。它没有读状态和写状态。 (如果你想要丑陋的细节,请在this thread搜索“噩梦场景”。)如果你使用多个线程的SSL连接,并且希望它的行为就像TCP连接一样,那么这很可能会让你感到困惑。读取和写入方是独立的,除非发生致命错误或连接关闭)。

答案 1 :(得分:0)

  

第二个选项 - 具有自己的消息并使用HTTP的协议   在客户端和服务器之间传递它们。

如果您使用HTTP传递自己的消息,那么使用OpenSSL for SSL / TLS意味着您还需要编写自己的HTTP库库。

相反,使用支持HTTPS(大多数情况下)的HTTP库,通过OpenSSL或不通过OpenSSL。在HTTPS之上交换自定义消息应该相当透明,类似于使用普通HTTP。您只需要正常配置HTTPS。