与安全的pythonwebsockets抗争

与安全的pythonwebsockets抗争,python,nginx,ssl,websocket,cloudflare,Python,Nginx,Ssl,Websocket,Cloudflare,我正在尝试设置一个安全的websocket服务器。 然而,每当我尝试使用SSL保护它时,我都会出现错误[注意:如果我没有启用SSL,它就会工作] 使用此当前设置时,客户端会显示[SSL:CERTIFICATE\u VERIFY\u FAILED]CERTIFICATE VERIFY FAILED:无法获取本地颁发者证书(\u SSL.c:1129) 服务器: import websockets, asyncio, ssl async def hello(s, path): data =

我正在尝试设置一个安全的websocket服务器。 然而,每当我尝试使用SSL保护它时,我都会出现错误[注意:如果我没有启用SSL,它就会工作] 使用此当前设置时,客户端会显示
[SSL:CERTIFICATE\u VERIFY\u FAILED]CERTIFICATE VERIFY FAILED:无法获取本地颁发者证书(\u SSL.c:1129)

服务器:

import websockets, asyncio, ssl

async def hello(s, path):
    data = await s.recv()
    await s.send(data)
    print("Got data:", data)

ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain('origin.pem', 'private.pem')
start_server = websockets.serve(hello, "0.0.0.0", 87, ssl = ssl_context)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
客户:

import websockets, asyncio, ssl

ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
ssl_context.load_verify_locations('origin.pem')

async def hello():
    async with websockets.connect("wss://socket.ganer.xyz/gsdgsdfg", ssl = ssl_context) as s:
        await s.send("Test")
        print("Got data:", await s.recv())

asyncio.get_event_loop().run_until_complete(hello())
我的安装程序在端口87上运行,
wss://socket.ganer.xyz
指向运行nginx的VPS,该VPS会将其重定向到我家的服务器

Cloudflare Worker:

Cloudflare证书[这些证书适用于我的主网站]:

Nginx VPS配置:

编辑,修复:基本上,我放弃了工人,重新编辑了一些NGINX的东西。端口80转到nginx,nginx重定向到my home server上的端口87。Socket.ganer.xyz只是一个指向VPS的A记录

新配置:

并将客户端上的SSL上下文替换为以下内容:
SSL.create\u default\u context(purpose=SSL.purpose.SERVER\u AUTH)


这是cloudflare原产地证书

Cloudflare源证书仅受Cloudflare信任。它们不是由公开发布的CA发布的,这就是Python默认不信任它们的原因


此行不使用受信任的证书建立连接。相反,它信任给定证书颁发的任何证书。由于这是休假证书,因此无法颁发任何证书。您需要信任相关的根CA,并确保服务器发送所有相关的中间证书。

origin.pem的内容是什么?请确保您也包括所有中间证书。这是cloudflare源证书。我该怎么做才能解决这个问题?@Ganer:引用我自己的话:“您需要信任相关的根CA,并确保服务器发送所有相关的中间证书。”是的,但我该怎么做,我基本上对这一切一无所知this@Ganer:可以找到相关的根CA。在
ssl\u上下文中使用此选项。加载\u验证\u位置
而不是您的
origin.pem
ssl_context.load_verify_locations('origin.pem')