簡體   English   中英

SSL C++ 應用程序中的 SSL_ERROR_SYSCALL 錯誤

[英]SSL error SSL_ERROR_SYSCALL in C++ application

在我的 c++ 應用程序中,我在 my.networking 函數中使用了 open ssl。 我在成功連接到套接字后立即看到,我在使用 SSL_read 的接收 function 中收到錯誤:SSL_ERROR_SYS_CALL。 根據 SSL 文檔,這就是它的意思:

發生了一些 I/O 錯誤。 OpenSSL 錯誤隊列可能包含有關該錯誤的更多信息。 如果錯誤隊列為空(即 ERR_get_error() 返回 0),ret 可用於查找有關錯誤的更多信息:如果 ret == 0,則觀察到違反協議的 EOF。 如果ret == -1,底層BIO報I/O錯誤(Unix系統上的socket I/O,詳見errno)。

在我的例子中,ERR_get_error() 返回 0 和 ret == 0。這意味着“

觀察到違反協議的 EOF。

你知道這是什么意思嗎? 我不明白。 我需要檢查或做什么才能解決此問題?

謝謝

雷米(Remy)的答案是正確的,但讓我澄清一下並擴展一下。

SSL_do_handshake()SSL_connect()SSL_accept()SSL_write()SSL_read()SSL_shutdown()返回0時,調用SSL_get_error()返回SSL_ERROR_SYSCALL並且實際errno為0意味着對等方關閉TCP連接例如,在沒有正確關閉SSL的情況下調用close() 這是完全正常和常見的情況,但就TLS / SSL而言,這並不是正常的斷開連接。 因此,EOF違反了SSL協議。

調用BIO_eof(SSL_get_rbio(SSL *)))

如果您收到意外的EOF ,它將返回1

這是它的一個實現:

switch(errorCode){
  ...
  case SSL_ERROR_SYSCALL:{
    if(BIO_eof(SSL_get_rbio(ssl){
      //Handle the EOF
    }
    //You have an other error, call ERR_error_string
  }
}

這意味着您已連接到末端未使用SSL的對等套接字。 connect()套接字並立即開始調用SSL_read()是不夠的。 必須先在connect() SSL_connect()之后調用SSL_connect()來執行SSL握手,然后才能使用SSL_read()SSL_write() 另外,請確保您連接到正確的端口。 某些服務器將單獨的端口用於SSL和非SSL連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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