簡體   English   中英

客戶端在BIO_do_connect上返回-1

[英]Client returns -1 on BIO_do_connect

我正在嘗試使用OpenSSL及其BIO創建基本服務器和客戶端,但BIO_do_connect返回-1。 之后ERR_get_error返回0。 我試着通過編寫// check [condition]來盡量減少下面的代碼。 在我的實際代碼中,我使用if檢查執行相同的操作,然后打印出ERR_get_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();

此服務器運行正常,但我的客戶端無法連接到它:

// 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();

我很抱歉發布了這么多代碼。 我沒有真正找到使用BIO的OpenSSL服務器/客戶端的完整示例。

你的服務器代碼基本上是這樣的

  1. 將serverBio設置為SSL
  2. 創建一個沒有SSL的新BIO acceptBio
  3. 接受連接連接 - > clientBio
  4. 一切都免費

由於serverBio未用於新創建的TCP連接clientBio,因此服務器未在此處執行任何SSL握手。

除此之外,我建議您首先針對已知良好的客戶端和服務器測試您的服務器和客戶端,以便您可以更快地找出問題所在。 openssl s_clientopenssl s_server提供了這樣的測試客戶端和服務器。 數據包捕獲(wireshark)也有助於找出服務器和客戶端之間發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM