1

SO に関する 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...andcert.options = ssl.PrivateCertificate....行をcertopts = ssl.CertificateOptions(privateKey=pKeyData, certificate=certData, trustRoot=caCertsData)(適切なファイルを certData、caCertsData、および pKeyData に読み込んで) のようなものに効果的に置き換え、これをに渡す必要があるということですfactory.optionsが、試したコードのすべてのバリアントを貼り付けることなく、 'まだこれを正しく解決していません - 私の努力は、古典的な "OpenSSL.crypto.Error: []" から、私の 3 つの PEM ファイルの内容を画面にダンプして終了するように見えるまで、さまざまな結果を生み出しました!

誰でも私を啓発できますか?ありがとうございました :)

4

1 に答える 1

1

cert.options()はすでに を返していCertificateOptionsます。問題は、options権限を (Certificateオブジェクトとして) 位置引数として取り、他のすべての構成値を通過させることができないため、おそらくCertificateOptions直接構築する必要があることです。

factory.options = cert.options()行を に変更するだけfactory.options = ssl.CertificateOptions(...)です。

ただし、鍵データではなくCertificateOptionspyOpenSSLPKeyオブジェクトを として受け取ります。privateKeyそのため、OpenSSL API を使用してそのキーをロードする必要があります。または、PrivateCertificate.

の署名をCertificateOptions注意深く読むと、必要な型がかなり明確になるはずです。pyOpenSSLのドキュメントも参照する必要がある場合があります。

于 2014-10-01T18:32:08.327 に答える