Можно ли использовать ssl-сокет поверх незащищенного сокета в boost :: asio? - PullRequest
0 голосов
/ 15 июня 2019

Я использую libcurl для подключения к серверу и получения незащищенного сокета.

curl_socket_t sock;
curl_easy_setopt(curl, CURLOPT_OPENSOCKETDATA, &sock);

Затем я использую boost :: asio для работы с сокетом.

boost::asio::ip::tcp::socket ba_sock;   
ba_sock.assign(tcp::v4(), sock);

Операции чтения и записи на ba_sock работают отлично.

Теперь мне нужно отправить данные с помощью ssl. Можно ли использовать небезопасный ba_sock для создания ssl-сокета?

Я попробовал этот подход:

namespace ba = boost::asio;

boost::shared_ptr<ba::ssl::stream<tcp::socket>> ssl_socket;
boost::shared_ptr<ba::ssl::context> ssl_ctx;
ssl_ctx.reset(new ba::ssl::context(ba::ssl::context_base::method::sslv23));
ssl_ctx->set_verify_mode(ba::ssl::verify_peer);

const std::string& server_cert = certificate_get();
ba::const_buffer ba_server_cert(server_cert.data(), server_cert.size());

boost::system::error_code ec;
ssl_ctx->use_certificate(ba_server_cert, ba::ssl::context::pem, ec);

const std::string& client_pkey = private_key_get();
ba::const_buffer ba_client_pkey(client_pkey.data(), client_pkey.size());
ssl_ctx->use_rsa_private_key(ba_client_pkey, ba::ssl::context::pem, ec);

// now create secure socket
ssl_socket.reset(new ba::ssl::stream<tcp::socket>(*ios, *ssl_ctx));
ssl_socket->lowest_layer().connect(ba_sock.local_endpoint(), ec);

if (ec.value())
    printf("%s\n", ec.message().c_str());

connect(ba_sock.local_endpoint(), ec); выдает ошибку «Отказ в соединении».

Чего мне не хватает? Это проблема с сертификатами или я неправильно использую ba_sock.local_endpoint()?

...