Twisted listenSSL虚拟主机

Dea*_*ado 1 ssl twisted twisted.web

目前使用一个非常简单的Twisted NameVirtualHost与一些JSON配置文件相结合,在一个Site对象中提供真正的基本内容.Twisted提供的资源都是在flask中构建的WSGI对象.

我想知道如何用一个包装来连接到这些域的连接SSLContext,因为reactor.listenSSL只需要一个上下文,如何给每个域/子域提供它自己的crt/key对是不明显的.有没有办法为每个不需要代理的域设置带有ssl的命名虚拟主机?我找不到任何NameVirtualHost与SSL一起使用的Twisted示例,而且他们唯一可以使用的东西就是在侦听器上侦听只有一个域的上下文的端口443上的钩子?

我想知道是否有人试过这个?

我的简单服务器没有任何SSL处理:

https://github.com/DeaconDesperado/twsrv/blob/master/service.py

Jea*_*one 6

TLS(替代SSL的现代协议的名称)最近才支持您正在寻找的功能.该功能称为服务器名称指示(或SNI).现代平台上的现代浏览器支持它,但不是一些较旧但仍广泛使用的平台(有关支持的浏览器列表,请参阅维基百科页面).

Twisted没有特定的内置支持.但是,它不需要任何.twisted的SSL支持所基于的pyOpenSSL确实支持SNI.

set_tlsext_servername_callback pyOpenSSL API为您提供了基本的机制来构建你想要的行为.这使您可以定义一个回调,该回调可以访问客户端请求的服务器名称.此时,您可以指定要用于连接的密钥/证书对.您可以在pyOpenSSL的examples目录中找到一个演示如何使用此API的示例.

以下是该示例的摘录,为您提供依据:

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)
Run Code Online (Sandbox Code Playgroud)

您可以将此方法合并到自定义上下文工厂中,然后将该上下文工厂提供给listenSSL调用.