import ssl, socket, threading, sys, tempfile, atexit, os cert = b"""-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCVJFDRSGgnfCWC +D/9G6YyvMd7+9dtLKdE/pXBNHF9B2+fxZzugznWMqnmd6CBymSZgXj5OdxIZo27 vbQgoBWUeMh+maYrIlYi9ZObKhRKJrZbm3ACk1xZ3K2s9QGsQ0mo91RLsKHy9fCt lv3BNmNXNT/JDgU3bqrcWxKVDKfWGU7hiRUDANHGx/Rz+5J0sfF99D0FGAgA46cE ihpTJQhpiSkkecVXzipwfTJ2lGUc9PKqJr317XfI46KQ0PjSdgb8IEt59uF0BaPy oTBk9y7lmXBR4WpH4uLH2Jqk/17q/YFT05Kq263oVOrBAmRS6a2e90k0W30Js+Pv EY8rcU/PAgMBAAECggEBAIJ6mxn9tuGUg1zpw1G09to8vmmCEx64ij6aXHoDX6Z6 8vVc9cbVl6wF9w5ialIit5B07VldfZL55dXySbyhUT/ry7y2v+HM0H8VSmXdkpKs +615d61JLuqPXoKKd0Q2OiNQ/raZeZYOBNpZ1vdKle6d74f+dCHi+CiApOkxgUSU 2b8NDkvhku13KPyG8604WEkv4sIcfhFJA8DotLVq49KlGJ4dRzMBmyVxmEJX12P0 OnDnIx9CGWdEzxVY7Q43XXNh7UvWn7e58Im0PoipM671rphLQKeUkTACzcasDepl pRDe8gdZzsLOayzXb0g+641QHLXGksGhvu5xp0xbOkECgYEAxFBV7GH+puQrAhGd pb0+uKfQXwfpskgPdXU6+VnQ+8DFMXaKiDnTz4mV+GiFsmGaepeQHjwC/4VuZck8 2sDEG2KZBK7qr940i9dm3y027iPzy326kVbeDqjSDrcJXB7WsLdBh8ZW+oeryrsm StCGvC363mnlNR+4hvY5qtfsC+0CgYEAwnxzyWWt6TzLfvV1iMFl1qMq/k5WqT5a At26jBq6Rb/oUK1xoEXD/6S636rmeHTvPzhodOfvSfcZH/HMeMOg7/H43FwWCU0e 47nDqCL2q3L8s+AlKhVAJ6XrX8YgNess/ykSeeFJV/yx68lpPmikE/+rCiTaVAWb xqD4qBOkqysCgYBYVtpDc9l22kfsN2ccdOtrhsCCcvobqseiEG3IVT1wfE+AMZqn MHZ69qvQy6AWJEuyjM9ie5jRyQZjsUm8GnBk7lpzPA8JstEseHKnTR5hzTXgxSQW UOO97wQPcRg6JvpvLRfE9GChfjm1EcBqfCmVNo+kVDy7ShnsSZKrqVxkBQKBgAdw kVFT9WolrDcoFp3roASs6zkdMA17WCAh8T/oydVfOPjVGbKi2JOP7qIdvIFBH+HQ O5a1RJ8Ut75UFplMCn0DSZzMXP9wFs1pTsXAyKTYWjhbS7CnbXPW0gEw6AyH+Ymt PYqyBoc6IGg/pSoBAL3PGvDhZgSuzj2z7K8pSTRPAoGAQT/nHCbKpzeGgoCDeM7a 0IDTbFcnLAXUq/BFb5qyCbYFgsxZibRrpmbHFtcaJTq5DyHNvqzJNktH/0hngt0Y wDEDcG3s+/2KARdxB9htdMI/KcqVSiJEJ2fQpuZ8V3v9yN6IENskwFr8HMGKQ1Ef gAfh34mzovQn7yGCz1IyjKI= -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJAIOg5T8j3GG0MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX aWRnaXRzIFB0eSBMdGQwHhcNMTgwMzE2MTc0OTAwWhcNMTkwMzE2MTc0OTAwWjBF MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50 ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB CgKCAQEAlSRQ0UhoJ3wlgvg//RumMrzHe/vXbSynRP6VwTRxfQdvn8Wc7oM51jKp 5neggcpkmYF4+TncSGaNu720IKAVlHjIfpmmKyJWIvWTmyoUSia2W5twApNcWdyt rPUBrENJqPdUS7Ch8vXwrZb9wTZjVzU/yQ4FN26q3FsSlQyn1hlO4YkVAwDRxsf0 c/uSdLHxffQ9BRgIAOOnBIoaUyUIaYkpJHnFV84qcH0ydpRlHPTyqia99e13yOOi kND40nYG/CBLefbhdAWj8qEwZPcu5ZlwUeFqR+Lix9iapP9e6v2BU9OSqtut6FTq wQJkUumtnvdJNFt9CbPj7xGPK3FPzwIDAQABo1AwTjAdBgNVHQ4EFgQU0fraJe3C po/ooAmwoicobiREue4wHwYDVR0jBBgwFoAU0fraJe3Cpo/ooAmwoicobiREue4w DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEANT+XIhOWxc9mxcYIzGvz w9s2BpfXiYahFj7lKf8aPvExLnroME99JqpsJJWAkoNkaW/8EVX0qfD+6/EbHpnp xLlgff3RS3hexGBnmq1Lf/Ml4e7LhucGXIQnnSvtSEJhWBREDf/w3U2imjisUp+1 T7NabaMZ/HaoEa5CLEfe6KP1EjgaMbfHjwU9ulKBOlPzrDFy7G0z3IhFoymNlqhu Ba7A3m5lSNhdG4NvaevROV4nPGiXEv4pESbJppXR4tDTSsoy/kl5yKDZJR0g+6Ip mvxLEIwFZbY5+nOOJBGzrYleMOCQvOWil6aaIdtRdHcJXS7Icfzqo28jJBt/PQBP WA== -----END CERTIFICATE-----""" fd, certfile = tempfile.mkstemp(".pem") atexit.register(lambda *args: os.unlink(certfile)) os.write(fd, cert) os.close(fd) # ----------- server ----------- ssocket = socket.socket() ssocket.bind(('localhost', 0)) ssocket.listen(5) ssocket = ssl.wrap_socket(ssocket, certfile=certfile, server_side=True) def deal_with_client(connstream): data = connstream.read() while data: connstream.write(data) data = connstream.read() def server_thread(): newsocket, fromaddr = ssocket.accept() print("Got connection from %s" % (fromaddr,)) try: deal_with_client(newsocket) except Exception: sys.excepthook(*sys.exc_info()) print("Closed connection from %s" % (fromaddr,)) t = threading.Thread(target=server_thread, name="ServerThread") t.daemon = True t.start() # ----------- client ----------- csocket = ssl.wrap_socket(socket.create_connection(ssocket.getsockname())) csocket.settimeout(10) def write_thread(): while 1: csocket.send(b'blah') def read_thread(): while 1: csocket.recv() sys.stderr.write('.') sys.stderr.flush() t = threading.Thread(target=write_thread, name="WriteThread") t.daemon = True t.start() t = threading.Thread(target=read_thread, name="ReadThread") t.daemon = True t.start() t.join(5)