我试图在我的Apache 2.4.7服务器上设置一个安全的Jupyter笔记本。 如果有更好,更简单或者更安全的方式来做,那会很棒。 我知道AuthType Basic并没有真正增加太多,我只是在玩Apache,为了完整性,我在这里包含了它。 当我通过HTTPbuild立一个不安全的笔记本电脑时,它可以工作,但显然这是一个坏主意。
我遇到的问题具体是
但只有当通过我的域名访问它。 显然它必须得到保护,因为我通过它暴露python。 Apache不会为此logging错误,但Jupyter笔记本SSL Error on某些数字('127.0.0.1',某些数字): [SSL: WRONG_VERSION_NUMBER_NUMBER] wrong version number (_ssl.c:600) SSL Error on引发SSL Error on ): [SSL: WRONG_VERSION_NUMBER_NUMBER] wrong version number (_ssl.c:600)
我有Jupyter设置了SSL,并可以通过正常的https://localhost:8888/tree来访问它,它在https://www.[mydomain].com/ipython中确认了相同的连接细节和技术细节Chrome和Firefox中页面的安全选项卡
Jupyter似乎默认为TLS 1.0,根据openssl s_client -connect localhost:8888 ,select另一个协议得到SSL: WRONG_VERSION_NUMBER按预期。 diff <(openssl s_client -connect www.[mydomain].com:443 </dev/null) <(openssl s_client -connect localhost:8888 </dev/null)显示没有真正的差异。 由于url的大小,可以肯定的是,会话ID,主密钥和TLS会话票据的字节差异是不同的。
我的jupyter_notebook_config.py ( 切割和卫生的一种?)看起来像:
c = get_config() c.NotebookApp.certfile = u'[/my/cert/here].pem' c.NotebookApp.keyfile = u'[/my/cert/here].pem' c.NotebookApp.open_browser = False c.NotebookApp.password = u'sha1:[much:password:sha:such:wow]' c.NotebookApp.port = 8888 c.NotebookApp.tornado_settings = { 'headers': { 'Content-Security-Policy': "frame-ancestors 'https://www.[mydomain].com' 'self' " } }
我用ipython指令(和幸运的是jupyter相同)和一个引入密钥文件的bug报告来设置它。 我使用openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout [mycert.pem] -out [mycert.pem]来设置证书,如错误报告中所build议的,密钥和证书附加在一起以简化。 我会得到一个真正的后来签署。 由于它在本地工作(浏览器投诉localhost不匹配CN www.[mydomain].com ,在通过网站访问时没有出现),我想可以正确地获得Apache服务器设置是唯一的事情,失踪了
拉几个相关,但不幸的是不完全复制stackoverflow和serverfault ( c.NotebookApp.ip = '*' / 'localhost'没有帮助)的问题,我到了设置:
SSLProxyEngine on SSLProtocol TLSv1 SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off ServerName www.[mydomain].com SSLCertificateFile [/my/cert/here].pem <Location /ipython> ProxyPass https://localhost:8888/tree ProxyPassReverse https://localhost:8888/tree ProxyAddHeaders On ProxyPreserveHost On ProxyPassReverseCookieDomain localhost www.[mydomain].com RequestHeader set Origin "https://localhost:8888" AuthType Basic AuthName "Warning: Who are you?" AuthUserFile [/password/file/just/for/fun/].htpasswd Require valid-user Require ssl </Location> <Location /kernelspecs/> ProxyPass ws://localhost:8888/kernelspecs/ ProxyPassReverse ws://localhost:8888/kernelspecs/ ProxyAddHeaders On ProxyPreserveHost On AuthType Basic AuthName "Warning: Who are you?" AuthUserFile [/password/file/just/for/fun/].htpasswd Require valid-user Require ssl </Location> <Location /static/> ProxyPass ws://localhost:8888/static/ ProxyPassReverse ws://localhost:8888/static/ ProxyAddHeaders On ProxyPreserveHost On AuthType Basic AuthName "Warning: Who are you?" AuthUserFile [/password/file/just/for/fun/].htpasswd Require valid-user Require ssl </Location> <Location /ipython/api/kernels/> ProxyPass ws://localhost:8888/ipython/api/kernels/ ProxyPassReverse ws://localhost:8888/ipython/api/kernels/ ProxyAddHeaders On ProxyPreserveHost On AuthType Basic AuthName "Warning: Who are you?" AuthUserFile [/password/file/just/for/fun/].htpasswd Require valid-user Require ssl </Location> <Location /login> ProxyPass ws://localhost:8888/login ProxyPassReverse ws://localhost:8888/login ProxyAddHeaders On ProxyPreserveHost On AuthType Basic AuthName "Warning: Who are you?" AuthUserFile [/password/file/just/for/fun/].htpasswd Require valid-user Require ssl </Location>
现在,Jupyter笔记本运行在terminal上,所以我可以看到输出,因为我访问它的各种。
由于错误来自Jupyter而不是Apache,所以Apache和Jupyter之间的通信似乎是一个问题。 如果Jupyter的websocket服务器期待encryption的连接(它似乎是,因为它抱怨),而不是使用ws://scheme,您将需要使用wss://