'Initialize a TSSLSocket
@param validate(bool)       Set to False to disable SSL certificate
validation and hostname validation. Default enabled.
@param cafile(str)          Path to a file of concatenated CA
certificates in PEM format.
@param capath(str)           path to a directory containing several CA
certificates in PEM format, following an OpenSSL specific layout.
@param certfile(str)        The certfile string must be the path to a
single file in PEM format containing the certificate as well as
any number of CA certificates needed to establish the
certificateâs authenticity.
@param keyfile(str)         The keyfile string, if not present,
the private key will be taken from certfile as well.
@param ciphers(list<str>)   The cipher suites to allow
@param ssl_context(SSLContext)  Customize the SSLContext, can be used
to persist SSLContext object. Caution it\'s easy to get wrong, only
use if you know what you\'re doing.
The `host` must be the same with server if validate enabled.'

def __init__(self, host, port, socket_family=socket.AF_INET, socket_timeout=3000, connect_timeout=None, ssl_context=None, validate=True, cafile=None, capath=None, certfile=None, keyfile=None, ciphers=DEFAULT_CIPHERS):

    super(TSSLSocket, self).__init__(host=host, port=port, socket_family=socket_family, connect_timeout=connect_timeout, socket_timeout=socket_timeout)
    if ssl_context:
        self.ssl_context = ssl_context
    else:
        self.ssl_context = create_thriftpy_context(server_side=False, ciphers=ciphers)
        if (cafile or capath):
            self.ssl_context.load_verify_locations(cafile=cafile, capath=capath)
        if certfile:
            self.ssl_context.load_cert_chain(certfile, keyfile=keyfile)
        if (not validate):
            self.ssl_context.check_hostname = False
            self.ssl_context.verify_mode = ssl.CERT_NONE
