遵循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文件正在显示并退出!

谁能启发我?谢谢 :)

最佳答案

cert.options()已经返回了CertificateOptions。问题在于options将权限(作为Certificate对象)作为位置args,并且不允许您传递所有其他配置值,因此您可能希望直接构造CertificateOptions

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

但是,CertificateOptions将pyOpenSSL PKey对象作为其privateKey,而不是密钥数据。因此,您需要使用OpenSSL API加载该密钥,也可以从PrivateCertificate中提取它。

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

08-16 23:19