Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Kenny_Dalglish
-10 / 2 / 1
Регистрация: 08.01.2015
Сообщений: 324
Завершенные тесты: 1
1

C++ | boost::asio + ssl?

22.10.2015, 17:55. Просмотров 1804. Ответов 9
Метки нет (Все метки)

Доброго времени суток!
Хотелось бы узнать как подключаться по SSL?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
  boost::asio::ip::tcp::iostream stream;
  stream.expires_from_now(boost::posix_time::seconds(60));
  stream.connect("api.vk.com", "http");
  if (!stream)
  {
    std::cout << "Error: " << stream.error().message() << "\n";
  }
  stream << "GET тут запрос";
  stream.flush();
  std::cout << stream.rdbuf();
  system("pause");
  return 0;
}
Нужно подключиться данным кодом по https, заранее спасибо!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2015, 17:55
Ответы с готовыми решениями:

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта...

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда...

Winsock vs boost::asio
у Winsock преимущество - это есть русская документация(это не совсем документация но крис касперски...

9
castaway
Эксперт С++
4942 / 3048 / 455
Регистрация: 10.11.2010
Сообщений: 11,146
Записей в блоге: 10
Завершенные тесты: 1
22.10.2015, 19:23 2
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//
// client.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at [url]http://www.boost.org/LICENSE_1_0.txt[/url])
//
 
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
 
enum { max_length = 1024 };
 
class client
{
public:
  client(boost::asio::io_service& io_service,
      boost::asio::ssl::context& context,
      boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
    : socket_(io_service, context)
  {
    socket_.set_verify_mode(boost::asio::ssl::verify_peer);
    socket_.set_verify_callback(
        boost::bind(&client::verify_certificate, this, _1, _2));
 
    boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
        boost::bind(&client::handle_connect, this,
          boost::asio::placeholders::error));
  }
 
  bool verify_certificate(bool preverified,
      boost::asio::ssl::verify_context& ctx)
  {
    // The verify callback can be used to check whether the certificate that is
    // being presented is valid for the peer. For example, RFC 2818 describes
    // the steps involved in doing this for HTTPS. Consult the OpenSSL
    // documentation for more details. Note that the callback is called once
    // for each certificate in the certificate chain, starting from the root
    // certificate authority.
 
    // In this example we will simply print the certificate's subject name.
    char subject_name[256];
    X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
    X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
    std::cout << "Verifying " << subject_name << "\n";
 
    return preverified;
  }
 
  void handle_connect(const boost::system::error_code& error)
  {
    if (!error)
    {
      socket_.async_handshake(boost::asio::ssl::stream_base::client,
          boost::bind(&client::handle_handshake, this,
            boost::asio::placeholders::error));
    }
    else
    {
      std::cout << "Connect failed: " << error.message() << "\n";
    }
  }
 
  void handle_handshake(const boost::system::error_code& error)
  {
    if (!error)
    {
      std::cout << "Enter message: ";
      std::cin.getline(request_, max_length);
      size_t request_length = strlen(request_);
 
      boost::asio::async_write(socket_,
          boost::asio::buffer(request_, request_length),
          boost::bind(&client::handle_write, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
    }
    else
    {
      std::cout << "Handshake failed: " << error.message() << "\n";
    }
  }
 
  void handle_write(const boost::system::error_code& error,
      size_t bytes_transferred)
  {
    if (!error)
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(reply_, bytes_transferred),
          boost::bind(&client::handle_read, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
    }
    else
    {
      std::cout << "Write failed: " << error.message() << "\n";
    }
  }
 
  void handle_read(const boost::system::error_code& error,
      size_t bytes_transferred)
  {
    if (!error)
    {
      std::cout << "Reply: ";
      std::cout.write(reply_, bytes_transferred);
      std::cout << "\n";
    }
    else
    {
      std::cout << "Read failed: " << error.message() << "\n";
    }
  }
 
private:
  boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
  char request_[max_length];
  char reply_[max_length];
};
 
int main(int argc, char* argv[])
{
  try
  {
    if (argc != 3)
    {
      std::cerr << "Usage: client <host> <port>\n";
      return 1;
    }
 
    boost::asio::io_service io_service;
 
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(argv[1], argv[2]);
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
 
    boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);
    ctx.load_verify_file("ca.pem");
 
    client c(io_service, ctx, iterator);
 
    io_service.run();
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }
 
  return 0;
}
source
0
Убежденный
Ушел с форума
Эксперт С++
16244 / 7311 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.10.2015, 19:58 3
Цитата Сообщение от Kenny_Dalglish Посмотреть сообщение
Хотелось бы узнать как подключаться по SSL?
1. Прочесть документацию Boost.Asio.

2. Изучить примеры (см. выше).

3. Собрать OpenSSL, подключить к Boost.

4. Накатать свои хотелки, запустить, отладить.

5. PROFIT!
0
Guest89
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 12
24.10.2015, 14:01 4
castaway, а я что-то в вашем коде так и не увидел самого запроса "https". Или он в файле "ca.pem"?
0
24.10.2015, 14:01
castaway
Эксперт С++
4942 / 3048 / 455
Регистрация: 10.11.2010
Сообщений: 11,146
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 17:45 5
Guest89, ты спросил как подключится, я нашёл пример, показал его тебе.
Если с подключением ты уже разобрался и тебе нужно отправить запрос - создай отдельную тему.

P.S.: а разве HTTP-запрос чем-то отличается от HTTPS-запроса?
0
Guest89
0 / 0 / 0
Регистрация: 29.08.2012
Сообщений: 12
24.10.2015, 19:37 6
castaway, Я от вас ни чего не просил, это просил Kenny_Dalglish, и с каких пор мы на ты?! Хоть тему читайте прежде чем ответить, а не кидайтесь на всех подряд. И не надо мне тыкать.
0
castaway
Эксперт С++
4942 / 3048 / 455
Регистрация: 10.11.2010
Сообщений: 11,146
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 20:24 7
Guest89, да, пардон, я почему-то решил что ты - ТС.

Цитата Сообщение от Guest89 Посмотреть сообщение
и с каких пор мы на ты?!
Такой я человек. Не нравится - не общайся со мной.

Цитата Сообщение от Guest89 Посмотреть сообщение
а не кидайтесь на всех подряд.
В каких моих словах ты увидел факт того что я кидаюсь?

Цитата Сообщение от Guest89 Посмотреть сообщение
И не надо мне тыкать.
Какой ты гордый... Можешь обращаться ко мне на ты, я не такой.

Guest89, кстати, а с чего ты взял, что в примере, который я предоставил, должен быть запрос HTTPS?

Добавлено через 37 минут

Не по теме:

Аж напомнило фразу Сергея Юрского из к\ф "Место Встречи Изменить Нельзя", - "Ты мне не тычь, сукин сын."

0
Avazart
30.10.2015, 00:19
  #8

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
3. Собрать OpenSSL, подключить к Boost.
А зачем собирать OpenSSL? Тупо установить инсталятором не выйдет?

0
Убежденный
Ушел с форума
Эксперт С++
16244 / 7311 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
30.10.2015, 00:23 9
Я, наверное, отстал от жизни. А где есть такой инсталлер OpenSSL ?
0
Avazart
Эксперт С++
7929 / 5749 / 570
Регистрация: 10.12.2010
Сообщений: 26,346
Записей в блоге: 17
30.10.2015, 00:24 10
Цитата Сообщение от Убежденный Посмотреть сообщение
Я, наверное, отстал от жизни. А где есть такой инсталлер OpenSSL ?
Да хз, помню вроде инсталятором когда-то ставил вместе с исходниками/бинарниками.
0
30.10.2015, 00:24
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2015, 00:24

boost::asio cессии
Здравствуйте. Хотелось бы узнать ответ на вопрос, который не где не нашол. Сервер реализован на...

Boost.Asio не соединяется
Здравствуйте форумчане, недавно начал изучать boost.asio Скомпилил из примеров Server Client,...

boost::asio пример
Привет! Можно, пожалуйста, простейший пример работы с boost::asio - клиент-серверная программа,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru