使用超时时Python OpenSSL连接握手失败

使用超时时Python OpenSSL连接握手失败,python,openssl,Python,Openssl,当启动与任何主机的TLS连接时,我发现一个奇怪的问题。如果我不在套接字上设置任何超时,它就可以正常工作。如果我这样做,它会在超时之前以OpenSSL.SSL.WantReadError的形式中断。例如,如果我将timeout设置为100,它将在一秒钟后中断 目前,我使用的解决方法是设置连接超时,然后在握手之前将其删除。我如何修复此问题以尊重超时 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2) ctx =

当启动与任何主机的TLS连接时,我发现一个奇怪的问题。如果我不在套接字上设置任何超时,它就可以正常工作。如果我这样做,它会在超时之前以
OpenSSL.SSL.WantReadError
的形式中断。例如,如果我将timeout设置为100,它将在一秒钟后中断

目前,我使用的解决方法是设置连接超时,然后在握手之前将其删除。我如何修复此问题以尊重超时

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)

ctx = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD)
ctx.set_options(OpenSSL.SSL.OP_NO_SSLv2 | OpenSSL.SSL.OP_NO_SSLv3)
ctx.set_verify(OpenSSL.SSL.VERIFY_NONE, lambda _a, _b, _c, _d, _e: None)
conn = OpenSSL.SSL.Connection(ctx, s)
conn.set_tlsext_host_name(hostname.encode('utf-8'))
conn.connect((ip, port))

s.settimeout(None)

try:
    conn.do_handshake()
except OpenSSL.SSL.WantReadError:
    # this happens on every connection
解决方案:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(1)

如果设置conn.setblocking(1),会发生什么情况?查看此项了解详细信息answer@SreekumarR这在这里似乎没有意义。从文档中:
s.setblocking(1)相当于s.settimeout(无)
。这不是我需要的。还要检查中的错误。在调用do_handshake()之前,请尝试使用select()确保它是可写的。您遇到了一个已知的Python+OpenSSL错误:虽然这段代码可能会回答这个问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期值。默认情况下,套接字是阻塞的。同样来自文档:
setblocking(True)相当于settimeout(None)
-我确实想要超时。