Twisted Python,在从纯文本切换到安全连接时使用ssl.CertificateOptions

时间:2014-10-01 15:45:44

标签: python authentication ssl twisted starttls

根据Jean-Paul Calderone的建议,我正在尝试修改下面的扭曲的“starttls_server”示例以支持使用ssl.ClientCertificateOptions,以允许我指定我的私钥,证书和可信根,根据http://twistedmatrix.com/documents/14.0.0/api/twisted.internet.ssl.CertificateOptions.html

from twisted.internet import ssl, protocol, defer, task, endpoints
from twisted.protocols.basic import LineReceiver
from twisted.python.modules import getModule

class TLSServer(LineReceiver):
    def lineReceived(self, line):
        print("received: " + line)
        if line == "STARTTLS":
            print("-- Switching to TLS")
            self.sendLine('READY')
            self.transport.startTLS(self.factory.options)

def main(reactor):
    certData = getModule(__name__).filePath.sibling('server.pem').getContent()
    cert = ssl.PrivateCertificate.loadPEM(certData)
    factory = protocol.Factory.forProtocol(TLSServer)
    factory.options = cert.options()
    endpoint = endpoints.TCP4ServerEndpoint(reactor, 8000)
    endpoint.listen(factory)
    return defer.Deferred()

if __name__ == '__main__':
    import starttls_server
    task.react(starttls_server.main)

我的理解是,我实际上需要用cert = ssl.PrivateCertificate...替换cert.options = ssl.PrivateCertificate....certopts = ssl.CertificateOptions(privateKey=pKeyData, certificate=certData, trustRoot=caCertsData)行(已将相应的文件读入certData,caCertsData和pKeyData)然后把它传递给factory.options - 但是没有粘贴我尝试的每一个代码变体,我还没有正确地解决这个问题 - 我的努力产生了不同的结果来自经典的“OpenSSL.crypto.Error:[] “ - 似乎只是将我的3个PEM文件的内容转储到屏幕并退出!

任何人都可以开导我吗?谢谢:))

1 个答案:

答案 0 :(得分:1)

cert.options()已经返回CertificateOptions。问题是options将权限(作为Certificate个对象)作为位置参数,并且不允许您通过所有其他配置值,因此您可能希望构造一个{{ 1}}直接。

只需将CertificateOptions行更改为factory.options = cert.options()

但是,factory.options = ssl.CertificateOptions(...)将pyOpenSSL CertificateOptions对象作为其PKey,而不是关键数据。因此,您需要使用OpenSSL API来加载该密钥,或者您可以从privateKey中提取它。

If you read the signature of CertificateOptions very carefully,所需的类型应该相当清楚。您可能还需要查阅pyOpenSSL文档。