我的Python安全WebSocket客户端代码给了我如下异常:
[SSL:CERTIFICATE_VERIFY_FAQUE]证书验证失败(_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与龙卷风如下:
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
5条答案
按热度按时间b4lqfgs41#
对我来说,忽略错误不是一个选项,我不得不使用我的自签名证书,因为在复杂的物联网环境中使用SSL固定:
在WebSocket repo的examples文件夹中找到了here。
附言
我将其从
SSLContext(ssl.PROTOCOL_TLS_CLIENT)
更改为SSLContext(ssl.PROTOCOL_TLSv1_2)
以使其工作erhoui1w2#
最后我找到了一个解决方案,我更新了python客户端脚本,同时连接到安全的Web Socket URL以忽略cert请求,如下所示:
eblbsuwk3#
如果将来有人好奇为什么wss python服务器会失败,那就是因为tornado文档中的这一点:
当使用带有自签名证书的安全WebSocket连接(wss://)时,来自浏览器的连接可能会失败,因为它想显示“接受此证书”对话框,但没有地方显示它。在WebSocket连接成功之前,您必须首先使用相同的证书访问常规HTML页面以接受它。
vdgimpew4#
仅出于测试目的尝试以下操作。下面是一个非常不安全的kluge:
zf9nrax15#
似乎大多数答案都建议禁用TLS验证,这并不理想。
这里有一个工作示例,TLS验证启用,我认为这是默认情况下应该做的,除非你在localhost或类似的环境中工作。