Setting socket timeouts breaks handshake
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 944
- Forks
- 440
- Avg merge
- 1d 6h
- Merged PRs (30d)
- 6
Description
I'm seeing a weird issue when starting a TLS connection to any host. If I don't set any timeout on the socket, it works fine. If I do, it breaks before the handshake with a OpenSSL.SSL.WantReadError. For example if I set timeout to 100, it will break after a second anyway.
For now I use a workaround of setting a timeout on connection, but then removing it before the handshake.
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) # the workaround
try:
conn.do_handshake()
except OpenSSL.SSL.WantReadError:
# this happens on every connection
I'm running on Python 3.4.1, OpenSSL 0.14.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the socket-timeout reproducer in the issue and inspect OpenSSL.SSL.Connection.connect() and do_handshake() behavior when the underlying socket has a timeout. Compare it with the documented workaround that removes the timeout before the handshake. Done means a TLS handshake succeeds without requiring that workaround while preserving timeout behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- networking, security
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100