sockets - ESP32 MicroPython SSL WebSocket 服务器失败

标签 sockets ssl server esp32 micropython

我正在尝试使用 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/

相关文章:

.net - 微软 Azure SSL 配置

c - setsockopt() 不解除绑定(bind)

c# - SSL设置需要证书和开发

ios - 如何从您的 iOS 应用程序连接到后端服务器?如何读取、修改和获取数据到后端服务器?

python - 使用 gevents Wsgi 服务器在一个进程中多次启动和停止 Flask 应用程序

apache - 我可以从 C 模块内部强制关闭 Apache 2.2 连接吗?

java - 使用 java 套接字通过网络发送屏幕截图

c# - EndRead引发IO异常

java - 执行其他任务后将字符串 append 到 JText 区域

ssl - Kubernetes Pod之间的TLS通信(更轻量级的解决方案)