当前位置: 首页 > 面试题库 >

多处理的Python SSL问题

曹自怡
2023-03-14
问题内容

我想通过多个客户端子进程将数据从客户端发送到TLS
TCP套接字中的服务器,因此我与所有子进程共享相同的ssl套接字。通信可以使用一个子进程,但是如果我使用多个子ssl.SSLError进程,则TLS服务器将崩溃,并显示(SSL3_GET_RECORD:decryption失败或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

问题答案:

问题是您在两个进程中都使用了相同的连接。SSL加密数据的方式使此操作失败-
两个进程将必须就共享SSL连接的状态相互通信。即使您确实可以使用它,或者即使您不使用SSL,数据也都将到达服务器,而且杂乱无章。您将没有真正的方法来区分哪个字节来自哪个进程。

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



 类似资料:
  • 问题内容: 我正在使用PyQt4编写GUI程序。我的主窗口中有一个按钮,单击此按钮即可。我希望启动一个后台进程,该进程是从processing.Process派生的类的实例。 (请注意,我使用的 是从http://code.google.com/p/python- multiprocessing/ 获得的python- multiprocessing的Python2.5端口, 这就是为什么它正在处

  • 问题内容: 我有一个班级,想与一个池中的子进程以只读方式共享,所以我准备了一个班级的代理,但是没有用。以下是我的问题的简化示例。 当我运行此代码时,我得到: 看来我无法直接通过代理访问共享库的属性。是使用获取属性的方法的唯一方法,还是我做错了什么? 问题答案: 通常,由其使用的对象及其子类仅公开其引用的对象中的 方法 ,而不公开属性。现在,这里提供,它提供了一个子类,该子类 确实 提供对属性而不是

  • 本文向大家介绍JavaScript多并发问题如何处理,包括了JavaScript多并发问题如何处理的使用技巧和注意事项,需要的朋友参考一下 经常在写代码的时候碰到这样的场景:页面初始化时显示loading页,同时启动多个ajax并发请求获取数据,当每个ajax请求返回时结束loading。 举个例子,一个下订单的页面,要查询常用地址信息、商品信息、地市信息…而这些请求都是异步的,希望等到所有数据加

  • 我正在研究一个文本分类问题,其中多个文本特征和需要建立一个模型来预测工资范围。请参考示例数据集,大多数资源/教程只处理一列的特征提取,然后预测目标。我了解了文本预处理、特征提取(CountVectorizer或TF-IDF)以及应用算法等过程。 在这个问题中,我有多个输入文本特性。当涉及多个特征时,如何处理文本分类问题?这些是我已经尝试过的方法,但我不确定这些是否是正确的方法。请提供您的意见/建议

  • 我是Spring批处理的新手,我只想问如何从多行结果集中检索数据。我有以下场景: > 有两个不同的表说员工 使用时,我只能创建一个工资单子级,但该表可能有多个子级。请帮助...

  • 我试图让处理显示包含我的关键字的最新推文。我卡住了。我不确定如何检查它是否在更新。我知道它可以拉出最近的推特,但到目前为止,我唯一可以查看最新推特的方法是重新启动我的程序。抱歉太乱了。