Я использую 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()
?