OpenSSL ssl_accept() 错误 5

Posted

技术标签:

【中文标题】OpenSSL ssl_accept() 错误 5【英文标题】:OpenSSL ssl_accept() error 5 【发布时间】: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成功,则直接忽略返回值。 是的,我在互联网上找到的唯一参考似乎是因为这个连接失败。 【参考方案1】:

[DEBUG] 错误字符串:error:00000005:lib(0):func(0):DH lib

在 Diffie-Hellman 密钥交换期间发生错误,例如对等方试图为连接生成密钥的地方。这可能有几个原因,比如服务器端给出的 DH 参数无效。使用您当前的代码很难看出错误实际上在哪里,但我猜是在设置您的 ctx 的某个地方,所以也许应该显示代码的相关部分。

【讨论】:

哦,我实际上并没有设置 Diffie-Hellman 密钥交换,我应该这样做吗? 如果您提供 DH 密码,您需要设置 DH 密钥。 这可能是因为我用 ss_library_init () 加载了所有密码吗? 否,但如果您没有使用 SSL_(CTX)_set_cipher_list 显式设置密码列表,它将使用默认设置,其中包括大量密码和 DH 密码。 解决方案是什么? @保罗莫里斯【参考方案2】:

这不是 Diffie-Hellman 库问题。 你得到的原因

错误:00000005:lib(0):func(0):DH 库

是您将SSL_get_error() 错误代码传递给ERR_error_string(),这是您不应该做的。

ERR_error_string() 仅用于来自ERR_get_error() 的错误代码。 请参阅SSL_get_error() 的帮助页面以了解错误的含义。

【讨论】:

如果您事先加载 ssl 错误字符串,我相信您可以在 ssl 错误上使用 ERR_error_string():openssl.org/docs/man1.0.2/man3/SSL_load_error_strings.html

以上是关于OpenSSL ssl_accept() 错误 5的主要内容,如果未能解决你的问题,请参考以下文章

调用 fork() 后 SSL_accept 挂起

Laravel 5.7 on apache 错误调用未定义函数 Illuminate\Encryption\openssl_cipher_iv_length()

Linux升级openssl时遇到的奇怪错误

尝试使用OpenSSL到RabbitMQ时,Connection无限挂起 - 没有提到错误

PayPal IPN OPENSSL 错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败

conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c