Как справиться с преждевременным закрытием SSL-соединения - PullRequest
0 голосов
/ 08 декабря 2010

Я пишу прокси-сервер, который прокси-соединения SSL, и все это прекрасно работает для нормального трафика. Однако, когда происходит большая передача файла (что-нибудь более 20 КБ), например, вложение электронной почты, тогда соединение сбрасывается на уровне TCP, прежде чем файл будет завершен при записи. Я использую неблокирующий ввод-вывод и порождаю поток для каждого конкретного соединения.

Когда приходит соединение, я делаю следующее:

  • порождение темы
  • Подключение к клиенту (незашифрованное) и чтение запроса на подключение (все остальные запросы игнорируются)
  • Создание безопасного соединения (SSL с использованием OpenSSL API) к серверу
  • Сообщите клиенту, что мы связались с сервером (в незашифрованном виде)
  • Создайте безопасное соединение с клиентом и начните проксировать данные между ними, используя цикл выбора, чтобы определить, когда может произойти чтение и запись
  • Как только нижележащие сокеты закрываются или возникает ошибка, соединение закрывается и поток прерывается.

Как я уже сказал, это прекрасно работает для данных нормального размера (обычные веб-страницы и т. Д.), Но происходит сбой, как только файл становится слишком большим с кодом ошибки (в зависимости от используемого веб-приложения) или ошибкой: соединение Прерванный.

Я понятия не имею, что вызывает закрытие соединения, является ли это чем-то специфичным для TCP, HTTP или SSL, и я вообще не могу найти никакой информации об этом. В некоторых браузерах он начнет работать, если я добавлю оператор сна сразу после SSL_write, но, похоже, это вызывает другие проблемы в других браузерах. Сон не должен быть длинным, просто задержка. В настоящее время у меня установлено значение 4 мс на запись и 2 мс на чтение, и это полностью исправляет это в старых версиях Firefox, Chrome с загрузкой HTTP и Opera.

Буду признателен за любые предложения, и дайте мне знать, если вам нужна дополнительная информация. Спасибо заранее!

-Sam

1 Ответ

0 голосов
/ 08 декабря 2010

Если веб-приложение считает загруженный файл слишком большим, что оно делает? Если он имеет право просто закрыть соединение, это вызовет ECONN у отправителя: «сброс соединения». Что бы это ни делало, когда вы пишете прокси-сервер и предполагаете, что в вашем коде нет ошибок, вызывающих это, ваша миссия состоит в том, чтобы отразить все, что происходит с вашим восходящим соединением, вниз по нисходящему соединению. В этом случае ответ заключается в том, чтобы просто делать то, что вы делаете: закрыть входной и выходной сокеты. Если вы получили входящее close_notify с сервера, сделайте правильный SSL близко к клиенту; если вы получили ECONN, просто закройте клиентский сокет напрямую, минуя SSL.

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