我開發了(在CPP中)通過HTTP的唯一協議,並使用它與我的服務器進行通信。 現在,我想通過我的專有協議建立SSL連接來傳輸數據本身。通過自定義通道使用OpenSSL
我可以使用OpenSSL嗎?我搜索了網絡,我發現的所有東西都與BIO有關,但我不明白如何使用它以滿足我的需求。
無論如何,對我來說最好的解決方案將是我可以通過OpenSSL我的專有發送&接收函數,以便所有的通信本身將只通過我的功能。
TNX前進:)
我開發了(在CPP中)通過HTTP的唯一協議,並使用它與我的服務器進行通信。 現在,我想通過我的專有協議建立SSL連接來傳輸數據本身。通過自定義通道使用OpenSSL
我可以使用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引擎只有一個狀態。它沒有讀狀態和寫狀態。 (如果你想要醜陋的細節,搜索this thread)。如果你在多線程中使用SSL連接並期望它像TCP連接一樣行爲,那麼這很可能會咬你(讀寫邊除了致命錯誤或連接關閉的情況外,都是獨立的)。
TNX!我會檢查這個,看看它是否適合我。 – user2039197
第二個選項 - 一個有自己的消息並使用HTTP到 的協議在客戶端和服務器之間傳遞它們。
如果您使用HTTP傳遞自己的消息,則使用OpenSSL for SSL/TLS將暗示您也需要編寫自己的HTTP庫庫。
取而代之的是,使用支持HTTPS的HTTP庫(大多數)通過OpenSSL或不支持。在HTTPS之上交換自定義消息應該相當透明,並且與使用普通HTTP類似。你只需要正常配置HTTPS。
當你說「通過HTTP的獨特協議」時,你的意思是HTTP的擴展還是通過HTTP庫交換自己的消息的協議? – Bruno
第二個選項 - 一種協議,它有自己的消息並使用HTTP在客戶端和服務器之間傳遞它們。 – user2039197
您還應該查看[應用層協議協商](https://tools.ietf.org/html/rfc7301)。它如何通過HTTPS實現HTTP/2。 – jww