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