[英]Non-Blocking I/O With OpenSSL BIO
我在 Linux 上使用 OpenSSL 1.0.0-fips。 我遇到的問題是SSL_connect()
返回 -1 並且SSL_get_error()
返回SSL_ERROR_WANT_READ
。 然后我將文件描述符放入select()
並將timeval
結構設置為 10 秒並且select()
只是超時。
我啟動了 Wireshark,我看到“Client Hello”消失了,我看到ServerHello
返回到客戶端,但它從未在select()
“喚醒”。 它只是超時。
我的問題是:
我一定要創建使用BIO對象BIO_new_socket()
然后使用BIO對象分配給我的SSL對象SSL_set_bio()
SSL_set_fd()
的手冊頁說它會自動創建一個 BIO 對象,因此這似乎暗示SSL_set_bio()
是一種無用的函數,您永遠不必真正調用它。
假設我們使用SSL_set_fd()
並分配一個連接的 TCP 文件描述符是阻塞的。 假設我們稍后使用fcntl()
將該文件描述符更改為非阻塞。 這是否會破壞 SSL 對象(或底層 BIO 對象)?
1) 我是否必須使用 BIO_new_socket() 創建一個 BIO 對象,然后使用 SSL_set_bio() 將 BIO 對象分配給我的 SSL 對象? SSL_set_fd() 的手冊頁說它會自動創建一個 BIO 對象,因此這似乎暗示 SSL_set_bio() 是一種無用的函數,您永遠不必真正調用它。
如果默認 BIO 對象足以滿足您的需要,則您不必手動創建和安裝您自己的 BIO 對象。 SSL_set_bio() 調用是為了以防萬一您想創建/使用與 SSL_set_fd() 代表您創建的默認對象不同的 BIO 對象。
2) 假設我們使用 SSL_set_fd() 並分配一個連接的 TCP 文件描述符是阻塞的。 假設我們稍后使用 fcntl() 將該文件描述符更改為非阻塞。 這是否會以任何方式破壞 SSL 對象(或底層 BIO 對象)?
是的,我相信它會破裂。 非阻塞 OpenSSL 的調用模式與用於阻塞 OpenSSL 的調用模式非常不同,我不相信您可以在運行中從一種模式來回切換到另一種模式。 也就是說,我自己沒有嘗試過,所以我可能是錯的,但我認為為了安全起見(並保持一致),您應該預先選擇是否要使用阻塞或非阻塞 I/ O 並在連接期間堅持使用它。
特別是,來自手冊頁的引用:
BIO 和 SSL 引擎繼承了 fd 的行為。
... 建議 SSL 設置調用將檢查您的 fd 的狀態,並根據 fd 的阻塞/非阻塞狀態在 BIO 和 SSL 對象中設置私有變量。 如果您隨后“落后於 OpenSSL”並更改 fd 的行為,則 OpenSSL 的例程不會期望這樣做,並且很可能會做錯事並且無法正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.