Я использую библиотеку openssl, чтобы открыть соединение TLS с некоторым сервером. Читая документацию библиотеки (да, некоторые люди все еще читают документацию и справочные страницы), я наткнулся на предложение «SSL_libary_init () is not реентерабельность".
Я понимаю, в общем, что такое нереентерабельная функция: то есть некоторая функция, которая сохраняет внутреннее состояние таким образом, что вызов ее дважды в одно и то же время или ее прерывание во время выполнения может вызвать хаос (функция не выполняет то, что ожидают вызывающие абоненты) .
Но в конкретном случае SSL_library_init () мне интересно, что это на самом деле означает.
Означает ли это, что если при вызове SSL_library_init () произойдет какое-то прерывание, оно не будет правильно инициализировать библиотеку SSL? Следовательно, я должен отключить все доступные прерывания перед его вызовом и снова включить необходимые в дальнейшем?
означает ли это, что поток небезопасен, и что я должен убедиться, что два потока не могут вызывать его одновременно? (выглядит вероятным, даже если безопасность потоков не означает то же самое, что и реентерабельность).
Означает ли это, что я не должен вызывать его два раза за время существования программы, или что вызов его при открытых соединениях SSL приведет к разрушению?
Поскольку я работаю над прокси-сервером, один конец которого является клиентом, а другой - сервером, оба конца потенциально могут использовать службы TLS (но я также мог быть только одним концом или ни одним). Должен ли я управлять библиотекой SSL как общесистемным синглтоном? Если это так, им достаточно легко управлять, но это не совсем проблема повторного входа, как я понимаю это слово.
Я не знаю короткого слова для функции, которую следует вызывать только один раз ...
У меня тоже есть аналогичный вопрос для SSL_CTX_new (). В документации указано, что его следует вызывать только один раз за время существования программы. Это раздражает, поскольку кажется, что сервер и клиент (или несколько независимых экземпляров сервера или клиента, работающие в одном процессе) ограничиваются использованием одного и того же SSL_METHOD, и это кажется неправильным, но я все же надеюсь, что в этом случае это просто некоторая неточность документации .
Есть ли у кого-нибудь достаточно опыта работы с openSSL, чтобы объяснить, что я должен или не должен делать с кодом инициализации OpenSSL, чтобы оставаться в безопасности?
main
и покончить с ней (так что вам не нужно беспокоиться о безопасности потоков или повторном входе!).SSL_CTX_new
также звучит так, как будто он инициализирует глобальные переменные, поэтому его многократный вызов ничего не дает (кроме, возможно, утечки памяти). Опять же, я не знаю SSL, так что это все лишь предположения. - person Shahbaz   schedule 28.03.2013SSL_CTX *
, я подозреваю, что это нормально, если вы вызовете его несколько раз; Вы получите несколько контекстов. Он говорит, что один раз за время жизни программы, вероятно, потому что они не подозревали, что кто-то захочет иметь несколько контекстов в одной программе, поэтому они говорят, что одного достаточно (не то, чтобы больше было вредно). Вы можете получить лучшее представление, если спросите в их списке рассылки (если он у них есть) или посмотрите исходный код. - person Shahbaz   schedule 29.03.2013