【问题标题】:Python ssl problem with multiprocessing多处理的 Python ssl 问题
【发布时间】:2010-09-16 16:27:42
【问题描述】:

我想从多个客户端子进程通过 TLS TCP 套接字将数据从客户端发送到服务器,因此我与所有子进程共享同一个 ssl 套接字。与一个子进程通信,但如果我使用多个子进程,TLS 服务器会崩溃并显示ssl.SSLError (SSL3_GET_RECORD:decryption failed or bad record mac)。

更具体: 不依赖于哪个进程首先调用SSLSocket.write() 方法,但从此时起只有这个进程可以调用它。如果另一个进程调用write(),服务器将导致上述异常。

我使用了这个基本代码:

tlsserver.py

import socket, ssl

def deal_with_client(connstream):
    data = connstream.read()
    while data:
        print data
        data = connstream.read()
    connstream.close()

bindsocket = socket.socket()
bindsocket.bind(('127.0.0.1', 9998))
bindsocket.listen(5)

while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = ssl.wrap_socket(newsocket,
                                server_side=True,
                                certfile="srv.crt",
                                keyfile="srv.key",
                                ssl_version=ssl.PROTOCOL_TLSv1)
    deal_with_client(connstream)

tlsclient.py

import socket, ssl
import multiprocessing

class SubProc:
    def __init__(self, sock):
        self.sock = sock

    def do(self):
        self.sock.write("Test")

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

ssl_sock = ssl.wrap_socket(s)
ssl_sock.connect(('127.0.0.1', 9998))

print "Connected to", repr(ssl_sock.getpeername())

for x in (1,2):
    subproc = SubProc(ssl_sock)
    proc = multiprocessing.Process(target=subproc.do)

这是回溯:

Traceback (most recent call last):
  File "tlsserver.py", line 21, in <module>
    deal_with_client(connstream)
  File "tlsserver.py", line 7, in deal_with_client
    data = connstream.read()
  File "/usr/lib64/python2.6/ssl.py", line 136, in read
    return self._sslobj.read(len)
ssl.SSLError: [Errno 1] _ssl.c:1325: error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac

【问题讨论】:

    标签: python ssl multiprocessing


    【解决方案1】:

    问题是您为两个进程重复使用相同的连接。 SSL 加密数据的方式使这失败了——两个进程必须就共享 SSL 连接的状态相互通信。即使你确实让它工作了,或者如果你没有使用 SSL,数据到达服务器也会一团糟;您将无法真正区分哪些字节来自哪个进程。

    您需要做的是通过在subproc.do 中建立连接,为每个进程提供自己的 SSL 连接。或者,根本不让子进程与服务器通信,而是与主进程通信,并让主进程通过 SSL 连接进行中继。

    【讨论】:

    • 感谢您的信息!我担心这会是个问题。我想我会使用一个只进行 ssl 通信的进程,而所有其他进程都将通过管道与这个进程进行通信。这听起来合理吗?
    • 你好心,能解释一下为什么连锁都不能解决这个问题吗?
    • 我在使用 SSL 和 multiprocessing.Process 时遇到了类似的问题。我发现切换到使用 multithreading.Thread 足以解决这个问题。我无法准确找到导致我走这条路的阅读内容,但我相信这是因为 openssl 库使用进程信息对原始套接字进行加密/解密的方式。当在一个进程上创建该套接字然后将其传递给另一个进程时,就会出现问题。在一个线程中创建并传递给另一个线程似乎很好??
    • @danielpops 你有一些工作的sn-p吗?我正在尝试使用多处理抓取基于 SSL 的站点并收到错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2019-02-07
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    相关资源
    最近更新 更多