OpenSSL C API: Как возобновить соединение TLS после выполнения программы exec ()?

Итак, вот моя дилемма: я работаю над механизмом самообновления в C ++ и не могу понять, как заставить OpenSSL принять сокет int, который уже был инициализирован в предыдущей версии, и пересмотреть соединение.
я пробовал SSL_connect() на случай, если это снова сработает, SSL_renegotiate а также SSL_do_handshake(), но я ничего не могу заставить работать.

Я думаю, это потому, что OpenSSL не знает, что сокет уже настроен как TLS, но как мне это сказать?

Таким образом, я пытаюсь восстановить соединение TLS после наследования необработанного дескриптора сокета ‘int’ из предыдущей версии той же программы через функцию exec * ().

Благодарю.

1

Решение

Если ваша платформа Linux: Начиная с Linux 4.13, можно выполнять TLS в пространстве ядра. Если вы переключитесь на этот механизм, состояние SSL будет храниться в сокете в пространстве ядра, поэтому вы можете обращаться с дескриптором файла так, как если бы это было незашифрованное соединение; особенно вы можете использовать его в своем дочернем процессе без дополнительных усилий.

Увидеть Документация ядра TLS для дополнительной информации.

1

Другие решения

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

Обычный способ обработки существующего состояния SSL новым процессом — это не exec новый процесс, но вместо fork существующий процесс и exec новый как дочерний, а затем передать данные из дочернего процесса с помощью исходного (родительского) процесса, который все еще имеет установленное состояние SSL.

Другим способом было бы явно отключить сеанс SSL с SSL_shutdown прежде чем делать exec и создание нового сеанса SSL на том же TCP-соединении с SSL_connect в новом процессе. Конечно, для этого требуется своего рода переход на обычный TCP, а для обновления до TLS также требуется поддержка на другом конце TCP-соединения.

1

По вопросам рекламы [email protected]