我遇到了 SSL 证书的问题,我无法理解,并且我不确定这是否是 Databricks 有时令人困惑的文件系统的问题,或者是 curl / 证书的工作方式的问题。
我们的应用程序使用 API 连接到公司内部资源。为了避免众所周知的“证书链中的自签名证书”,我们为公司提供公开托管的 .crt 文件以及 API 调用。该应用程序是用 Python 编写的,但为了将其分解为curl 命令,我们在 Databricks 中使用以下内容:
如您所见,这抱怨证书验证位置。但是,该文件肯定确实存在:
在我的本地 PC 上的 Ubuntu shell 中,完全相同的命令(使用 --cacert 提供 .crt 文件位置)工作得很好 - 所以我有点困于在这里做什么。除了文件不在该位置之外,是否可以由其他原因触发此错误?例如。防火墙问题? Databricks 是否可能以特殊方式处理 /tmp/ 路径?有进一步调试的想法吗?
我在 stackoverflow 上找到了一些相关的线程,例如这个,但我已经尝试将 .crt 文件移动到其他文件夹或以 sudo 方式执行curl,但没有任何效果。很高兴收到任何建议或线索。
处理此问题的最佳方法是使用集群或全局初始化脚本将证书安装到系统链中。唯一需要注意的是,您需要将证书颁发机构的 SSL 证书放在 DBFS 上,然后将其引用为本地路径
/dbfs/<path-on-dbfs>
,这可能不适用于具有 Unity Catalog 或 DBSQL 仓库的共享集群。
我有一个初始化脚本示例,它执行该任务并将 CA 的 SSL 证书安装到三个位置:
certifi
包提供。事实证明,这是我们的防火墙的问题,再加上curl的误导性错误消息和我们的证书下载脚本的奇怪行为。
对于任何遇到此问题的人来说,关键的一点是
error setting certificate verify location
可能意味着找不到证书,但它也可能意味着证书文件无效 - 我们假设它是有效的,因为我们预计会出现不同的错误消息如果证书已找到但无效。
在我们的例子中,证书文件实际上完全是空的 - 我们公司在过去的某个时间更改了一些防火墙规则,意外阻止了与我们的证书服务器的连接,当我们的脚本上个月尝试重新下载证书时,它反而创建了一个空文件 - 如上所述,它引发了一条错误消息,使我们相信该文件丢失而不是损坏。