0

这个问题是对社区不感兴趣的一个先例问题的重新表述(和简化)(具有 2 个不同 Websocket API 但相同请求的不同行为)。

由于Websockets,我正在尝试与本地网络上的服务器通信,但我是一个真正的菜鸟。

目前,我被卡住了,因为当我使用 bash 中的“wscat”和 python 中的“websocket”lib 做(或尝试做)同样的事情时,我没有相同的行为。

$ wscat -c $serveur_address -n
Connected (press CTRL+C to quit)
< {[...]"token":"11235326"[...]}
> 
>>> import websocket, ssl
>>> uri = 'server_address'
>>> ws = websocket.create_connection(uri, sslopt={"cert_reqs": ssl.CERT_NONE})
>>> ws.recv()
... infinite wait

使用 wscat,我会立即收到一个响应,其中包含用于下一个连接的令牌。
但是在python中使用websocket,根本没有响应。

这两个 Websocket 创作之间有区别吗?

编辑:在这两种情况下,server_address 都是 ' wss ://192.168.1.20: 8002 /api/v2/channels/samsung.remote.control?name=dGVzdA=='

我假设提供 wss 地址在这两种情况下都会被自动检测为安全的 websocket 请求。

4

1 回答 1

0

好的,我发现在我的案例中这两个 API 有什么区别!

在 python 中,当我这样做时,我成功地与 wscat 连接:

import asyncio
import websockets
import ssl

async def connect(uri):
    #HIGHLY INSECURE
    ssl_context = ssl.SSLContext()
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE
    #HIGHLY INSECURE
    async with websockets.connect(uri, ssl=ssl_context) as websocket:
        message = await websocket.recv()
        dprint(message)

uri = ...
asyncio.get_event_loop().run_until_complete(connect(uri))

asyncio 只是在调用异步连接后不会冻结我的应用程序 python 脚本。

我认为最有趣的部分是ssl_context.check_hostname = False.

Wscat 上的选项 -n 描述如下:-n, --no-check do not check for unauthorized certificates

我认为给予sslopt={"cert_reqs": ssl.CERT_NONE}python websocket 实现是等价的,但显然还应该指定他们不想检查主机名。

于 2020-11-25T23:12:48.483 回答