Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 客户端在BIO_do_connect上返回-1_C++_C_Sockets_Ssl_Openssl - Fatal编程技术网

C++ 客户端在BIO_do_connect上返回-1

C++ 客户端在BIO_do_connect上返回-1,c++,c,sockets,ssl,openssl,C++,C,Sockets,Ssl,Openssl,我试图使用OpenSSL及其BIOs创建一个基本的服务器和客户机,但是BIO_do_connect返回-1。ERR_get_error在此之后返回0。 我试图通过编写//check[condition]来最小化下面的代码。在我的实际代码中,我使用if检查做同样的事情,然后打印ERR\u get\u error返回的错误。(因此,如果条件为真,我将打印错误消息) 这是我的服务器代码: // init OpenSSL SSL_load_error_strings(); ERR_load_BIO_st

我试图使用OpenSSL及其BIOs创建一个基本的服务器和客户机,但是BIO_do_connect返回-1。ERR_get_error在此之后返回0。 我试图通过编写//check[condition]来最小化下面的代码。在我的实际代码中,我使用if检查做同样的事情,然后打印ERR\u get\u error返回的错误。(因此,如果条件为真,我将打印错误消息)

这是我的服务器代码:

// init OpenSSL
SSL_load_error_strings();
ERR_load_BIO_strings();
SSL_library_init();
OpenSSL_add_all_algorithms();

SSL_CTX *ctx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_set_default_passwd_cb(ctx, &myPasswordCallback);

int certState = SSL_CTX_use_certificate_file(ctx, "../certs/cert.pem", SSL_FILETYPE_PEM);
// check certState < 0

int keyState = SSL_CTX_use_PrivateKey_file(ctx, "../certs/key.pem", SSL_FILETYPE_PEM);
// check keyState < 0

BIO *serverBio = BIO_new_ssl(ctx, 0);
// check serverBio == nullptr

SSL *serverSsl = nullptr;
BIO_get_ssl(serverBio, &serverSsl);
// check serverSsl == nullptr

SSL_set_mode(serverSsl, SSL_MODE_AUTO_RETRY);

BIO *acceptBio = BIO_new_accept("6672");
// check acceptBio == nullptr

int setupAcceptResult = BIO_do_accept(acceptBio);
// check setupAcceptResult <= 0

int acceptResult = BIO_do_accept(acceptBio);
// check acceptResult <= 0

BIO *clientBio = BIO_pop(acceptBio);
// check clientBio == nullptr

BIO_free_all(clientBio);

BIO_free_all(acceptBio);
BIO_free_all(serverBio);

// cleanup OpenSSL
SSL_CTX_free(ctx);
EVP_cleanup();
ERR_free_strings();
//初始化OpenSSL
SSL_加载_错误_字符串();
ERR_load_BIO_strings();
SSL_库_init();
OpenSSL_添加_所有算法();
SSL_CTX*CTX=SSL_CTX_new(SSLv23_server_method());
SSL\u CTX\u set\u default\u passwd\u cb(CTX和myPasswordCallback);
int-certState=SSL\u-CTX\u-use\u-certificate\u文件(CTX,“../certs/cert.pem”,SSL\u-FILETYPE\u-pem);
//检查certState<0
int-keyState=SSL\u-CTX\u-use\u-PrivateKey\u文件(CTX,../certs/key.pem),SSL\u文件类型\u-pem);
//检查键状态是否小于0
BIO*serverBio=BIO_new_ssl(ctx,0);
//检查serverBio==nullptr
SSL*serverSsl=nullptr;
BIO_get_ssl(serverBio和serverSsl);
//检查serverSsl==nullptr
SSL设置模式(服务器SSL、SSL模式自动重试);
BIO*acceptBio=BIO_new_accept(“6672”);
//检查acceptBio==nullptr
int setupAcceptResult=BIO_do_accept(acceptBio);

