SocketServer.TCPServer クラスに基づく既存の TCP サーバーに ssl サポートを追加したいと考えています。そこで、TCPServer クラスのデフォルトのコンストラクターをオーバーライドし、ssl.wrap_socket(...) 呼び出しを追加しました。
class MyTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
# See SocketServer.TCPServer.__init__
# (added ssl-support):
SocketServer.BaseServer.__init__(self, server_address,
RequestHandlerClass)
self.socket = ssl.wrap_socket(
socket.socket(self.address_family, self.socket_type),
server_side=True,
certfile='cert.pem'
)
if bind_and_activate:
self.server_bind()
self.server_activate()
サーバーの起動時に、エラーは発生しません。そこで、単純なテストクライアントを変更して、ssl もサポートするようにしました。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock = ssl.wrap_socket(s)
sock.connect(('192.168.1.1', 54321))
ここでもエラーは発生しませんが、connect-call がブロックされています。Ctrl+C を使用してクライアントを閉じると、次のように表示されます。
Traceback (most recent call last):
File "exampleClient.py", line 10, in <module>
sock.do_handshake()
File "/usr/lib/python2.6/ssl.py", line 293, in do_handshake
self._sslobj.do_handshake()
KeyboardInterrupt
そのため、接続時に do_handshake がブロックされています。問題を解決する方法を知っている人はいますか?暗号化されたTCP接続を使用したいだけです:)