[英]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.