目前使用一个非常简单的 TwistedNameVirtualHost
加上一些 JSON 配置文件,可以在一个文件中提供真正基本的内容Site
目的。 Twisted 提供的资源都是 Flask 中构建的 WSGI 对象。
我想知道如何用一个来包装与这些域的连接SSLContext
, since reactor.listenSSL
仅需要一个上下文,如何为每个域/子域提供自己的 crt/密钥对并不明显。有没有办法为每个不需要代理的域设置带有 ssl 的命名虚拟主机?我找不到任何使用 Twisted 的示例NameVirtualHost
使用 SSL,我唯一能做的就是挂接在只有一个域上下文的端口 443 上侦听的反应器?
我想知道是否有人尝试过这个?
我的简单服务器没有任何 SSL 处理:
https://github.com/DeaconDesperado/twsrv/blob/master/service.py
TLS(取代 SSL 的现代协议的名称)直到最近才支持您正在寻找的功能。该功能称为服务器名称指示 (or SNI)。它受到现代平台上的现代浏览器的支持,但不支持一些较旧但仍然广泛使用的平台(有关支持的浏览器列表,请参阅维基百科页面)。
Twisted 对此没有特定的内置支持。然而,它不需要任何。 Twisted 的 SSL 支持所基于的 pyOpenSSL 确实支持 SNI。
The set_tlsext_servername_callbackpyOpenSSL API 为您提供了构建您想要的行为的基本机制。这允许您定义一个回调,该回调有权访问客户端请求的服务器名称。此时,您可以指定要用于连接的密钥/证书对。你可以找到演示此 API 用法的示例在 pyOpenSSL 的示例目录中。
以下是该示例的摘录,可为您提供要点:
def pick_certificate(connection):
try:
key, cert = certificates[connection.get_servername()]
except KeyError:
pass
else:
new_context = Context(TLSv1_METHOD)
new_context.use_privatekey(key)
new_context.use_certificate(cert)
connection.set_context(new_context)
server_context = Context(TLSv1_METHOD)
server_context.set_tlsext_servername_callback(pick_certificate)
您可以将此方法合并到自定义上下文工厂中,然后将该上下文工厂提供给listenSSL
call.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)