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

时间:2014-10-24 02:08:23

标签: python openssl

在启动与任何主机的TLS连接时,我发现了一个奇怪的问题。如果我没有在套接字上设置任何超时,它可以正常工作。如果我这样做,它会在超时前使用OpenSSL.SSL.WantReadError打破。例如,如果我将超时设置为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

1 个答案:

答案 0 :(得分:0)

解决方案:

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