【问题标题】:Use OpenSSL with a custom channel将 OpenSSL 与自定义通道一起使用
【发布时间】:2013-02-04 11:12:20
【问题描述】:

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

我可以使用 OpenSSL 吗?我在网上搜索,我发现的都是与 BIO 相关的东西,但我不明白如何使用它来满足我的需求..

无论如何,对我来说最好的解决方案是让我可以通过 OpenSSL 我的专有发送和接收功能,这样所有通信本身都只能通过我的功能进行。

TNX 领先 :)

【问题讨论】:

  • 当您说“基于 HTTP 的独特协议”时,您是指对 HTTP 的扩展还是通过 HTTP 库交换自己的消息的协议?
  • 第二个选项 - 有自己的消息并使用 HTTP 在客户端和服务器之间传递它们的协议。
  • 您还应该查看Application-Layer Protocol Negotiation。它是如何通过 HTTPS 实现 HTTP/2 的。

标签: ssl openssl


【解决方案1】:

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

您的代码必须做四件事:

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

  2. 当 SSL 引擎要向对方发送加密数据时,你必须从 SSL 引擎的加密 BIO 中读取并传输到对方。

  3. 当你有明文要加密并发送时,你必须将其写入 SSL 引擎的明文 BIO。

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

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

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

另一个注意事项:SSL 引擎只有一种状态。它没有读状态和写状态。 (如果您想要丑陋的细节,请搜索 this thread 以查找“噩梦场景”。)如果您使用具有多个线程的 SSL 连接并期望它的行为类似于 TCP 连接(其中读取和写入端是独立的,除非发生致命错误或连接关闭)。

【讨论】:

    【解决方案2】:

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

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

    请使用支持 HTTPS(大多数都支持)的 HTTP 库,无论是否通过 OpenSSL。在 HTTPS 之上交换您的自定义消息应该是相当透明的,并且类似于使用纯 HTTP。你只需要正常配置HTTPS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-16
      • 2017-09-30
      • 2017-07-04
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多