【发布时间】:2014-06-22 03:53:45
【问题描述】:
我已经搜索了 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 协议规范控制关闭。调用 SSL_get_error() 并返回值 ret 找出原因。”
下面是服务器端的sn-p,我是不是找错了树,这个问题是由客户端代码引起的?
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;
}
感谢您的帮助,因为这让我发疯:(
【问题讨论】:
-
Wots '5'?访问被拒绝?
-
这是我不确定的,我找不到任何明确的错误代码列表,我猜没有通过 OpenSSL 源代码?
-
client = accept(...)失败了吗?不清楚您是否正在执行错误检查。 Vista 及以上(甚至 XP SP 2)防火墙默认会拒绝访问,除非您在防火墙规则中设置了例外。 -
WSAGetLastError function 将帮助您处理错误代码。此外,您不应延迟拨打
WSAGetLastError(或GetLastError)。在SSL_accept之后立即调用它。如果SSL_accept成功,则直接忽略返回值。 -
是的,我在互联网上找到的唯一参考似乎是因为这个连接失败。
标签: c++ encryption openssl