Tornado WebSocketHandler不会响应SSL请求

时间:2013-10-08 18:21:54

标签: python ssl websocket tornado

我有一个Tornado HTTPServer初始化如下:

ssl_options = {
    "certfile": "mycert.crt",
    "keyfile": "mykey.key"
}
server = tornado.httpserver.HTTPServer(application, xheaders=True,
        ssl_options=ssl_options)

它有一个带有open()方法的WebSocketHandler。

当我尝试从Chrome 30控制台通过Javascript打开安全的websocket连接时,例如

var sock = new WebSocket("wss://localhost:9001/mywebsocket");

连接未成功打开,没有日志输出,并且未调用WebSocketHandler的open()

如何在Tornado中打开并维护与Javascript客户端的安全(SSL)WebSocket连接?

尝试不安全的连接,例如

var sock = new WebSocket("ws://localhost:9001/mywebsocket");

导致Tornado日志中出现以下错误:

2013-10-08 13:59:55,305 tornado.general 820 : SSL Error on 8 ('192.168.149.27', 62851): [Errno 1] _ssl.c:490: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request

同样在这种情况下,连接未成功打开,并且未调用open()

附加信息:错误消息中IP之后的数字(上例中的62851)随着每个请求(安全或其他)而增加。我不知道那个号码是什么,但它确实表明该请求至少要到达服务器。

此外,从构造函数中删除ssl_options并向服务器发出不安全的(ws://)请求可以解决问题。

正在使用的证书是自签名的。要通过curl与服务器的HTTP端点通信,我必须使用--insecure标志。

1 个答案:

答案 0 :(得分:1)

如果您从javascript控制台启动连接,浏览器将无法向您显示自签名证书警告并让您有机会接受它。如果你先去https://localhost:9001并在那里接受证书,它有用吗?