带有延迟的扭曲 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 贡献一个补丁!
在我们的系统中,虚拟主机配置存储在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 贡献一个补丁!