我(在 CPP 中)开发了一种基于 HTTP 的独特协议,并使用它与我的服务器进行通信。现在,我想通过我的专有协议建立 SSL 连接来传输数据本身。
我可以使用 OpenSSL 吗?我在网上搜索,我发现的都是与 BIO 相关的东西,但我不明白如何使用它来满足我的需求..
无论如何,对我来说最好的解决方案是一种我可以通过 OpenSSL 我的专有发送和接收功能的方式,这样所有的通信本身就只能通过我的功能进行。
TNX 领先 :)
使用 BIO 对。您可以在ssltest.c程序中找到一个示例,在源代码中搜索bio_pair
. 基本思想是将 OpenSSL 引擎视为一个黑匣子。
您的代码必须做四件事:
当您通过与另一端的连接接收加密数据时,您必须将其写入 SSL 引擎的加密 BIO。
当 SSL 引擎要向对方发送加密数据时,你必须从 SSL 引擎的加密 BIO 中读取数据并将其传输到对方。
当您有要加密和发送的明文时,您必须将其写入 SSL 引擎的明文 BIO。
当 SSL 引擎有它为您解密的明文时,您必须从 SSL 引擎的明文 BIO 中读取它。
OpenSSL 纯粹充当遵循 SSL 协议并在两个 BIO 之间移动数据的引擎。只要您保持所有这四个数据流的移动,它就会为您完成所有协议协商和操作。
我可以给你的一个警告是——不要假设这些事物之间有任何特殊关系。例如,您可能有一些明文要加密并发送,当您将其写入 SSL 引擎的明文 BIO 时,SSL 引擎可能无法继续前进,直到它从另一端接收到一些加密数据。将 SSL 引擎视为一个黑匣子,尽可能做所有这四件事。不要试图“看穿” SSL 引擎,例如,期望因为您将一些加密数据交给 SSL 引擎,所以它必然会为您提供明文。它可能会,但它可能还需要将加密数据发送到另一端。
另一个注意事项:SSL 引擎只有一种状态。它没有读状态和写状态。(如果您想了解丑陋的细节,请在此线程中搜索“噩梦场景”。)如果您使用具有多个线程的 SSL 连接并期望它的行为就像 TCP 连接(其中读取和写入双方是独立的,除非发生致命错误或连接关闭)。
第二种选择 - 具有自己的消息并使用 HTTP 在客户端和服务器之间传递它们的协议。
如果您使用 HTTP 来传递您自己的消息,那么使用 OpenSSL for SSL/TLS 意味着您也需要编写自己的 HTTP 库库。
相反,使用支持 HTTPS(大多数都支持)的 HTTP 库,无论是否通过 OpenSSL。在 HTTPS 之上交换您的自定义消息应该是相当透明的,并且类似于使用纯 HTTP。您只需要正常配置 HTTPS。