【问题标题】:Received data from python SSL server is incorrect从 python SSL 服务器接收到的数据不正确
【发布时间】:2018-08-22 04:29:19
【问题描述】:

我正在尝试修改我用 python 套接字库编写的套接字服务器,以使用 python 的 SSL 库进行加密。

我无法成功打开到服务器的连接,用 SSL 上下文包装它并将数据发送到服务器,但是发送回客户端的数据不是它应该是的。

我怀疑服务器响应没有在客户端被解密,但我不知道为什么。我对 SSL/TLS 和一般网络还很陌生,所以......我错过了什么?

客户端也是用python写的(暂时方便测试)

代码:

相关服务器的东西:

def sslServerLoop():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, port))
    s.listen(5)

    context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    context.load_cert_chain('cert.pem')

    while True:
        conn, addr = s.accept()
        sslConn = context.wrap_socket(conn, server_side=True)
        data = sslConn.recv(1024)
        sslConn.sendall(response)
        sslConn.close()

相关客户资料:

context = ssl.create_default_context(cafile='cert.pem')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = context.wrap_socket(s, server_hostname=server_addr)
s.connect((address, port))
s.sendall(msg)
s.shutdown(socket.SHUT_WR)
response = s.recv(1024)

从客户端发送到服务器工作正常,但发送回客户端的数据是错误的。例如,如果我在服务器端设置response = bytes([1]),我会在客户端收到b'\x17\x03\x03\x00\x19\xac\xb6\x7f@\xc0\xd3\xce%\x13G\x01\xbd\x88y\xf0\xda..\x02\xf9\xe4o\xdd\x1a\xdb'。每次我尝试运行它时,大部分内容都会发生变化,但前 5 个字节总是相同的(这也是我怀疑它没有被解密的部分原因)。

cert.pem 是使用 openssl 生成的自签名证书,如 python 3 SSL 模块文档中所述

【问题讨论】:

  • "...我错过了什么?" - 您的问题中缺少代码,表明您遇到的问题。仅根据您的描述,不可能说出您做错了什么,因为首先看不到您做了什么。见How to create a Minimal, Complete, and Verifiable example
  • 你的代码在哪里?
  • 添加了代码示例,对此感到抱歉。没想到我需要他们来回答这个问题。
  • 按照建议删除或移动 s.shutdown(socket.SHUT_WR) 会导致客户端既没有得到响应也没有完成。我最终不得不按 ctr-c 退出。
  • 请尽量使您的示例完整:具体来说,您没有显示在服务器代码中定义“响应”的位置,您应该显示您期望的输出以及你实际得到的。 “发回给客户端的数据不是应有的数据”可能对您有意义,您如何期望其他人知道这意味着什么?

标签: python sockets ssl server


【解决方案1】:

关闭用于 SSL 的套接字是不合法的。这是违反协议的。您必须通过您正在使用的 SSL/TLS API 关闭。

【讨论】:

  • 显然 Python 的 SSL shutdown() 奇怪且无证地执行了类似于 unwrap() 的操作,将套接字恢复为纯文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2017-07-17
  • 2019-04-13
  • 1970-01-01
相关资源
最近更新 更多