Использование OpenSSL TLS с или без BIO? - PullRequest
1 голос
/ 14 июня 2019

Я много читал об OpenSSL, в частности, API TLS и DTLS. Большинство из них имеет смысл, это довольно интуитивно понятный API, как только вы его понимаете. Одна вещь действительно заставила меня почесать голову, хотя ...

Когда / зачем мне использовать BIO?

Например, эта вики-страница демонстрирует настройку базового TLS-сервера. В этом примере нет даже упоминаний БИО.

Теперь эта страница Использует исключительно BIO, никогда не используя функции чтения и записи структуры SSL. Конечно, это с 2013 года, но это не единственный, который использует BIO.

Чтобы еще больше сбить с толку эта справочная страница предполагает, что структура SSL имеет "базовую BIO" , при этом даже не требуется устанавливать ее явно .

Так зачем мне использовать BIO, если я могу избежать использования SSL_read() и SSL_write()? Каковы преимущества? Почему некоторые примеры используют BIO, а другие нет? Какова скорость воздушной скорости порожней ласточки?

Ответы [ 2 ]

1 голос
/ 14 июня 2019

БИО всегда есть, но они могут быть скрыты более простым интерфейсом.Непосредственное использование интерфейса BIO полезно, если вы хотите больше контроля - с большими усилиями.Если вы просто хотите использовать TLS на сокете TCP, тогда достаточно простого интерфейса.Если вы вместо этого хотите использовать TLS на своем собственном транспортном уровне или если вы хотите лучше контролировать его взаимодействие с транспортным уровнем, вам понадобится BIO.

Примером такого варианта использования является это предложение , где TLS туннелируется как JSON внутри HTTPS, то есть кадры TLS кодируются в JSON и затем передаются с использованием запросов и ответов POST.Это может быть достигнуто путем обработки TLS с BIO памяти, которые затем кодируются и декодируются из JSON.

0 голосов
/ 14 июня 2019

Во-первых, ваш вопрос не очень ясен.SSL является (typedef для) структурным типом C, и вы не можете использовать оператор точки для структурного типа в C, только для экземпляра.Даже если предположить, что вы имели в виду «экземпляр SSL», как это иногда делают люди, в более старых версиях (через 1.0.2) он не имел членов read и write, а в версии 1.1.0 он непрозрачен -- вы даже не знаете, каковы его члены.

Во-вторых, есть два разных уровня использования BIO, применимых к библиотеке SSL.Соединение SSL / TLS (представленное объектом SSL плюс некоторые связанные с ним связанные вещи, такие как сеанс) всегда использует два BIO для отправки и получения данных протокола, соответственно, включая данные протокола, содержащие данные приложения, которые вы отправляете с помощьюSSL_write и получение с SSL_read, а также рукопожатие SSL / TLS, которое обрабатывается в библиотеке.Как и Штеффен описывает , они оба обычно устанавливаются на BIO сокета, который отправляет и получает от соответствующего процесса удаленного хоста, но вместо этого они могут быть установлены на BIO, которые делают что-то другое между ними, илидаже вместо.(Этот нормальный случай автоматически создается с помощью SSL_set_{,r,w}fd, что следует отметить, что в Windows фактически используется дескриптор сокета, но не любой другой дескриптор файла; только в Unix дескрипторы сокетов частично взаимозаменяемы с файловыми дескрипторами.)

Отдельно само соединение SSL / TLS можно «обернуть» в ssl-BIO.Это позволяет приложению обрабатывать SSL / TLS-соединение, используя в основном те же вызовы API, что и обычное TCP-соединение (с использованием BIO-сокета) или локальный файл, а также предоставленные «фильтрующие» BIO, такие как BEST-дайджест (md).или BIO кодирования / декодирования base64, и любые дополнительные BIO, которые вы добавляете.Это касается веб-страницы IBM, на которую вы ссылаетесь (для клиента, а не для сервера).Это похоже на философию Unix «все (в основном) файл», где, например, служебная программа grep, просто вызывая read на fd 0, может искать данные из файла, терминала, канала издругая программа или (если она запущена в inetd или подобном) из удаленной системы, использующей TCP (но не SSL / TLS, потому что этого нет в ОС).Я не сталкивался со многими случаями, когда особенно полезно иметь возможность легко обмениваться данными SSL / TLS с каким-либо другим типом источника / приемника, но OpenSSL предоставляет такую ​​возможность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...