我是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:[错误2]没有这样的文件或目录
你能帮我吗?
PS。我完全不知道这个ssl_context代码的想法。有人可以解释其背后的逻辑吗?
答案 0 :(得分:3)
我从docker容器测试websockets。我有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)
)
答案 1 :(得分: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 ...