非标准端口的Python HTTPServer SSL握手挂起

时间:2018-11-05 15:44:39

标签: python ssl hang handshake

我有一个问题已经困扰了几天。

我有一个基于SSL的简单ThreadedHTTPServer,它可以为一天中出现的少量请求提供服务。

每随机10个左右的连接,服务器线程就会挂起(我有一个调度的线程与服务器线程并行运行,但是在服务器线程挂起时仍可以正常运行)。

当挂起时,尝试与openssl客户端连接时,我无法超越SSL握手的“客户端问候”。

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. 通过重写address_string()函数来禁用由BaseHTTPRequestHandler执行的DNS解析...如果由于某种原因DNS解析比较滞后但未解决SSL握手挂起问题,可能会有所帮助

  2. 我试图检查是否使用的是TLS版本,但使用--tlv1.x进行的卷发并没有导致挂起。它只是在某些浏览器客户端发出请求时才随机发生。

  3. 将HTTPServer的端口更改为443而不是7813。我已经搜索过高和低,但是在任何票证中都没有看到任何内容暗示这可能是一个问题。我想我唯一要注意的是,它强烈指示不应将python的http.server用于生产...

解决方案

以上方法均无效。目前,最简单的方法是不让Python负责处理SSL连接并将其委托给Nginx。

0 个答案:

没有答案