2扭曲的SSL证书

时间:2014-07-28 11:55:38

标签: 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.DefaultOpenSSLContextFactory(
                        '/etc/apache2/ssl/wc.key',
                        '/etc/apache2/ssl/wc.crt')
                      )

但是我有额外的域名和另一个证书。我需要为每个域使用2个证书进行工作。如何添加第二个扭曲证书?

1 个答案:

答案 0 :(得分:2)

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()