首页 > 解决方案 > 非标准端口的 Python HTTPServer SSL 握手挂起

问题描述

我有一个问题,我已经挣扎了几天了。

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

每个随机 10 个左右的连接,服务器线程都会挂起(我有一个与服务器线程并行运行的计划线程,但在服务器线程挂起时继续正常运行)。

当它挂起时,在尝试与 openssl 客户端连接时,我无法比 SSL 握手的 Client Hello 更进一步。

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。我搜索了高低,但我在任何票证中都没有看到暗示这可能是一个问题。我想我唯一注意到的是,它强烈表明 http.server for python 不应该用于生产......

解析度

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

标签: pythonsslfreezehandshake

解决方案


推荐阅读