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
解决方案:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(1)