from __future__ import print_function import OpenSSL import pyuv import uvtls import signal import sys def shutdown_cb(handle, error): if not handle.closed: # Handle may already be closed if the remote didn't shutdown TLS # properly and cut the TCP connection instead handle.close() connections.remove(handle) def read_cb(handle, data, error): if error is not None: print("Read error: {}".format(pyuv.errno.strerror(error))) handle.close() return handle.write(data) print("Received data: {}".format(data)) if data.strip() == b'exit': handle.shutdown(shutdown_cb) def connection_cb(handle, error): if error is not None: print("Connection error: {}".format(pyuv.errno.strerror(error))) return tls_h = uvtls.TLS(loop) server.accept(tls_h) print("New connection from {}".format(tls_h.getpeername())) tls_h.start_read(read_cb) connections.append(tls_h) def signal_cb(handle, signum): signal_h.close() [c.close() for c in connections] server.close() connections = [] loop = pyuv.Loop.default_loop() ca = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open('CA.cert', 'r').read()) cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open('server.cert', 'r').read()) key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open('server.pkey', 'r').read()) server = uvtls.TLS(loop, cert=cert, key=key, ca_list=[ca]) server.bind(('127.0.0.1', int(sys.argv[1]))) server.listen(connection_cb) print("Listening on {}".format(server.getsockname())) signal_h = pyuv.Signal(loop) signal_h.unref() signal_h.start(signal_cb, signal.SIGINT) loop.run()