web-dev-qa-db-fra.com

Comment créer Python demande du client websocket sécurisé?

Mon Python code client websocket sécurisé me donnant l'exception comme suit:

[SSL: la vérification du certificat CERTIFICATE_VERIFY_FAILED] a échoué (_ssl.c: 748)

J'ai également créé mon certificat privé et signé le certificat, mais je ne peux pas me connecter à celui-ci à l'aide du script Python comme suit:

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: ")

Mon script de serveur https/wss dans python avec tornade comme suit:

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()

étapes utilisées pour créer des certificats signés SSL:

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
7
Ravi Anand

Enfin, j'ai trouvé une solution, j'ai mis à jour le script client python tout en établissant la connexion à l'URL du socket Web sécurisé pour ignorer la demande de certificat comme suit:

 import ssl
 import websocket

 ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
 ws.connect("wss://xxx.com:9090/websocket")
8
Ravi Anand

Si quelqu'un est curieux à l'avenir de savoir pourquoi wss python échoue, c'est à cause de cela ici dans la documentation de la tornade:

Lorsque vous utilisez une connexion WebSocket sécurisée (wss: //) avec un certificat auto-signé, la connexion à partir d'un navigateur peut échouer car il souhaite afficher la boîte de dialogue "Accepter ce certificat" mais n'a nulle part où l'afficher. Vous devez d'abord visiter une page HTML standard en utilisant le même certificat pour l'accepter avant que la connexion websocket réussisse.

2
Master Splinter

Essayez uniquement ce qui suit à des fins de test uniquement. Ce qui suit est un kluge très peu sûr:

import asyncio, ssl, websockets

#todo kluge
#HIGHLY INSECURE
ssl_context = ssl.SSLContext()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
#HIGHLY INSECURE
#todo kluge

uri = "wss://myAwesomeSSL.wss.kluge"

async with websockets.connect(uri, ssl=ssl_context) as websocket:
        greeting = await websocket.recv()
        print(f"< {greeting}")
1
JDOaktown