带有延迟的扭曲 SNI

Twisted SNI with deferreds

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

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

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

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

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

您可以在此处找到 Twisted 和 SNI 的示例:https://pypi.python.org/pypi/txsni. I would really, really like that callback to be able to take a Deferred. I think that the way to do this would be to pause the underlying transport from delivering any further bytes either in or out (stopReading/stopWriting),然后在 Deferred 触发时继续执行 SNI 舞蹈的其余部分。但是,我什至不确定这是否 可能 使用 OpenSSL,因为 SNI 是与 ClientHello 的其余部分一起接收的,您可能需要能够立即做出反应提供正确的证书。在这种最坏的可能情况下,您可以将收到的第一个字节块输入虚拟内存 BIO,等待 TLS 握手,将其丢弃,并且永远不会交付任何生成的字节响应,然后在您决定使用哪个上下文对象之前不要初始化您的 "real" 子传输。

希望这对您有所帮助 - 如果您弄明白了,请为 TxSNI 或 Twisted 贡献一个补丁!