Итак, вот моя дилемма: я работаю над механизмом самообновления в C ++ и не могу понять, как заставить OpenSSL принять сокет int, который уже был инициализирован в предыдущей версии, и пересмотреть соединение.
я пробовал SSL_connect()
на случай, если это снова сработает, SSL_renegotiate
а также SSL_do_handshake()
, но я ничего не могу заставить работать.
Я думаю, это потому, что OpenSSL не знает, что сокет уже настроен как TLS, но как мне это сказать?
Таким образом, я пытаюсь восстановить соединение TLS после наследования необработанного дескриптора сокета ‘int’ из предыдущей версии той же программы через функцию exec * ().
Благодарю.
Если ваша платформа Linux: Начиная с Linux 4.13, можно выполнять TLS в пространстве ядра. Если вы переключитесь на этот механизм, состояние SSL будет храниться в сокете в пространстве ядра, поэтому вы можете обращаться с дескриптором файла так, как если бы это было незашифрованное соединение; особенно вы можете использовать его в своем дочернем процессе без дополнительных усилий.
Увидеть Документация ядра TLS для дополнительной информации.
Установленный SSL в сокете OpenSSL содержит состояние SSL в пользовательском пространстве. При выполнении exec
это состояние теряется, так как предыдущий процесс и его память заменяются новым. Хотя теоретически можно было бы каким-то образом сериализовать полное состояние SSL в одном процессе и десериализовать его в новом процессе, я не думаю, что существует API OpenSSL, который делает это. И, вероятно, это также может быть сделано не просто путем сохранения и восстановления некоторого блока памяти, но, вероятно, зависит от текущей структуры памяти процесса, которая отличается от новой.
Обычный способ обработки существующего состояния SSL новым процессом — это не exec
новый процесс, но вместо fork
существующий процесс и exec
новый как дочерний, а затем передать данные из дочернего процесса с помощью исходного (родительского) процесса, который все еще имеет установленное состояние SSL.
Другим способом было бы явно отключить сеанс SSL с SSL_shutdown
прежде чем делать exec
и создание нового сеанса SSL на том же TCP-соединении с SSL_connect
в новом процессе. Конечно, для этого требуется своего рода переход на обычный TCP, а для обновления до TLS также требуется поддержка на другом конце TCP-соединения.