无法使SSL可以用于安全Websocket连接

时间:2018-08-29 01:54:09

标签: python-3.x ssl websocket

我是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代码的想法。有人可以解释其背后的逻辑吗?

2 个答案:

答案 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 ...