簡體   English   中英

使用 OpenSSL BIO 的非阻塞 I/O

[英]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() “喚醒”。 它只是超時。

我的問題是:

  1. 我一定要創建使用BIO對象BIO_new_socket()然后使用BIO對象分配給我的SSL對象SSL_set_bio() SSL_set_fd()的手冊頁說它會自動創建一個 BIO 對象,因此這似乎暗示SSL_set_bio()是一種無用的函數,您永遠不必真正調用它。

  2. 假設我們使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM