Jupyter 笔记本 SSL:WRONG_VERSION_NUMBER 错误仅通过 Apache

Jupyter 笔记本 SSL:WRONG_VERSION_NUMBER 错误仅通过 Apache

我正在尝试在我的 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://

相关内容