Повышаю. Asio содержит классы и шаблоны классов для основной поддержки SSL. Эти классы позволяют осуществлять зашифрованную связь поверх существующего потока, такого как сокет TCP.
Перед созданием зашифрованного потока приложение должно построить объект контекста SSL. Этот объект используется для установки параметров SSL, таких как режим проверки, файлы сертификатов и так далее. В качестве иллюстрации, инициализация на стороне клиента может выглядеть примерно так:
ssl::context ctx(ssl::context::sslv23);
ctx.set_verify_mode(ssl::verify_peer);
ctx.load_verify_file("ca.pem");
Чтобы использовать SSL с сокетом TCP, можно написать:
ssl::stream<ip::tcp::socket> ssl_sock(my_io_service, ctx);
Для выполнения операций, специфичных для сокетов, таких как установление исходного соединения или принятие входящего, базовое сокетное соединение сначала должно быть получено с использованием функции члена шаблона<ssl::stream
><lowest_layer()
>:
ip::tcp::socket::lowest_layer_type& sock = ssl_sock.lowest_layer();
sock.connect(my_endpoint);
В некоторых случаях использования базовый объект потока должен иметь более длительный срок службы, чем поток SSL, и в этом случае параметр шаблона должен быть ссылкой на тип потока:
ip::tcp::socket sock(my_io_service);
ssl::stream<ip::tcp::socket&> ssl_sock(sock, ctx);
Рукопожатие SSL должно выполняться до передачи или приема данных через зашифрованное соединение. Это достигается с помощью<ssl::stream
>шаблонарукопожатия ().илиasync_handshake()Функции членов.
После подключения объекты потока SSL используются в качестве синхронных или асинхронных потоков чтения и записи. Это означает, что объекты могут использоваться с любым изread(),async_read(),write(),async_write(),read_until()илиasync_read_until().Свободные функции.
Повышаю. Asio предоставляет различные методы для настройки способа проверки SSL-сертификатов:
Для упрощения случаев использования, когда сертификаты проверяются в соответствии с правилами RFC 2818 (сертификатная верификации для HTTPS), нажмите. Asio обеспечивает обратный вызов многоразовой проверки в качестве функционального объекта:
Следующий пример показывает проверку сертификата удаленного хоста в соответствии с правилами, используемыми HTTPS:
using boost::asio::ip::tcp;
namespace ssl = boost::asio::ssl;
typedef ssl::stream<tcp::socket> ssl_socket;
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();
boost::asio::io_service io_service;
ssl_socket sock(io_service, ctx);
tcp::resolver resolver(io_service);
tcp::resolver::query query("host.name", "https");
boost::asio::connect(sock.lowest_layer(), resolver.resolve(query));
sock.lowest_layer().set_option(tcp::no_delay(true));
sock.set_verify_mode(ssl::verify_peer);
sock.set_verify_callback(ssl::rfc2818_verification("host.name"));
sock.handshake(ssl_socket::client);
Объекты потока SSL не выполняют собственную блокировку. Поэтому важно, чтобы все асинхронные операции SSL выполнялись в неявной или явнойнити. Обратите внимание, что это означает, что синхронизация не требуется (и поэтому не происходит блокировки накладных расходов) в однопоточных программах.
ssl::context,ssl::rfc2818_verification,ssl::stream,SSL example.
Для использования Boost требуется OpenSSL. Поддержка SSL Asio. Когда приложение должно использовать функцию OpenSSL, которая не обернута Boost. Азио, основные типы OpenSSL могут быть получены путем вызова<ssl::context::native_handle()
>или<ssl::stream::native_handle()
>.