Nano Hash - криптовалюты, майнинг, программирование

Как программно перенаправить вывод программы на сокет SSL

Предположим, у меня клиент-серверная архитектура. Клиент взаимодействует с сервером через защищенное соединение SSL TCP. И клиент, и сервер используют для связи SSL_write и SSL_read.

Затем сервер использует fork и запускается в дочерней ветке close(STDOUT_FILENO) dup(ssl_socket_from_client) execvp(...) .

По сути, вывод программы будет попадать в сокет, но будет ли он зашифрован, и как мне убедиться, что все, что идет в этот сокет, использует ту же процедуру записи, что и с SSL_write?

заранее спасибо


Ответы:


1

Текущее состояние сокета SSL в большинстве случаев (например, с OpenSSL) хранится в пользовательском пространстве. При разветвлении это состояние дублируется в дочернем. Но после exec это дублированное состояние отбрасывается. Это означает, что исполняемый процесс имеет доступ только к простому файловому дескриптору уровня ядра, но не к состоянию SSL, которое необходимо для передачи зашифрованного трафика через этот файловый дескриптор.

Поэтому простой форк и exec не будут работать с сокетами SSL. Вместо этого родительский процесс исполняемого процесса должен сам обрабатывать все SSL, т.е. читать и расшифровывать данные из сокета SSL и предоставлять исполняемому процессу простые данные и читать простые данные из исполняемого процесса, а также шифровать и пересылать эти данные через SSL-сокет. Связь с исполняемым процессом может осуществляться, например, с помощью двух каналов или одной пары сокетов. Или как грубая визуализация:

TLS server <--SSL socket--> Parent <--plain socketpair/pipes--> Child

Связанные проблемы см. в разделе Общий доступ к сокету SSL с дочерним процессом или HTTPS-сервер Python3 CGI не работает в Unix.

01.01.2018
  • Итак, между родителем и дочерним элементом должен быть создан еще один сокет. Дочерний элемент будет сбрасывать свой вывод во вновь созданный сокет, а затем родитель будет использовать SSL_write для ответа. Теперь это имеет больше смысла, спасибо 01.01.2018
  • Другой вопрос: как реализовать перенаправление stdin? Что, если сервер запускает команду, ожидающую ввода от клиента? С новым уровнем сокетов я понятия не имею, когда читать и когда писать в каналы. В этом случае возможна ли блокировка SSL_read и SSL_write? 01.01.2018
  • @DenisRozimovschii: это как-то связанный, но все же новый вопрос, поэтому его не следует задавать в комментарии. Я рекомендую взглянуть на pipe или socketpair, чтобы создать необходимые файловые дескрипторы, использовать dup или dup2 для сопоставления stdin/stdout с этими fd в дочернем элементе и использовать select, poll, kqueue или что-то еще, что предлагает ваша ОС, чтобы узнать, когда данные могут быть считываться из одного fd (ssl или обычный) и перенаправляться на другой fd (обычный или ssl). Вероятно, вы могли бы также использовать потоки, если вам менее комфортно программировать, управляемое событиями. 01.01.2018
  • Я реализовал вещи, связанные с парой сокетов, но я не знал об опросе и событиях в дескрипторах. Теперь, когда я это сделаю, я буду прогрессировать. Спасибо. Кроме того, я чувствовал, что в этом вопросе и комментариях слишком много контекста, поэтому начинать новый было бы пустой тратой времени. 01.01.2018
  • Я создал отдельный вопрос, следуя вашему совету в клиент-серверном приложении"> stackoverflow.com/questions/48084446/ 03.01.2018
  • Какой механизм заставляет дублированное состояние отбрасываться? Если я понимаю этот вопрос, состояние должно быть сохранено в родительском и дочернем элементах. 04.01.2018
  • @JamesKPolk: состояние копируется при выполнении форка. Память пользовательского пространства процесса заменяется (и, таким образом, неявно существующая информация о состоянии отбрасывается) при выполнении в execv замены текущего процесса другим. 04.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..