我正在尝试在我的 Apache 2.4.7 服务器上设置一个安全的 Jupyter 笔记本。如果有更好、更简单或更安全的方法,那就太好了。我知道 AuthType Basic 并没有增加太多功能,我只是在玩 Apache,为了完整性,我在这里包括它。当我通过 HTTP 设置不安全的笔记本时,它可以工作,但显然这是一个坏主意。
我遇到的问题具体是
但只有通过我的域访问时才会出现这种情况。显然它必须是安全的,因为我通过它暴露了 Python。Apache 不会为此记录错误,但 Jupyter 笔记本会抛出SSL Error on
一些('127.0.0.1',
数字): [SSL: WRONG_VERSION_NUMBER_NUMBER] wrong version number (_ssl.c:600)
我已经使用 SSL 设置了 Jupyter,并且可以通过正常方式访问它,这与 Chrome 和 Firefox 中页面的安全选项卡中的连接详细信息和技术详细信息的https://localhost:8888/tree
设置相同https://www.[mydomain].com/ipython
Jupyter 似乎默认使用 TLS 1.0,根据openssl s_client -connect localhost:8888
,选择另一个协议可以达到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一号幸运的是)以及一个引入密钥文件的错误报告。我按照openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout [mycert.pem] -out [mycert.pem]
错误报告中的建议设置了证书,将密钥和证书附加在一起以简化操作。稍后我会获得一个真正的签名证书。由于它在本地运行(浏览器抱怨与通过网站访问时不会出现localhost
的 CN 不匹配www.[mydomain].com
),我想正确设置 Apache 服务器是我唯一缺少的东西。
从几个相关但不幸的是不完全重复的内容中抽取堆栈溢出和服务器故障(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 笔记本在终端中运行,因此我可以通过各种方式访问它来查看输出。
答案1
由于错误来自 Jupyter 而不是 Apache,因此似乎是 Apache 和 Jupyter 之间的通信问题。如果 Jupyter 的 websocket 服务器需要加密连接(它似乎就是这样,因为它在抱怨),那么 ws://
您需要使用以下方案,而不是使用该方案wss://