私のPython安全なwebsocketクライアントコードで、次のような例外が発生します。
[SSL:CERTIFICATE_VERIFY_FAILED]証明書の検証に失敗しました(_ssl.c:748)
プライベート証明書と署名証明書も作成しましたが、次のようにPythonスクリプトを使用して接続することができません。
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: ")
私のhttps/wssサーバースクリプトpython tornado with following:
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署名付き証明書の作成に使用される手順:
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
最後に解決策を見つけ、次のように証明書リクエストを無視するためにセキュアなWebソケットURLに接続しているときにpythonクライアントスクリプトを更新しました。
import ssl
import websocket
ws = websocket.WebSocket(sslopt={"cert_reqs": ssl.CERT_NONE})
ws.connect("wss://xxx.com:9090/websocket")
Wss pythonサーバーが失敗する理由が将来的に興味がある場合、これは竜巻のドキュメントにあるこのためです:
自己署名証明書で安全なWebSocket接続(wss://)を使用すると、「この証明書を受け入れる」ダイアログを表示したいが、どこにも表示できないため、ブラウザからの接続が失敗する場合があります。 WebSocket接続が成功する前に、同じ証明書を使用して通常のHTMLページにアクセスし、それを受け入れる必要があります。
テスト目的でのみ以下を試してください。以下は非常に安全でないクルージです:
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}")