2013-01-01 73 views
1

我有一個Haskell流媒體API(與OpenSSL的BIO不同),我想要注入SSL/TLS「代理」。更具體地講,比方說我有一個網絡SSL BIO和FFI

Server| <---> |Logger>| <---> |<Logger| <---> |Client

(其中我寫Logger>意味着「下游」記錄器)的模型,我想編寫一個FFI調入OpenSSL的注入TLS進入中心這裏

Server| <---> |Logger>| <---> |TLS>| <---> |<TLS| <---> |<Logger| <---> |Client

TLS>所以和<TLS之間的通信被加密。什麼是最簡單的OpenSSL接口,可以讓我構建<TLS?之後,構建TLS>最簡單的界面是什麼?

換言之,我的項目與我讀過的大多數教程不同,因爲我希望能夠同時使用一個SSL結構BIO_getsBIO_puts。這與如果我爲SSL客戶端連接管理自己的傳輸類似,但「傳輸」是通過將C指針提升到Haskell來執行的。

(我敢肯定,我只是完全失去了一些東西有關SSL + BIO互動的基礎。)


http://www.openssl.org/docs/crypto/BIO_s_bio.html我喜歡看什麼我拍攝的應用程序:

BIO *internal_bio, *network_bio;
...
BIO_new_bio_pair(internal_bio, 0, network_bio, 0);
SSL_set_bio(ssl, internal_bio, internal_bio);
SSL_operations();

這似乎大致正確。我可以putsgetsnetwork_bio

回答

1

如果OpenSSL是不適合你的項目所需要的東西,你可以使用任何TLS庫, 你可以使用更簡單tls,這是更好地整合與Haskell和內置了支持通過Backend類型的自定義運輸。這比通過Haskell處理openssl lowlevel APIs要簡單得多。

+1

雖然這是一個庫的廣告,這是非常真實的。讓OpenSSL在非* NIX平臺上工作是一件很麻煩的事,而純Haskell tls-package可以在Haskell工作的任何地方工作。順便說一句,它也更容易擴展。 OpenSSL是一個單調的混亂,而tls委託其他包的許多任務(加密,散列,編組)。 – 2013-01-01 09:38:50

+3

是的,我原來是這樣建議的;很多月前我不得不在OCaml中處理openssl,這不是一個愉快的經歷。 tls不一定非常有名,許多人都試圖對付openssl,因爲這是他們唯一知道的;然而,我現在才意識到,同一個人在他的職位前幾個小時就在bug跟蹤器上開了一個bug,所以他可能知道tls,因此我的提議有點不合適,我也沒有幫助他解決問題。抱歉! – Tab

+0

哦,嗨!我首先嚐試了'tls',但TLS是通信流,一些固定證書/密鑰狀態和一個隨機生成的純計算,所以我不想綁定到IO monad並且必須擔心異常。我嘗試在'tls'的分支上解除IO限制,但它看起來像一個更復雜的項目,而不是提純純C計算。最後,我不太關心跨平臺兼容性問題,並且能夠更輕鬆地維護一個古老的,經過嚴格審查的安全庫。由於這些原因,'tls'不適合。 –