我在 ubuntu 16.04 docker 容器中运行 jupyter notebook,作为非 root 用户,通过 .pem
配置 SSL文件。我的问题是,我无法执行 jupyter notebook stop $port
命令停止正在运行的服务器。
我通过执行 sudo HOME=/home/seiji -u seiji jupyter notebook
启动笔记本更改HOME
环境变量(被 chown'd 为 seiji)。
我可以执行通常的 jupyter notebook list
以用户身份运行命令 (seiji
) 并输入 JUPYTER_RUNTIME_DIR
jupyter 查找 json
的环境变量包含服务器信息的文件。例如:sudo JUPYTER_RUNTIME_DIR=/jupyter/runtime -u seiji jupyter notebook list
正确返回:https://localhost:8888/ :: /jupyter/notebooks
(我以通常的方式在配置文件中指定运行时目录)。
我的问题是,我不知道如何执行 jupyter notebook stop 8888
以类似的方式。如果我按原样运行它,它会以 root 身份运行并告诉我 There are no running servers
.如果我以 user:seiji
运行它,我遇到了 SSL 问题。如:
> sudo JUPYTER_RUNTIME_DIR=/jupyter/runtime -u seiji jupyter notebook stop 8888
返回错误。它开始于:
Shutting down server on port 8888 ...
但随后打印以下内容:SSL 错误 10 ('::1', 8888, 0, 0): [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:645)
我的猜测是它尝试使用“http”地址而不是“https”来访问服务器,但我不知道如何更改它。
我也试过传递环境变量
JUPYTER_CONFIG_DIR
其中包含列出 .pem
位置的配置文件文件的行 c.NotebookApp.certfile = u'/jupyter/certs/mycert.pem'
.我还尝试在使用 --certfile=[location]
从 cmdline 运行时显式输入证书的位置但似乎这被忽略了。有没有人有任何想法?
最佳答案
如果 Jupyter 使用的任何 SSL 库都无法验证您的证书,则可能会发生这种情况(我认为随着时间的推移,细节发生了一些变化)。如果证书是自签名的,这很常见 - 默认证书存储可能无法验证您的颁发者。我目前用我的 Jupyter 设置脚本做这样的事情:cat mycert.crt | openssl x509 -inform DER >> "$(python -c 'import certifi; print(certifi.where())')"
我相信如果您已经拥有 PEM 形式的证书,那么您只需要:cat mycert.pem >> "$(python -c 'import certifi; print(certifi.where())')"
然后像这样开始:SSL_CERT_FILE=$(python -c 'import certifi; print(certifi.where())') jupyter notebook &
并以类似方式停止:SSL_CERT_FILE=$(python -c 'import certifi; print(certifi.where())') jupyter notebook stop
我使用 certifi
的原因位置和环境变量是 certifi
似乎是最受欢迎的软件包,并且环境设置似乎受到其他库的尊重(包括 requests
和内置 SSL 模块)。
使用此更新文件启动服务器的原因是,笔记本电脑可以自己连接到服务器(例如,用于自省(introspection))。
关于python - jupyter notebook 停止 SSL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49291335/