【问题标题】:Twisted SNI with deferreds带有延迟的 Twisted SNI
【发布时间】:2015-10-14 15:55:23
【问题描述】:

在我们的系统中,虚拟主机配置存储在 redis 中。在连接建立期间,当收到 SNI 时,我们想查询 redis 以获取正确的证书和密钥对以用于 TLS 连接,并创建一个新的 Context 实例并附加该实例。

大部分代码与此处接受的答案相似:Twisted listenSSL virtualhosts

我们面临的问题是,由于访问证书涉及额外的网络操作,我们想让set_tlsext_servername_callback 函数返回延迟。

有没有办法告诉 Twisted/pyOpenSSL 等到延迟触发?

编辑:我发现这个链接看起来很有希望,但没有提供解决方案:https://mta.openssl.org/pipermail/openssl-dev/2015-January/000480.html

【问题讨论】:

    标签: ssl twisted sni pyopenssl


    【解决方案1】:

    您可以在此处找到 Twisted 和 SNI 的示例:https://pypi.python.org/pypi/txsni。我真的非常希望回调能够接受延迟。我认为这样做的方法是暂停底层传输,使其不再向输入或输出传输任何字节 (stopReading/stopWriting),然后在 Deferred 触发时恢复,在完成剩下的 SNI 舞蹈之后。但是,我什至不确定 OpenSSL 是否可能,因为 SNI 与 ClientHello 的其余部分一起接收,您可能需要能够立即做出反应以提供正确的证书。在这种最坏的情况下,您可以将收到的第一个字节块输入到虚拟内存-BIO 中,等待 TLS 握手,将其丢弃,并且永远不会提供任何生成的响应,并且那么在你决定使用哪个上下文对象之前,不要初始化你的“真实”子传输。

    希望这会有所帮助 - 如果你想通了,请为 TxSNI 或 Twisted 贡献一个补丁!

    【讨论】:

    • 感谢@Glyph。我正在实施您建议的第二种方法(一段时间以来一直在努力解码 ClientHello)。我已经尝试过第一种方法,但无法成功暂停读/写。我认为是因为 openssl 的内部状态机在从 SNI 回调返回时进入了错误的状态。
    • openssl.org/docs/manmaster/ssl/SSL_CTX_set_cert_cb.html 以及在 OpenSSL > 1.0.2 中返回 -1 以暂停握手并稍后手动恢复的能力也很有趣。不过也没有运气(我试图破解 pyOpenSSL,但我认为还没有暴露所有内容)。
    • 不幸的是,旧版本的 OpenSSL 部署了 很多,因此我们可能无法很快开始依赖 1.0.2+。我认为为了实现第二个选项,您可能需要编写自己的WrapperProtocol 来准确控制字节何时被传递,或者向twisted.protocols.tls 写入补丁,以便额外的Connection 对象以某种方式内置......
    • 无论如何,如果您弄明白了,请告诉我们,最好是在邮件列表中,也可以在此处回复!
    • gist.github.com/GaretJax/124c523a62ba48c9eec1 这可行,但仍有一些粗糙的边缘。我会在接下来的几天内清理它。
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 2011-03-31
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多