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 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
updatedipython
(2.1.0) andTornado
(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, thejs/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'