これにいくつかのクロージャを追加し、将来の検索のために、SNI を出力するサンプルからのエコー サーバーのサンプル コードを次に示します。
from twisted.internet import ssl, reactor
from twisted.internet.protocol import Factory, Protocol
class Echo(Protocol):
def dataReceived(self, data):
self.transport.write(data)
def pick_cert(connection):
print('Received SNI: ', connection.get_servername())
if __name__ == '__main__':
factory = Factory()
factory.protocol = Echo
with open("keys/ca.pem") as certAuthCertFile:
certAuthCert = ssl.Certificate.loadPEM(certAuthCertFile.read())
with open("keys/server.key") as keyFile:
with open("keys/server.crt") as certFile:
serverCert = ssl.PrivateCertificate.loadPEM(
keyFile.read() + certFile.read())
contextFactory = serverCert.options(certAuthCert)
ctx = contextFactory.getContext()
ctx.set_tlsext_servername_callback(pick_cert)
reactor.listenSSL(8000, factory, contextFactory)
reactor.run()
また、OpenSSL を機能させるのは常に難しいため、接続に使用できる OpenSSL ステートメントを次に示します。
openssl s_client -connect localhost:8000 -servername hello_world -cert keys/client.crt -key keys/client.key
上記の python コードを pyOpenSSL==0.13 に対して実行してから、上記の s_client コマンドを実行すると、これが画面に表示されます。
('Received SNI: ', 'hello_world')