2014-05-05 91 views
4

我已經沖刷堆棧溢出和互聯網,但我一直無法找到一個答案,爲什麼ssl_accept()保留返回:OpenSSL的ssl_accept()錯誤5

[DEBUG] SSL_accept() : Failed with return 0 
[DEBUG]  SSL_get_error() returned : 5 
[DEBUG]  Error string : error:00000005:lib(0):func(0):DH lib 
[DEBUG]  WSAGetLastError() returned : 0 
[DEBUG]  GetLastError() returned : 0 
[DEBUG]  ERR_get_error() returned : 0 

編輯: 我的興趣ssl_accept的( )返回0,定義爲(相應地,對於很少和無用的OpenSSL文檔): 「TLS/SSL握手不成功,但是被關閉控制,並且由TLS/SSL協議的規範來調用SSL_get_error()價值ret找出原因。「

下面是服務器端的片段,我可以吠叫錯誤的樹,這個問題是由客戶端代碼引起的嗎?

client = accept(server, (sockaddr*) &clientsockaddrin, &len); 

    SSL* ssl = SSL_new(ctx); 

    SSL_set_fd(ssl, client); 

    std::cout << "+--------------------------------------------------+" 
       << std::endl; 

    int r = SSL_accept(ssl); 

    if (r != 1) 
    { 
     int err_SSL_get_error = SSL_get_error(ssl, r); 
     int err_GetLastError = GetLastError(); 
     int err_WSAGetLastError = WSAGetLastError(); 
     int err_ERR_get_error = ERR_get_error(); 

     std::cout << "[DEBUG] SSL_accept() : Failed with return " 
        << r << std::endl; 
     std::cout << "[DEBUG]  SSL_get_error() returned : " 
        << err_SSL_get_error << std::endl; 
     std::cout << "[DEBUG]  Error string : " 
        << ERR_error_string(err_SSL_get_error, NULL) 
        << std::endl; 
     std::cout << "[DEBUG]  WSAGetLastError() returned : " 
        << err_WSAGetLastError << std::endl; 
     std::cout << "[DEBUG]  GetLastError() returned : " 
        << err_GetLastError << std::endl; 
     std::cout << "[DEBUG]  ERR_get_error() returned : " 
        << err_ERR_get_error << std::endl; 
     std::cout << "+--------------------------------------------------+" 
        << std::endl; 
     break; 
    } 

感謝您的幫助,因爲這是我逼瘋:(

+0

Wots'5'?拒絕訪問? –

+0

這是我不確定的,我無法找到任何明確的錯誤代碼列表,沒有經過我猜測的OpenSSL源代碼? –

+1

'client = accept(...)'失敗了嗎?它不清楚你是否正在執行錯誤檢查。除非您在防火牆規則中設置了例外,否則Vista和更高版本(甚至XP SP 2)防火牆將默認拒絕訪問。 – jww

回答

7

[DEBUG] Error string : error:00000005:lib(0):func(0):DH lib

的Diffie-Hellman密鑰交換,例如其中的同行試圖生成的連接鍵發生期間的錯誤。有可能有幾個原因,比如服務器端提供的無效DH參數,使用你當前的代碼很難看到錯誤的實際位置,但我猜是在設置你的ctx的地方,所以也許應該顯示相關的部分代碼

+0

哦,我實際上沒有設置Diffie-Hellman密鑰交換,我應該這樣做嗎? –

+0

如果您提供DH密碼,您需要安裝DH –

+0

這可能是因爲我使用ss_library_init()加載了所有密碼嗎? –