在我们的系统中,虚拟主机配置存储在redis中。在连接设置期间,当收到 SNI 时,我们想查询 redis 以获取用于 TLS 连接的正确证书和 key 对,并创建一个附加的新 Context
实例。
大部分代码类似于此处接受的答案:Twisted listenSSL virtualhosts
我们面临的问题是,由于访问证书涉及额外的网络操作,我们希望使 set_tlsext_servername_callback
函数返回延迟。
有没有办法告诉 Twisted/pyOpenSSL 等到延迟触发?
编辑:我发现这个链接看起来很有希望,但没有提供解决方案:https://mta.openssl.org/pipermail/openssl-dev/2015-January/000480.html
最佳答案
您可以在此处找到 Twisted 和 SNI 的示例:https://pypi.python.org/pypi/txsni .我真的非常希望回调能够接受延迟。我认为做到这一点的方法是暂停底层传输,不再向内或向外传送任何进一步的字节 (stopReading
/stopWriting
),然后在Deferred
在完成剩余的 SNI 舞蹈之后触发。但是,我什至不确定使用 OpenSSL 这是否可能,因为 SNI 是与 ClientHello
的其余部分一起接收的,您可能需要能够立即使用react提供正确的证书。在这种最坏的可能情况下,您可以将收到的第一个字节 block 输入虚拟内存 BIO,等待 TLS 握手,将其丢弃并且永远不会传递任何生成的响应,并且然后在您决定使用哪个上下文对象之前不要初始化您的“真正的”子传输。
希望这对您有所帮助 - 如果您弄明白了,请为 TxSNI 或 Twisted 贡献一个补丁!
关于ssl - 带有延迟的扭曲 SNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33130069/