gpt4 book ai didi

python - 使用 SocketServer.TCPServer 通过 SSL 的 TCP 服务器

转载 作者:可可西里 更新时间:2023-11-01 02:32:22 24 4
gpt4 key购买 nike

我想将 ssl 支持添加到基于 SocketServer.TCPServer 类的现有 TCP 服务器。所以我覆盖了 TCPServer 类的默认构造函数并添加了 ssl.wrap_socket(...)-call:

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))

再次没有发生错误,但是连接调用被阻塞了。使用 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 连接 :)

最佳答案

握手是阻塞的,因为你在绑定(bind)之后包装套接字;套接字正在监听新连接,还没有客户端接受您的连接。

改为在接受连接时包装套接字:

class MyTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def get_request(self):
(socket, addr) = SocketServer.TCPServer.get_request(self)
return (ssl.wrap_socket(socket, server_side=True, certfile="cert.pem"),
addr)

现在握手成功了,因为另一边有客户端要握手

流处理程序不需要额外的工作; python ssl 库为您提供了与 socket.socket() 具有相同接口(interface)的对象。

您也可以提前包装套接字,但一定要推迟握手直到您接受连接:

class MyTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def server_bind(self):
SocketServer.TCPServer.server_bind(self)
self.socket = ssl.wrap_socket(
self.socket, server_side=True, certfile="cert.pem",
do_handshake_on_connect=False)

def get_request(self):
(socket, addr) = SocketServer.TCPServer.get_request(self)
socket.do_handshake()
return (socket, addr)

关于python - 使用 SocketServer.TCPServer 通过 SSL 的 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com