https 上的超集 keycloak 集成

superset keycloak integration on https

我们有一个超集 docker 容器,它使用 keycloak 作为身份代理。所有这些设置在 http 上运行良好。此外,我们在 keycloak 上安装了 ssl 证书,同样工作正常。我们的超集和 keycloak 集成代码更改看起来与答案 .

中提到的完全一样

现在,当我们在 superset/docker/pythonpath_dev/client_secret.json 中将 auth uris 从 http 更改为 https 时,在登录流程从 keycloak 重定向到超集后,我们遇到以下错误。

Forbidden

'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)'

我们还尝试通过将它们安装在 /usr/local/share/ca-certificates 上,然后在容器中执行 update-ca-certificates 来在超集上安装根证书,但仍然没有任何帮助。知道如何解决这个问题吗?

感谢@sventorben 的提示。实际上是 python 无法读取我的 ca 文件。由于我是新手,我会详细说明所有遵循的步骤。但是,其中一些步骤可能是多余的。

  1. 收到我的根和中间 CA 文件后,我首先使用 openssl.
  2. 将它们转换为 PEM 格式,因为它们是 DER 格式
openssl x509 -inform DER -in myintermediary.cer -out myintermediary.crt
openssl x509 -inform DER -in myroot.cer -out myroot.crt
  1. 然后,我将这些文件安装到路径 /usr/local/share/ca-certificates/
  2. 的超集容器中
  3. 然后,我登录到我的容器并执行了 update-ca-certificates 命令并验证了在 /etc/ss/certs/ 路径中添加了 2 个新的 pem 文件,即 myroot.pem 和 [=24] =].
  4. 然后,我将这些 CA 文件添加到容器内的 python certifi。为了找出 cacert.pem 的路径,我在 python 终端中执行了以下命令。
import certifi
certifi.where()
exit()

在这里,第二个命令给了我 cacert.pem 的路径,就像 /usr/local/lib/python3.7/site-pacakges/certifi/cacert.pem.

  1. 在此之后,我在 cacert.pem
  2. 的末尾附加了我的 ca 文件
cat /etc/ssl/certs/myroot.pem /etc/ssl/certs/intermediary.pem >> /usr/local/lib/python3.7/site-pacakges/certifi/cacert.pem
  1. 最后我退出我的容器并重新启动它。
docker-compose stop
docker-compose up -d

注:

我觉得第 3 步是多余的,因为 python 不会从那里读取 CA 文件。但是,我还是做了,我没有心情恢复并再次测试它。

此外,这是我的临时修复,因为在容器内执行命令没有用,因为它们是短暂的。

更新:

以下是生产部署所遵循的步骤。

  1. 使用 openssl 将根证书转换为 PEM 格式。
  2. 将两个 PEM 文件合并到一个新的 PEM 文件中,该文件将作为捆绑包安装。比方说,新的 PEM 文件是 mycacert.pem 并且同样安装在 /app/docker/.
  3. 创建一个名为 start.sh 的 sh 文件并编写如下 2 个命令。
cat /app/docker/mycacert.pem >> /usr/local/lib/python3.7/site-pacakges/certifi/cacert.pem

gunicorn --bind  0.0.0.0:8088 --access-logfile - --error-logfile - --workers 5 --worker-class gthread --threads 4 --timeout 200 --limit-request-line 4094 --limit-request-field_size 8190 'superset.app:create_app()'
  1. 修改docker-compose.yml并更改命令如下。 command: ["/app/docker/start.sh"]
  2. 重启超集容器。
docker-compose stop
docker-compose up -d