Python HTTPServer SSL рукопожатие зависает для нестандартных портов - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть проблема, с которой я боролся уже несколько дней.

У меня есть простой ThreadedHTTPServer over SSL, который обслуживает небольшое количество запросов, поступающих в течение дня.

Каждые случайные 10 или около того соединений серверный поток зависает (у меня есть запланированный поток, который работает параллельно с серверным потоком, но он продолжает работать нормально, пока серверный поток зависает).

Когда он завис, я не могу получить больше, чем Client Hello при SSL-рукопожатии при попытке соединения с клиентом openssl.

openssl s_client -connect HOST:7813 -prexit

Вещи, которые я пробовал:

  1. Я подумал, что, возможно, установление тайм-аута на соединениях поможет, но не сигара ... да, это приведет к истечению времени ожидания установившихся соединений, но если повесить рукопожатие, это не даст никакого эффекта.

Как:

class ForeMan(BaseHTTPRequestHandler):
     def setup(self): 
       self.request.settimeout(1) # no

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):

   def get_request(self): #no
      ...
      sock.settimeout(1)

   def server_bind(self):#no
       ....
       self.socket.settimeout(1)
  1. Отключить разрешение DNS, выполняемое BaseHTTPRequestHandler, путем переопределения функции address_string () ... возможно, немного помогло, если разрешение DNS было по какой-то причине запаздывающим, но не решало зависание рукопожатия SSL

  2. Я пытался проверить, возможно ли, что используются версии TLS, но разные завитки с --tlv1.x не привели к зависанию. Это происходило только случайным образом, и когда определенные клиенты браузера делали запрос.

  3. Изменение порта для HTTPServer на 443 вместо 7813. Я искал максимум и минимум, но ничего из того, что я видел в билетах, не подразумевало, что это может быть проблемой. Полагаю, единственное, что я заметил, было то, что яростно указано, что http.server для python не должен использоваться для производства ...

Разрешение

Ничего из вышеперечисленного не сработало. На данный момент самый простой подход состоит в том, чтобы не давать Python ответственности за обработку SSL-соединений и делегирование этого Nginx.

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