Python twisted中的2个SSL证书

Python twisted中的2个SSL证书,python,ssl,twisted,Python,Ssl,Twisted,我有这个密码: from twisted.web.server import Site from twisted.web.static import Data from twisted.internet import reactor, ssl root = Data("", "text/plain") site = Site(root) reactor.listenSSL(config.ws_port, site, ssl.DefaultOpenSS

我有这个密码:

from twisted.web.server import Site
from twisted.web.static import Data
from twisted.internet import reactor, ssl

root = Data("", "text/plain")
site = Site(root)
reactor.listenSSL(config.ws_port, site,
                      ssl.DefaultOpenSSLContextFactory(
                        '/etc/apache2/ssl/wc.key',
                        '/etc/apache2/ssl/wc.crt')
                      )

但我有额外的域名和另一个证书。我需要为每个域使用2个证书。如何为twisted添加第二个证书?

TLS使用HTTP支持多个主机名的方法是使用包含所有这些主机名的单个证书(例如,作为
subjectAltName
扩展名),或者使用多个证书(每个证书的主机名少于完整的主机名集)以及SNI TLS扩展

如果要使用前一种解决方案,只需获取正确构造的证书。您如何做到这一点可能取决于您从何处获得证书。可能证书供应商对此有一个特殊的用户界面,或者您正在使用的证书请求生成器有控制它的选项

如果要使用后一种解决方案,请调查:


你能用txSNI修改我的例子吗?
from txsni.snimap import SNIMap
from txsni.tlsendpoint import TLSEndpoint

from twisted.web.server import Site
from twisted.web.static import Data
from twisted.internet import reactor
from twisted.internet.ssl import Certificate, KeyPair, PrivateCertificate
from twisted.internet.endpoints import serverFromString

def main(reactor):
    root = Data("", "text/plain")
    site = Site(root)

    def load(key_path, cert_path):
        with open(key_path) as key_file:
            key = KeyPair.loadPEM(key_file.read())

        with open(cert_path) as cert_file:
             cert = cert.read()

        return PrivateCertificate.fromCertificateAndKeyPair(cert, key)

    snimap = SNIMap({
        "DEFAULT": load('/etc/apache2/ssl/wc.key', '/etc/apache2/ssl/wc.crt').options(),
        "another.host.name": load(another_key, another_cert).options(),
        ...
    })

    endpoint = TLSEndpoint(serverFromString(reactor, "tcp:80"))
    endpoint.listen(site)

    reactor.run()