我已经搜索了Stack Overflow和互联网,但我一直无法找到ssl_accept()为什么不断返回的答案:
[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协议规范的控制。使用返回值ret调用SSL_get_error()以找出原因。”
下面是服务器端的代码段,我是否可能正在咆哮错误的树,这个问题是由客户端代码引起的?
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 :(得分:7)
[DEBUG]错误字符串:错误:00000005:lib(0):func(0):DH lib
在Diffie-Hellman密钥交换期间发生错误,例如对等体试图生成连接的密钥。这可能有几个原因,例如服务器端给出的无效DH参数。使用您当前的代码很难看出错误的实际位置,但我想在某处设置您的ctx,所以也许应该显示代码的相关部分。
答案 1 :(得分:1)
这不是Diffie-Hellman库问题。
您获得
错误:00000005:lib(0):func(0):DH lib
是您将SSL_get_error()
错误代码传递给了ERR_error_string()
,您不应该这样做。
ERR_error_string()
仅用于ERR_get_error()
中的错误代码。
请参阅SSL_get_error()
的帮助页面,以了解错误的含义。