2015-06-07 46 views
1

我很努力地找到一種機制來向目標服務器發送請求,並且當套接字有數據要讀取時,將套接字傳遞給另一個進程以獲取數據。 我到目前爲止在Linux上使用epoll,爲了實現這一點,我做了握手,我發送請求和請求到達,然後我將套接字fd傳遞給另一個進程以進一步處理,我明確地保存SSL會話使用PEM_write_bio_SSL_SESSION,然後使用PEM_read_bio_SSL_SESSION讀取它並將其添加到上下文中,但我無法讀取另一個進程中的ssl套接字,因爲我得到內部錯誤或握手失敗。將連接的SSL Socket傳遞給另一個進程

我讀過這個article但仍找不到任何機制來解決它。我知道這是因爲openssl是應用程序級庫,但必須有辦法,因爲Apache已經這樣做了。

至少,如果它不可能的話,有沒有辦法使用來自openssl會話的主密鑰解密來自套接字(我可以正常讀取)的數據?

回答

3

您可以做到這一點的唯一方法是克隆SSL套接字的全部用戶空間部分,該部分分佈在多個內部數據結構中。由於您無法訪問python中的所有結構,因此您只能通過克隆該進程來完成此操作,即使用fork

請注意,一旦分叉了進程,您應該只能繼續在其中一個進程中使用SSL套接字,即不可能在子進程中執行一些工作,然後在父進程中執行一些工作處理。這是不可能的,因爲一旦處理套接字,SSL狀態就會發生變化,但只能在其中一個進程中進行更改。在另一個進程中,狀態不同步,以後任何嘗試使用這種錯誤的狀態都會導致奇怪的錯誤。

+0

謝謝你的回答。我希望能找到一條出路,避免分叉這個過程,因爲它對我所做的事情來說非常昂貴。我明白了這一點,是否有辦法通過SSL會話獲得的信息手動刪除數據?我可以從套接字讀取所有加密的數據。 – purrogrammer

+0

據我所知,你唯一的選擇是分叉過程。沒有當前SSL狀態的序列化,因此您可以傳輸它。請注意,SSL會話不是內部SSL狀態。 –

+0

你是對的,我只是重複使用ssl會話,這會降低握手開銷,但這絕對不是將套接字句柄賦予另一個進程的方式。我試着用posix線程,它運作良好。仍然對性能感到悲觀,希望通過pthread中的合作調度獲得更好的性能。我想知道Apache如何做,我會看看他們的實現。 – purrogrammer