python-3.x - Python 3.4 ssl.SSLEOFError : EOF occurred in violation of protocol (_ssl. c:1638)

标签 python-3.x ssl

我的项目是通过 SSL 套接字使用子进程 stdin、stdout 的 PIPE 将远程 vim(在我的服务器上)连接到我的客户端。我使用 Python 3.4。 我的套接字(代码中的 cSock)是 SSL 包装的,每次我尝试打开 Vim 时都会遇到同样的错误。这是我的代码:

vimProc = sp.Popen(["rvim", file], bufsize=0, stdin=sp.PIPE, stdout=sp.PIPE)

cSock.settimeout(1)

rec = Reception(cSock, vimProc)
emi = Emission(cSock, vimProc)

rec.start()
emi.start()

rec.join()
emi.join()

这是我的接收和发射线程

class Reception(threading.Thread):

def __init__(self, sock, proc):
    threading.Thread.__init__(self)
    self.sock = sock
    self.proc = proc

def run(self):
    while self.proc.poll() == None:
        try:
            self.proc.communicate(self.sock.recv(1))
        except socket.timeout:
            pass


class Emission(threading.Thread):

def __init__(self, sock, proc):
    threading.Thread.__init__(self)
    self.sock = sock
    self.proc = proc

def run(self):
    while self.proc.poll() == None:
        try:
            outs = self.proc.stdout.read(1)
            if outs == "":
                print("EOF reached")
            else:
                self.sock.send(outs)

        except socket.timeout: 
            pass

这里是追溯:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
    self.run()
  File ".../server/edition.py", line 62, in run
    self.sock.send(outs)
  File "/usr/lib/python3.4/ssl.py", line 678, in send
    v = self._sslobj.write(data)
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:1638)

有什么解决办法吗?

最佳答案

SSL/TLS 是 TCP 之上的一层。但是,虽然 TCP 在内核中完成,但 SSL/TLS 在用户空间中完成。因此有两个问题:

第一个问题是在 subprocess.Popen 中执行 fork 时,用户空间和 SSL 状态是重复的。但是父进程或子进程中此套接字上的任何操作都不会与其他进程中的状态同步,因此如果两个进程都主动处理套接字(包括关闭它),则会导致 SSL 状态失败,从而导致连接错误。

即使只有子进程处理问题,fork 之后的 exec(如 subprocess.Popen 中所做的那样)也只会使内核文件描述符可供进程使用 (rvim 在你的情况下`) 但不是用户空间 SSL 层,因为这个用户空间仅在 Python 进程内。这样,子进程将使用普通 TCP 套接字进行通信,而服务器需要 SSL。这也会导致连接错误并最终关闭连接。另见 Python3 CGI HTTPS server fails on Unix .

我能想到的唯一方法是仅将 SSL 套接字保留在父进程中,并使用单独的管道(或套接字对)与子进程通信。从父进程中的服务器(使用 SSL)接收的所有数据都应作为明文转发到子进程,而来自子进程的所有数据都应使用 SSL 发送到父进程中的服务器。

关于python-3.x - Python 3.4 ssl.SSLEOFError : EOF occurred in violation of protocol (_ssl. c:1638),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307864/

相关文章:

python - 如何仅将列表中第一个单词的第一个字母大写

python - 如果坐标不超过阈值,则对列进行分组

python 3错误RuntimeError : super(): no arguments

HTTP 到 HTTPS 自签名证书

c# - 跨域 iframe 中的安全错误

windows - 适用于 Windows 的 CouchDB - SSL 证书 - 连接错误

c++ - boost::asio::ssl::context 可以在多个 SSL 流之间共享吗?

python - 为 python 3 urllib 打开调试输出

python - 从数据中删除序列 Pandas Python Numpy

apache - 如何使用 Apache 重定向对 Node-Red 的请求?