Sei*_*ong 5 python ssl docker jupyter jupyter-notebook
我以非root用户身份在ubuntu 16.04 docker容器内运行jupyter笔记本,并通过.pem
文件配置了SSL 。我的问题是,我无法执行jupyter notebook stop $port
命令来停止正在运行的服务器。
我通过执行sudo HOME=/home/seiji -u seiji jupyter notebook
更改HOME
环境变量(称为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
Run Code Online (Sandbox Code Playgroud)
返回错误。它开始:Shutting down server on port 8888 ...
但是随后打印以下内容:
10(':: 1',8888,0,0)上的SSL错误:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:645)
我的猜测是,它尝试使用“ http”地址而不是“ https”来访问服务器,但我不知道如何更改此地址。
我也尝试过传递环境变量JUPYTER_CONFIG_DIR
,该变量包含配置文件,其中该配置.pem
文件用line 列出了文件的位置c.NotebookApp.certfile = u'/jupyter/certs/mycert.pem'
。我也尝试从cmdline运行时显式地输入证书的位置,--certfile=[location]
但似乎被忽略了。有人有什么想法吗?
如果 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 模块)的尊重。
还使用此更新的文件启动服务器的原因是笔记本电脑本身可以连接到服务器(例如用于内省)。