当没有通过 Twisted TLSConnection 发送数据时 SSL 握手失败

2024-01-25

我开始考虑通过扩展当前的 Twisted FTP 来实现显式 FTP。

大部分代码都很简单,实现 AUTH、PBSZ、PROT 很容易,我得到了一个有效的安全控制通道。

我的问题是数据通道。

客户端错误是:SSL routines', 'SSL3_READ_BYTES', 'ssl handshake failure'

看起来只有当通过数据通道发送一些数据时才会调用 SSL 握手和关闭。 这会影响发送空文件或列出空文件夹时的情况,因为在关闭连接之前,客户端将调用 SSL shutdown。

我正在寻找一些关于在没有发送数据时应该如何以及在哪里搜索修复来自 Twisted TLS 的 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,))

Update 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,))

Update 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()

SSL 握手由do_handshakepyOpenSSL 的方法Connection http://packages.python.org/pyOpenSSL/openssl-connection.html目的。它也可以由隐式启动send or recv称呼。交通设置由reactor.connectSSL and reactor.listenSSL依赖于后者。所以你的结论是正确的 - 如果没有通过连接发送数据,则永远不会执行握手。

然而,twisted.protocols.tls http://twistedmatrix.com/documents/current/api/twisted.protocols.tls.html calls do_handshake一旦连接建立。如果您使用该 API 设置 SSL 服务器,我想您会看到问题得到解决。

还有一个计划使用后者重新实现前者 http://twistedmatrix.com/trac/ticket/4854,因为后者似乎总体上效果更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当没有通过 Twisted TLSConnection 发送数据时 SSL 握手失败 的相关文章

随机推荐

  • Apache的Mesos和Google的Kubernetes有什么区别

    Apache的Mesos和Google的Kubernetes到底有什么区别 据我了解 两者都是服务器集群管理软件 任何人都可以详细说明主要区别在哪里 什么时候会首选哪个框架 你为什么要使用Kubernetes 位于 Mesosphere 之
  • 设置已发布的 npm 项目的“根”

    我正在发布一个名为的 npm 包foo到 npm 注册表 我使用compile to js 语言编写了该包 为了理智起见 我将编译的输出放入dist 项目目录的文件夹 我的package json将入口点列出为dist entry js n
  • Azure Web Apps 是否在多个实例之间共享磁盘?

    根据大卫 埃博 David Ebbo 在Azure 运行时环境 https github com projectkudu kudu wiki Azure runtime environment file system本文中 当您启动 2 个
  • 为什么“du”的输出通常与“du -b”如此不同

    为什么输出是du通常与du b b是简写 apparent size block size 1 仅使用 apparent size大多数时候给我相同的结果 但是 block size 1似乎可以解决问题 我想知道输出是否正确 哪些数字是我想
  • docker compose 会自动创建端口映射吗?

    我在 Visual Studio 2019 中创建了一个简单的 asp net core 应用程序并添加了 docker 支持 Dockerfile dockerignore 和 docker compose 文件均已创建 在命令提示符中
  • 数据库设计:跟踪每个用户的大量属性。如此之多,我可能会用完列(行存储空间)

    对于我所关心的问题 我希望得到一些意见 我的数据库中有一个 User 表 其中包含您期望的基本内容 例如用户名 密码等 该应用程序要求我跟踪每个用户的大量属性 如此之多 我可能会用完列 行存储空间 我很想添加一个包含 UserID Prop
  • 无需显式定义要抓取的每个字段即可抓取数据

    我想抓取一页数据 使用 Python Scrapy 库 而不必定义页面上的每个单独字段 相反 我想使用动态生成字段id元素的名称作为字段名称 起初我认为最好的方法是建立一个收集所有数据的管道 并在收集完所有数据后将其输出 然后我意识到我需要
  • Erlang:使用 gen_tcp:controlling_process 避免竞争条件

    我正在按照以下顺序实现简单的 tcp 服务器 ok LS gen tcp listen Port active true reuseaddr true mode list ok Socket gen tcp accept LS Pid sp
  • 当区域性可变时,格式化不带年份的本地化日期

    我需要根据当前设置的区域性将日期显示在 M dd 或 dd M 中 在我们的应用程序中 我们明确设置基于配置的区域性 目前 我们使用以下方法格式化日期 string dateStringFormat Thread CurrentThread
  • OpenCV 在图像上运行 kmeans 算法

    我试图在 3 通道彩色图像上运行 kmeans 但每次我尝试运行该函数时 它似乎都会崩溃并出现以下错误 OpenCV Error Assertion failed data dims lt 2 type CV 32F K gt 0 in u
  • VC2008中整个程序优化失败

    我有一个在 VS2008 下编译的相当大的 C 程序 11mb exe 并且有兴趣了解整个程序优化是否会显着影响其性能 然而 打开整个程序优化和链接时代码生成会导致链接失败 如下所示 1 gt c cpp Win32 Atlas tin T
  • 如何使应用程序移动到 SD 卡(并仍然支持 android < 2.2)?

    如何将我的应用程序移至 SD 卡 编辑标题以使问题与给出的答案更相关 你必须设置android installLocationAndroidManifest xml 文件中的条目 preferExternal or auto价值观就可以了
  • 高效创建三对角矩阵

    如何创建一个二次带矩阵 其中给出对角线以及对角线下方和上方的第一个对角线 我正在寻找类似的功能 tridiag upper lower main where length upper length lower length main 1并返
  • 将基本 3D 模型导入 OpenGL 应用程序

    好吧 我正在做简单的 OpenGL ES 编程 当我说简单时 我所做的最复杂的事情只不过是美化的斜角立方体和 L 形 想想俄罗斯方块 但在 3D 中 但是 将所有顶点数据放入应用程序中要么是 a 手动编码 啊 要么 b 第 3 方游戏引擎
  • Drupal 7 hook_theme() 不加载模板文件

    我想得到一个very使用 drupal 的 hook theme 加载模板文件的简单模块 这几乎和你想象的一样简单 function sectionheader theme existing type theme path return a
  • 关于 Java lambda 相等和/或实例化[重复]

    这个问题在这里已经有答案了 为什么下面的代码片段在第二次通过时打印 true 不应该是一个新实例吗 import java util function Supplier public class Foo public static void
  • 如何在 OSX 上打开“共享菜单”首选项?

    与 Safari 非常相似 尝试实现一个按钮 单击该按钮会打开 系统偏好设置 gt 扩展 gt 共享菜单 窗格 我努力了 NSURL URL NSURL URLWithString x apple systempreferences com
  • Android:adb:权限被拒绝

    无论我输入什么adb shell它失败了Permission denied D android sdk windows platform tools gt adb shell find data name db find permissio
  • 连接 bash 中前 N 个参数之外的剩余参数

    我之前不需要编写任何 bash 脚本 这是我需要做的 我的脚本将使用一组字符串参数运行 刺数将超过 8 我将必须连接字符串 9 及之后的字符串 并从中生成一个字符串 像这样 myscript s1 s2 s3 s4 s5 s6 s7 s8
  • 当没有通过 Twisted TLSConnection 发送数据时 SSL 握手失败

    我开始考虑通过扩展当前的 Twisted FTP 来实现显式 FTP 大部分代码都很简单 实现 AUTH PBSZ PROT 很容易 我得到了一个有效的安全控制通道 我的问题是数据通道 客户端错误是 SSL routines SSL3 RE