//检查setupAcceptResult您的服务器代码基本上如下所示:

  • 将serverBio设置为SSL
  • 创建没有SSL的新BIO acceptBio
  • 接受连接->clientBio
  • 释放一切
  • 由于serverBio未用于新创建的TCP连接clientBio,因此服务器未在此处执行任何SSL握手


    除此之外,我建议您首先针对已知良好的客户机和服务器测试服务器和客户机,以便更快地找出问题所在
    openssl s_客户端
    openssl s_服务器
    提供此类测试客户端和服务器。此外,数据包捕获(wireshark)有助于找出服务器和客户端之间发生的情况。

    您的服务器代码基本上是这样的:

  • 将serverBio设置为SSL
  • 创建没有SSL的新BIO acceptBio
  • 接受连接->clientBio
  • 释放一切
  • 由于serverBio未用于新创建的TCP连接clientBio,因此服务器未在此处执行任何SSL握手


    除此之外,我建议您首先针对已知良好的客户机和服务器测试服务器和客户机,以便更快地找出问题所在
    openssl s_客户端
    openssl s_服务器
    提供此类测试客户端和服务器。此外,数据包捕获(wireshark)有助于找出服务器和客户端之间发生的情况。

    返回的错误是什么,等等。@jww ERR\u get\u error返回0。这些问题对我没有帮助。返回的错误是什么,等等。@jww ERR\u get\u error返回0。这些问题对我没有帮助。谢谢你的回答!所以我必须第三次握手?因为我已经调用了两次(BIO_-do-u-accept定义为BIO_-do-u握手)。我尝试过,但没有完成,s_客户端只是连接,但它没有从我的服务器获得任何证书。@User9182736455:BIO_-do-u-accept没有定义为BIO_-do-u握手。您在服务器中仅使用TCP BIO。使用BIO_set_ssl或基于BIO_s_accept或类似工具创建BIO都无法实现关联。@User9182736455:我建议您从一个工作示例代码开始(只是google),然后根据需要调整它,而不是从头开始。OpenSSL不是一个容易使用的库。谢谢,我会试试的。谢谢你的回答!所以我必须第三次握手?因为我已经调用了两次(BIO_-do-u-accept定义为BIO_-do-u握手)。我尝试过,但没有完成,s_客户端只是连接,但它没有从我的服务器获得任何证书。@User9182736455:BIO_-do-u-accept没有定义为BIO_-do-u握手。您在服务器中仅使用TCP BIO。使用BIO_set_ssl或基于BIO_s_accept或类似工具创建BIO都无法实现关联。@User9182736455:我建议您从一个工作示例代码开始(只是google),然后根据需要调整它,而不是从头开始。OpenSSL不是一个容易使用的库。谢谢,我会试试的
    // init OpenSSL
    SSL_load_error_strings();
    ERR_load_BIO_strings();
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    
    SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method());
    SSL_CTX_set_default_passwd_cb(ctx, &myPasswordCallback);
    
    int certState = SSL_CTX_use_certificate_file(ctx, "../certs/cert.pem", SSL_FILETYPE_PEM);
    // check certState < 0
    
    int keyState = SSL_CTX_use_PrivateKey_file(ctx, "../certs/key.pem", SSL_FILETYPE_PEM);
    // check keyState < 0
    
    BIO *clientBio = BIO_new_ssl_connect(ctx);
    SSL *clientSsl = nullptr;
    BIO_get_ssl(clientBio, &clientSsl);
    // check clientSsl == nullptr
    
    SSL_set_mode(clientSsl, SSL_MODE_AUTO_RETRY);
    
    BIO_set_conn_hostname(clientBio, "localhost:6672");
    
    long connectionState = BIO_do_connect(clientBio);
    // check connectionState <= 0
    // here it fails; connectionState is -1
    
    long sslState = SSL_get_verify_result(clientSsl);
    // check sslState != X509_V_OK
    
    BIO_free_all(clientBio);
    
    SSL_CTX_free(ctx);
    
    EVP_cleanup();
    ERR_free_strings();