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
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")
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.
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}")