но я не был уверен, каково его использование и удивлялся, почему это не используется по умолчанию. Вы герой :)

инаю смотреть на реализацию явного 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)

Ваш ответ на вопрос