このBlogは移転しました。今後は aish.dev を御覧ください。

サーバ証明書を動的に生成するSSLサーバ

通常、SSLでの接続を受け付けるサーバアプリケーションではサーバ証明書を用意する必要があるが、ちょっとしたテストなどでいちいち証明書を管理するのが面倒な場合には、証明書を動的に作成して使用することもできる。以下は foolscap を参考に作成したサンプルコードだ。

import sys
from twisted.internet import protocol, reactor, ssl
from twisted.protocols import basic

class EchoProtocol(basic.LineReceiver):
    def lineReceived(self, line):
        self.transport.write(line+"\r\n")

class EchoFactory(protocol.ServerFactory):
    protocol = EchoProtocol

dn = ssl.DistinguishedName(commonName="test dn")
keypair = ssl.KeyPair.generate()
req = keypair.certificateRequest(dn)

def verify(dn):
    return True

serialno = 111

issuer = ssl.DistinguishedName(commonName="test issuer")
certData = keypair.signCertificateRequest(issuer, req, verify, serialno)
cert = keypair.newCertificate(certData)
contextFactory = cert.options()

reactor.listenSSL(9999, EchoFactory(), contextFactory)
reactor.run()