OpenSSL ssl_accept()错误5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenSSL ssl_accept()错误5相关的知识,希望对你有一定的参考价值。

我已经搜索了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,找出原因。“

下面是服务器端的片段,我可能会咆哮错误的树,这个问题是由客户端代码引起的吗?

    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;
    }

感谢你的帮助,因为这让我很生气:(

答案

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

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

另一答案

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

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

是你通过SSL_get_error()错误代码传递给ERR_error_string(),你不应该这样做。

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

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

调用 fork() 后 SSL_accept 挂起

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

OpenSSL 解密失败但错误代码为 0

openssl验证签名错误,但命令行工具没问题

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

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