gpt4 book ai didi

sockets - ESP32 MicroPython SSL WebSocket 服务器失败

转载 作者:行者123 更新时间:2023-12-04 22:41:28 26 4
gpt4 key购买 nike

我正在尝试使用 micropython 在 esp32 上设置安全套接字服务器。我使用/尝试了带有自签名证书的最新版本(esp32-idf3-20200117-v1.12-68-g3032ae115.bin)。

我在 esp32/esp8266 上看到了很多与 ssl.wrap_socket() 相关的内存泄漏问题,但我得到的是不同的:

mbedtls_ssl_handshake error: -4310
Traceback (most recent call last):
File "boot.py", line 100, in <module>
OSError: [Errno 5] EIO

连接当然会失败。我尝试从我的笔记本电脑连接。如果我在笔记本电脑本身(127.0.0.1)上启动一个安全套接字服务器,客户端的完全相同的代码可以工作,所以我认为客户端没问题,问题出在服务器端。

我还没有找到任何解决这个问题的方法。我尝试了“der”和“pem”格式的证书和 key ,结果是一样的。

我试过的玩具服务器代码:
import esp
esp.osdebug(None)

import gc
gc.collect()

import usocket as socket
import ssl
import machine
import network

KEY_PATH = 'server_key.der'
CERT_PATH = 'server_cert.der'

ssid= "AP_local"
pw="passwd"
ap = network.WLAN(network.AP_IF) # create access-point interface
ap.config(essid=ssid, password=pw, authmode=4) # set the ESSID of the access point
ap.ifconfig(('192.168.3.1', '255.25.255.0', '192.168.3.1', '8.8.8.8'))
ap.active(True)


with open(KEY_PATH, 'rb') as f:
key = f.read()
print(key)
print(" ")
with open(CERT_PATH, 'rb') as f:
cert = f.read()


#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ad = ap.ifconfig()
addr = socket.getaddrinfo(ad[0], 8443)[0][-1]
s.bind(addr)
s.listen(5)

import gc
gc.collect()


while True:
print("ssl connection started")
cl, addr = s.accept()
scl = ssl.wrap_socket(cl, server_side=True, cert=cert, key=key)

print(gc.mem_free())
l = 0
while True:
req = scl.read(1024)
print(req)
if not req or b'\r\n' in req:
break

response = '\r\n'.join(['HTTP/1.1 200 OK',
'Content-Type: text/plain',
'OK',
'Connection: close', '\r\n'])
scl.write(response.encode("utf-8"))
scl.close()

我希望有人可以帮助我解决这个问题,谢谢!

最佳答案

好的,经过几天的搜索、阅读和测试后,我得到了解决方案以及此问题的可能原因。我希望它能对其他人有所帮助。
我想提出我没有深入研究 mbedtls 的源代码,所以推理有点现象学。

首先,我尝试使用默认设置从 python 程序连接,但如上所示失败。然后我尝试了openssl cli,它也失败了。
我尝试了 https://github.com/micropython/micropython/blob/master/examples/network/http_server_ssl.py 中给出的示例并再次失败,但错误代码不同。
最后我找到了一个非常有用的页面:
https://tls.mbed.org/api/ssl_8h.html#a55ed67b6e414f9b381ff536d9ea6b9c0
这有助于了解问题发生在哪里。
现在根据要求,从 -7900、-7780、-7380、-7d00 出现不同的错误。

事实证明,虽然在文档中使用的密码套装是在握手期间自动同意的,但是其中存在一些错误,或者其中一些在 micropython 中的实现是不同的。

我没有在我的笔记本电脑上测试所有可用的密码,但是例如:AES_256_GCM_SHA384
密码有效。
对我来说,现在已经足够了。

关于sockets - ESP32 MicroPython SSL WebSocket 服务器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806184/

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