Сбои рукопожатия SSL, когда никакие данные не были отправлены через Twisted TLSConnection - PullRequest
0 голосов
/ 09 февраля 2011

Я начинаю смотреть на реализацию явного FTP, расширяя текущий Twisted FTP.

Большая часть кода была проста, и реализовать AUTH, PBSZ, PROT было легко, и я получил работающий защищенный канал управления.

Моя проблема с каналом данных.

Ошибка на стороне клиента: SSL routines', 'SSL3_READ_BYTES', 'ssl handshake failure'

Похоже, что SSL-рукопожатие и завершение работы вызываются только тогда, когда некоторые данные были отправлены черезканал данных.Это влияет на случай отправки пустых файлов или перечисления пустых папок, так как перед закрытием соединения клиент вызовет отключение SSL.

Я ищу несколько предложений о том, как и где мне следует искать для исправления TLSрукопожатие от Twisted TLS, когда данные не отправляются.

Этот код работает при перечислении папок, которые не являются пустыми ... но завершится ошибкой, если папка не содержит файлов или папок.

Большое спасибо!

def getDTPPort(self, factory):
    """
    Return a port for passive access, using C{self.passivePortRange}
    attribute.
    """
    for portn in self.passivePortRange:
        try:
            if self.protected_data:
                dtpPort = reactor.listenSSL(
                    port=portn, factory=factory,
                    contextFactory=self.ssl_context)
            else:
                dtpPort = self.listenFactory(portn, factory)

        except error.CannotListenError:
            continue
        else:
            return dtpPort
    raise error.CannotListenError('', portn,
        "No port available in range %s" %
        (self.passivePortRange,))

Обновление 1

Я обновлю этот текст, так как комментарии не очень хорошо отформатированы:

Итак, я получил:

def getDTPPort(self, factory):
    """
    Return a port for passive access, using C{self.passivePortRange}
    attribute.
    """
    for portn in self.passivePortRange:
        try:
            if self.protected_data:
                tls_factory = TLSMemoryBIOFactory(
                    contextFactory=self.ssl_context,
                    isClient=False,
                    wrappedFactory=factory)
                dtpPort = reactor.listenTCP(
                    port=portn, factory=tls_factory)
            else:
                dtpPort = self.listenFactory(portn, factory)

        except error.CannotListenError:
            continue
        else:
            return dtpPort
    raise error.CannotListenError('', portn,
        "No port available in range %s" %
        (self.passivePortRange,))

Обновление 2

Проблема вызвана тем фактом, что соединение закрыто, пока продолжается квитирование.Я не знаю, как проверить на пустом соединении, что SSL-рукопожатие было сделано.

Так что я получил этот глупый код

def loseConnection(self):
    """
    Send a TLS close alert and close the underlying connection.
    """
    self.disconnecting = True

    def close_connection():
        if not self._writeBlockedOnRead:
            self._tlsConnection.shutdown()
            self._flushSendBIO()
            self.transport.loseConnection()

    # If we don't know if the handshake was done, we wait for a bit
    # and the close the connection.
    # This is done to avoid closing the connection in the middle of a
    # handshake.
    if not self._handshakeDone:
        reactor.callLater(0.1, close_connection)
    else:
        close_connection()

1 Ответ

2 голосов
/ 09 февраля 2011

Подтверждение SSL инициируется методом do_handshake объекта pyOpenSSL Connection. Он также может быть инициирован неявно с помощью вызова send или recv. Транспорт, настроенный на reactor.connectSSL и reactor.listenSSL, зависит от последнего. Таким образом, ваш вывод верен - рукопожатие никогда не выполняется, если по соединению не передаются данные.

Однако twisted.protocols.tls вызывает do_handshake, как только соединение установлено. Если вместо этого вы настроите свой SSL-сервер с этим API, я думаю, вы увидите, что ваша проблема решена.

Существует также план переопределить первый, используя последний , так как последний, кажется, работает лучше в целом.

...