Проблема при использовании sendfile () с SSL - PullRequest
0 голосов
/ 11 июня 2018

Я следовал ответам, данным в Преврати простой сокет в сокет SSL , чтобы написать простой веб-сервер на C с SSL.Это прекрасно работает, когда я использую SSL_write ().Но когда я использую системный вызов sendfile () на моем сервере и использую firefox для доступа к странице, firefox выдает следующую ошибку

Secure Connection Failed
An error occurred during a connection to localhost:16000. SSL received a record that exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG

Когда я отправляю содержимое html-страницы с помощью SSL_write (), содержимоеотображается в браузере без проблем.Но проблема возникает, когда я использую sendfile ().Итак, насколько я понимаю, sendfile () вызывает эту ошибку.

Я хочу отправить содержимое файла непосредственно в сокет (например, HTML-страница, изображение и т. Д.).Может кто-нибудь сказать мне, что я могу сделать, чтобы исправить эту ошибку и использовать sendfile ()?Или есть альтернатива для sendfile (), которую я могу использовать с SSL?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

У вас есть выход, чтобы использовать sendfile с openssl .. скомпилировать openSSL с поддержкой ktls (предоставьте опцию enable-ktls для ./config).Это должно работать на любом ядре Linux после 4.13.

Затем скомпилируйте ваше приложение с только что созданным openssl.Вы должны быть в состоянии использовать sendfile с SSL, и он должен работать как шарм.

0 голосов
/ 11 июня 2018

В OpenSSL состояние SSL сохраняется в пространстве пользователя, а SSL_write будет шифровать данные на основе этого состояния и обновлять состояние, помещать зашифрованные данные в запись SSL и затем записывать эту запись SSL в дескриптор файла.Использование sendfile просто обходит все это и записывает обычные незашифрованные данные непосредственно в дескриптор файла, так же, как и простой write вместо SSL_write.Это приводит к тому, что узел получает простые данные без контейнера записей SSL.Пир попытается интерпретировать эти данные как запись SSL и потерпит неудачу со странными ошибками, подобными той, которую вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...