def _make_server_iostream(self, connection, **kwargs):
     context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
     context.load_cert_chain(
         os.path.join(os.path.dirname(__file__), 'test.crt'),
         os.path.join(os.path.dirname(__file__), 'test.key'))
     connection = ssl_wrap_socket(connection, context,
                                  server_side=True,
                                  do_handshake_on_connect=False)
     return SSLIOStream(connection, io_loop=self.io_loop, **kwargs)
Beispiel #2
0
 def _handle_connect(self):
     # When the connection is complete, wrap the socket for SSL
     # traffic.  Note that we do this by overriding _handle_connect
     # instead of by passing a callback to super().connect because
     # user callbacks are enqueued asynchronously on the IOLoop,
     # but since _handle_events calls _handle_connect immediately
     # followed by _handle_write we need this to be synchronous.
     self.socket = ssl_wrap_socket(self.socket, self._ssl_options,
                                   server_hostname=self._server_hostname,
                                   do_handshake_on_connect=False)
     super(SSLIOStream, self)._handle_connect()
Beispiel #3
0
 def _handle_connection(self, connection, address):
     if self.ssl_options is not None:
         assert ssl, "Python 2.6+ and OpenSSL required for SSL"
         try:
             connection = ssl_wrap_socket(connection,
                                          self.ssl_options,
                                          server_side=True,
                                          do_handshake_on_connect=False)
         except ssl.SSLError as err:
             if err.args[0] == ssl.SSL_ERROR_EOF:
                 return connection.close()
             else:
                 raise
         except socket.error as err:
             # If the connection is closed immediately after it is created
             # (as in a port scan), we can get one of several errors.
             # wrap_socket makes an internal call to getpeername,
             # which may return either EINVAL (Mac OS X) or ENOTCONN
             # (Linux).  If it returns ENOTCONN, this error is
             # silently swallowed by the ssl module, so we need to
             # catch another error later on (AttributeError in
             # SSLIOStream._do_ssl_handshake).
             # To test this behavior, try nmap with the -sT flag.
             # https://github.com/facebook/webalchemy.tornado/pull/750
             if err.args[0] in (errno.ECONNABORTED, errno.EINVAL):
                 return connection.close()
             else:
                 raise
     try:
         if self.ssl_options is not None:
             stream = SSLIOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size)
         else:
             stream = IOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size)
         self.handle_stream(stream, address)
     except Exception:
         app_log.error("Error in connection callback", exc_info=True)