首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建Python安全websocket客户端请求?

如何创建Python安全websocket客户端请求?
EN

Stack Overflow用户
提问于 2017-10-20 15:08:13
回答 4查看 46.3K关注 0票数 16

我的Python安全websocket客户端代码给了我以下异常:

SSL: CERTIFICATE_VERIFY_FAILED证书验证失败(_ssl.c:748)

我已经创建了我的私有证书和签名证书,但是我无法使用Python脚本连接到它,如下所示:

代码语言:javascript
运行
复制
import json
from websocket import create_connection


class subscriber:
   def listenForever(self):
   try:
      # ws = create_connection("wss://localhost:9080/websocket")
      ws = create_connection("wss://nbtstaging.westeurope.cloudapp.azure.com:9090/websocket")
      ws.send("test message")
      while True:
          result = ws.recv()
          result = json.loads(result)
          print("Received '%s'" % result)

      ws.close()
  except Exception as ex:
      print("exception: ", format(ex))


try:
    subscriber().listenForever()
except:
    print("Exception occured: ")

我在python中的https/wss服务器脚本如下所示:

代码语言:javascript
运行
复制
import tornado.web
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import os
import ssl

ssl_root = os.path.join(os.path.dirname(__file__), 'ssl1_1020')


class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def check_origin(self, origin):
        return True

    def open(self):
        pass

    def on_message(self, message):
        self.write_message("Your message was: " + message)
        print("message received: ", format(message))

    def on_close(self):
        pass


class IndexPageHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
           (r'/', IndexPageHandler),
           (r'/websocket', WebSocketHandler),
        ]

        settings = {
            'template_path': 'templates'
        }
        tornado.web.Application.__init__(self, handlers, **settings)


ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain(ssl_root+"/server.crt",
                    ssl_root + "/server.pem")


if __name__ == '__main__':
    ws_app = Application()
    server = tornado.httpserver.HTTPServer(ws_app, ssl_options=ssl_ctx,)
    server.listen(9081, "0.0.0.0")
    print("server started...")
    tornado.ioloop.IOLoop.instance().start()

用于创建SSL签名证书的步骤:

代码语言:javascript
运行
复制
openssl genrsa -des3 -out server.key 1024
openssl rsa -in server.key -out server.pem
openssl req -new -nodes -key server.pem -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.pem -out server.crt
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-24 09:02:04

最后,我找到了一个解决方案,我更新了python客户端脚本,同时连接到安全web套接字url,以忽略cert请求,如下所示:

代码语言:javascript
运行
复制
 import ssl
 import websocket

 ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
 ws.connect("wss://xxx.com:9090/websocket")
票数 17
EN

Stack Overflow用户

发布于 2019-07-19 09:14:48

对我来说,忽略这些错误不是一个选项,我不得不使用我自己签名的证书,因为SSL固定在一个复杂的IoT环境中:

代码语言:javascript
运行
复制
import asyncio
import pathlib
import ssl
import websockets

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

async def hello():
    uri = "wss://localhost:8765"
    async with websockets.connect(
        uri, ssl=ssl_context
    ) as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")

asyncio.get_event_loop().run_until_complete(hello())

在websocket的示例文件夹中找到了这里

P.S

我将它从SSLContext(ssl.PROTOCOL_TLS_CLIENT)改为SSLContext(ssl.PROTOCOL_TLSv1_2)以使其工作

票数 12
EN

Stack Overflow用户

发布于 2018-02-28 00:44:10

如果将来有人对wss python服务器失败感到好奇的话,这就是龙卷风文档中的原因:

当使用带有自签名证书的安全websocket连接(wss://)时,来自浏览器的连接可能会失败,因为它希望显示“接受此证书”对话框,但没有地方显示它。在websocket连接成功之前,您必须首先使用相同的证书访问常规HTML页面来接受它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46852066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档