IPython Websocket Failure on Chrome

Andrew Bolster

Data Science Team Lead at WhiteHat Security, Trustee at Farset Labs and Vault Artist Studios

IPython is an amazing tool, and in particular IPython Notebook, which is easily the best ‘python scratch-pad’ I’ve ever used.

However, a while ago something strange happened to my set up and I’m not entirely sure when or how but either way, here’s how I ‘fixed’ it.

The Problem

TL;DR Can’t execute anything at all using Chrome, works fine in other browsers.

WebSocket Fail

WebSocket connection failed

A WebSocket connection could not be established. You will NOT be able to run code. Check your network connection or notebook server configuration

This was accompanied by a JS console error (rightclick anywhere in Chrome and ‘Inspect Element’ will open up the dev tools)

WebSocket connection to ‘wss://localhost:8888/api/kernels/a893ce6e-3a3d-4a99-afc0-b02368245d32/stdin’ failed: WebSocket is closed before the connection is established.

No unexpected error messages show up in the ipython notebook --debug log.

The Setup

  • Fully pip updated ipython (2.1.0) and Tornado (4.0)
  • Latest Chrome (36.0)
  • Fully updated Linux Mint 17 Qiana
  • Password protected notebooks configured. No change to configuration files since before ‘issue’

The Attempts

This is a surprisingly difficult thing to Google and I got many ‘that kinda looks like my problem but not quite’, so here’s a quick off the top of my head list of the things I tried.

  • Chromes proxy is screwed, use ip address instead of ‘localhost’ (also tried FQDN and a few other things), as well as clearing cache, etc Interestingly, Chromes Proxy configuration defaults to the system setting which was all disabled anyway so this was a long shot.

  • Maybe Chromes Websocket implementation is stuffed, or I’d played with a ‘flag’, so reset all to defaults. Nope.

  • IPython install broken somehow? As per the instructions I’d launched a iptest and all came back within bounds (however, the js/notebook tests were disabled and I can’t find any instruction anywhere as to enabling them, lemme know in the comments.

  • Tornado conflict? Every so often Tornado does a ‘breaking update’ so maybe there’s some update-race-condition. Also the Quickstart implies that Tornado 2.1 is the required version, so I tried it out, no joy.

  • Another process occupying the same port? This was reported as a potential problem on some Mac machines but at this point I was getting desparate. Quick lsof stuffed that idea.

The “Fix”

I’ll be the first to admit, this ‘fix’ doesn’t actually fix is so much as side-steps the breaking condition by wrapping the whole conversation into an SSL tunnel.

Long story short, enable HTTPS and generate a self-signed cert

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem

And in either your customised profile or in the ipython_notebook_config.py file in ~/ipython/profile_nbdefault/

# The full path to an SSL/TLS certificate file.
c.NotebookApp.certfile = u'$WHEREVER_YOU_PUT/mycert.pem'

Published: July 25 2014

  • tags:
blog comments powered by Disqus