2015-06-07 1 views
1

Я пытаюсь найти механизм отправки запроса на целевой сервер и когда сокет должен считывать данные, передайте сокет другому процессу для извлечения данных. Я до сих пор использовал epoll в Linux, чтобы реализовать его до такой степени, что я выполняю рукопожатие, я отправляю запрос и запрос, затем передаю сокет fd другому процессу для дальнейшей обработки, я явно сохраняю сеанс SSL используя PEM_write_bio_SSL_SESSION, а затем прочитайте его с помощью PEM_read_bio_SSL_SESSION и добавьте его в контекст, но я не могу прочитать ssl-сокет в другом процессе, потому что я получаю либо внутреннюю ошибку, либо отказ от подтверждения.Передача подключенного SSL-соединения на другой процесс

Я читал это article, но до сих пор не смог найти никакого механизма для его устранения. Я знаю, что это потому, что openssl - это библиотека уровня приложения, но должен быть способ, потому что Apache уже делает это.

По крайней мере, если это невозможно, существует ли способ расшифровать данные из сокета (который я могу читать нормально) с помощью мастер-ключа из сеанса openssl?

ответ

3

Единственный способ сделать это - клонирование полной части пространства пользователя сокета SSL, которое распространяется на несколько внутренних структур данных. Поскольку у вас нет доступа ко всем структурам из python, вы можете сделать это только путем клонирования процесса, т. Е. Использовать fork.

Обратите внимание, что после того, как вы разветвили процесс, вы должны продолжать работать только с SSL-сокетом в одном из процессов, то есть невозможно развить вилку, выполнить некоторую работу в дочернем элементе и затем выполнить некоторую работу в родительском обработать. Это невозможно, потому что, как только вы имеете дело с сокетом, состояние SSL изменяется, но только в одном из процессов. В другом процессе состояние выходит из строя, и попытки повторного использования этого неправильного состояния могут вызвать странные ошибки.

+0

Благодарим вас за ответ. Я надеюсь найти выход, чтобы не разветвлять этот процесс, потому что это очень дорого для того, что я делаю. Я понял суть, есть ли способ обмануть данные вручную с информацией, полученной из сеанса SSL? Я могу читать все зашифрованные данные из сокета. – purrogrammer

+0

Насколько я знаю, ваш единственный вариант - разветвить процесс. Сериализуется текущее состояние SSL, поэтому вы можете его перенести. Обратите внимание, что сеанс SSL не является внутренним состоянием SSL. –

+0

Вы правы, я просто повторно использовал сессию ssl, которая накладывает верх над рукопожатием, но это абсолютно не способ передать дескриптор сокета другому процессу. Я пробовал с posix-нитями, и он работает хорошо. Все еще пессимистично оценивает производительность и надеется получить более высокую производительность благодаря совместному планированию внутри pthreads. Мне интересно, как это делает Apache, я посмотрю на их реализацию. – purrogrammer