我有一个用 Python 编写的 HTTP 客户端,它需要使用 TLS。我不仅需要
进行加密连接,还可以从
远程机器,例如证书颁发者。我需要做
连接到许多 HTTP 服务器,通常表现不佳,所以我绝对
需要超时。对于非 TLS 连接,
mysocket.settimeout(5)
做我想做的事。
在众多 TLS Python 模块中:
python-gnutls不允许在套接字上使用 settimeout() 因为 它使用非阻塞套接字:
gnutls.errors.OperationWouldBlock: Function was interrupted.
python-openssl有类似的问题:
OpenSSL.SSL.WantReadError
SSL module标准库不适用于 Python 2.5.
其他库,如 TLSlite显然不允许访问 证书的元数据。
程序是线程化的,所以我不能使用信号。我需要详细的 控制 HTTP 对话框,所以我不能使用像 urllib2 这样的标准库。
背景:这是 调查项目DNSwitness .相关的 SO 线程:Timeout on a Python function call和 How to limit execution time of a function call in Python .
最佳答案
虽然我从来没有将它用于这个目的,Twisted应该做你想做的。唯一的缺点是它是一个相当大的库,您还需要安装 PyOpenSSL (扭曲取决于它)。如果您以前从未使用过它,Twisted 的基于回调的架构可能需要一些时间来适应(您真的想在开始之前阅读教程)。
但除此之外,它是围绕管理大量连接的想法设计的,它当然允许您指定超时、重新连接等,并且您可以检索证书信息(参见 here)。
关于python - TLS 连接超时(以及其他一些困难),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/675130/