Tornado WebSocketHandler 不会响应 SSL 请求

Posted

技术标签:

【中文标题】Tornado WebSocketHandler 不会响应 SSL 请求【英文标题】:Tornado WebSocketHandler won't respond to SSL request 【发布时间】:2013-10-08 18:21:53 【问题描述】:

我有一个 Tornado HTTPServer 像这样初始化:

ssl_options = 
    "certfile": "mycert.crt",
    "keyfile": "mykey.key"

server = tornado.httpserver.HTTPServer(application, xheaders=True,
        ssl_options=ssl_options)

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

当我尝试通过 javascript 从 Chrome 30 控制台打开安全的 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】:

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

【讨论】:

以上是关于Tornado WebSocketHandler 不会响应 SSL 请求的主要内容,如果未能解决你的问题,请参考以下文章

Tornado-如何在另一个函数中调用处理程序

如何使用 Tornado 向 Web 套接字发送消息

在 Tornado 应用程序中使用 Django - 无法访问 Tornado 应用程序启动后创建的 MySQL 记录

更新输出时的python子进程回调

将 IEnumerable<WebSocketHandler> 转换为 WebSocketCollection

完全停止线程龙卷风 WebSocket 服务器