3

我是 Python 新手,但必须构建一个 Websocket API 才能工作。websockets 模块的网站说此代码应该适用于安全的 websocket 连接(https://websockets.readthedocs.io/en/stable/intro.html

但是,我无法让提供的代码工作..

import websockets
import asyncio
import pathlib
import ssl

ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.load_verify_locations(pathlib.Path(__file__).with_name('localhost.pem'))

我得到错误:

回溯(最近一次通话最后):

文件“/Applications/Python 3.7/apii.py”,第 7 行,在模块> ssl_context.load_verify_locations(pathlib.Path(__ file__).with_name('localhost.pem'))

FileNotFoundError: [Errno 2] 没有这样的文件或目录

你能帮帮我吗?

PS。我根本不明白这个 ssl_context 代码。有人可以解释一下它背后的逻辑吗?

4

2 回答 2

7

我从 docker 容器测试 websocket。我有 NAT ips(不能使用 LetsEncrypt),没有 * 域证书。如果我直接在 Firefox 中进行测试,它可以在没有任何证书的情况下正常工作。因此,应该允许在防火墙内禁用 SSL 以进行测试。

提炼:

import asyncio
import websockets
import ssl
:    
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE

async def logIn(uri, myjson):
    async with websockets.connect(uri) as websocket:
        await websocket.send(myjson)

async def logIn(uri, myjson):
    async with websockets.connect(uri, ssl=ssl_context) as websocket:
        await websocket.send(myjson)
        resp = await websocket.recv()
        print(resp)

myurl = f"wss://{args.server}:{args.port}"
print("connection url:{}".format(myurl))

# logdef is the json string I send in
asyncio.get_event_loop().run_until_complete(
    logIn(myurl, logdef)
)
于 2018-10-25T15:21:24.813 回答
0

迟到的答案,但对其他人来说可能仍然很有趣。此特定示例的文档 ( 1 ) 说:

此客户端需要上下文,因为服务器使用自签名证书。使用有效证书(即由您的 Python 安装信任的 CA 签名)连接到安全 WebSocket 服务器的客户端可以简单地将 ssl=True 传递给 connect() 而不是构建上下文。

因此,如果您要访问的服务器的服务器证书具有有效证书,只需执行以下操作:

uri = "wss://server_you_want_to_connect_to_endpoint"
async with websockets.connect(uri, ssl=True) as websocket:
    and so on ...
于 2020-12-27T19:49:06.817 回答