Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::asio::ssl, авторизация на сервере по ключу 
V
    Опции темы
bsa
Дата 9.9.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Задача: нужно написать сервер, каждый клиент которого должен иметь свой собственный сертификат шифрования (т.е. авторизация по сертификату, как в ssh). Желательно сделать это через boost::asio.
На данный момент (поковыряв этот asio) я решил, что проще всего сделать так: при подключении клиента получить у него некий идентификатор (логин), по этому идентификатору загрузить с диска необходимый публичный ключ (приватный хранится на стороне клиента) и после этого начать процедуру SSL:handshake...

Возможно ли это? И как это сделать (меня интересуют процедуры авторизации по публичному ключу и преобразования обычного сокета в защищенный)?

Это сообщение отредактировал(а) bsa - 9.9.2009, 16:17
PM   Вверх
andrew_121
Дата 9.9.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(bsa @  9.9.2009,  16:15 Найти цитируемый пост)
Возможно ли это?

да

asio/examples/ssl/client.cpp
тут отличный пример.

Добавлено через 6 минут и 57 секунд
дополню.
В примерах, не используются загружаемые ключи. Нет надобности. Но если нужно, то можно.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 9.9.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



еще дополню.
в asio::ssl::context(могу ошибаться), есть методы с постфиксом file. они это реализуют. нужно в доках уточнить...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.9.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



это я все видел. доки, если честно, просто жгут. Имхо, исходник был бы более информативным.
Единственное, что спасает - примеры. Но опять же, хоть бы подсветку синтаксиса сделали...

Это сообщение отредактировал(а) bsa - 9.9.2009, 19:48
PM   Вверх
andrew_121
Дата 9.9.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(bsa @  9.9.2009,  19:44 Найти цитируемый пост)
это я все видел. доки, если честно, просто жгут

да уж.

Цитата(bsa @  9.9.2009,  19:44 Найти цитируемый пост)
Имхо, исходник был бы более информативным.

так вот же:
examples/ssl/server.cpp
examples/ssl/client.cpp

или что не так?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 9.9.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Если использовать это: http://getunderstand.com/latest/understand...-b489-win32.exe можно получить такую картинку.
user posted image

имхо, намного облегчает понимание. учитывая что она динамическая.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.9.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(andrew_121 @ 9.9.2009,  21:05)
Цитата(bsa @  9.9.2009,  19:44 Найти цитируемый пост)
Имхо, исходник был бы более информативным.

так вот же:
examples/ssl/server.cpp
examples/ssl/client.cpp

или что не так?

Я имел в виду, исходник библиотеки, а не примера.
PM   Вверх
andrew_121
Дата 9.9.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(bsa @  9.9.2009,  21:55 Найти цитируемый пост)
Я имел в виду, исходник библиотеки, а не примера. 

Ну тогда ваще не понял smile  Она же opensource, в чем проблема?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 9.9.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(andrew_121 @ 9.9.2009,  22:02)
Ну тогда ваще не понял smile  Она же opensource, в чем проблема?

Проблема в доке, которая хуже, чем исходник. Я только это и хотел сказать.
PM   Вверх
Lazin
Дата 9.9.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



я никогда не использовал ssl, но могу что-нибудь подсказать по архитектуре smile 
Цитата(bsa @  9.9.2009,  22:20 Найти цитируемый пост)
Проблема в доке, которая хуже, чем исходник. Я только это и хотел сказать. 
там на самом деле все не сложно, как и все удачные библиотеки, asio очень просто и понятно организована
PM MAIL Skype GTalk   Вверх
bsa
Дата 9.9.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Мне очень интересно, можно ли один и тот же SSL контекст использовать для разных подключений (об этом в доке я ничего не нашел). Например, коннектится к серверу клиент, для него используется некий контекст, затем второй коннектится... Можно ли для него использовать тот же контекст? Ведь все методы получают неконстантный контекст! А вот в примере я увидел, что именно так и делается - контекст для всех один:
Код
  void handle_accept(session* new_session,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      new_session->start();
      new_session = new session(io_service_, context_);
      acceptor_.async_accept(new_session->socket(),
          boost::bind(&server::handle_accept, this, new_session,
            boost::asio::placeholders::error));
    }
    else
    {
      delete new_session;
    }
  }

PM   Вверх
andrew_121
Дата 10.9.2009, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(bsa @  9.9.2009,  23:18 Найти цитируемый пост)
можно ли один и тот же SSL контекст использовать для разных подключений

да. а вот наоборот, не уверен.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 27.11.2009, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Цитата(bsa @  9.9.2009,  23:18 Найти цитируемый пост)
можно ли один и тот же SSL контекст использовать для разных подключений
можно. несмотря на сигнатуру, ssl::socket копирует контекст.

Цитата(bsa @  9.9.2009,  16:15 Найти цитируемый пост)
Возможно ли это? И как это сделать (меня интересуют процедуры авторизации по публичному ключу и преобразования обычного сокета в защищенный)?
Можно, но средств asio для этого недостаточно. Я сделал так:
1. клиент хранит у себя сертификат цифровой подписи ("открытый ключ"), которой подписаны сертификаты серверов
2. после установления соединения и успешного прохождения операции квитирования (handshake) (значит цифровая подпись верна, так как установлен режим проверки verify_peer), берется поле subject полученного сертификата и из него извлекается нужное поле.
Делаю это так:
Код
template<typename ImplType>
std::string getCertIssuer(ImplType impl, const std::string &field)
{
    std::string data;
    {
        ::X509 *crt = ::SSL_get_peer_certificate(impl->ssl);
        char buf[256];
        ::X509_NAME_oneline(::X509_get_subject_name(crt), buf, sizeof(buf));
        ::X509_free(crt);
        buf[sizeof(buf)-1] = '\0';
        data = buf;
    }
    std::string::size_type begin = data.find("/" + field + "=");
    begin = data.find('=', begin);
    const std::string::size_type end = data.find('/', begin);
    if (end == std::string::npos)
        return std::string();
    ++begin;
    return data.substr(begin, end - begin);
}
...
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket(io_service, ctx);
...
std::string organization = getCertIssuer(socket.impl(), "O")


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.