2014-05-05 64 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()加载了所有密码吗? –