返回

Vertex AI 向量数据库检索器错误:CERTIFICATE_VERIFY_FAILED 解决方案

Ai

Vertex AI 向量数据库检索器遭遇 OPENSSL_internal:CERTIFICATE_VERIFY_FAILED 错误

在使用 Langchain、Vertex AI 向量数据库和 GPT-4 构建 GenAI 应用时, 调用向量数据库检索器 (vector_store retriever) 出现 OPENSSL_internal:CERTIFICATE_VERIFY_FAILED 错误。 即使创建向量数据库索引时使用了相同的凭据,问题依旧存在。 下面我们来一步步分析原因, 并给出解决方法。

一、 问题原因分析

这个错误通常指向 SSL/TLS 证书验证环节。CERTIFICATE_VERIFY_FAILED 明确表明客户端(你的代码)无法验证服务器(Vertex AI Matching Engine)提供的 SSL/TLS 证书。 原因可能有以下几种:

  1. 系统时间不同步: 客户端系统时间与服务器时间偏差过大,导致证书有效期校验失败。
  2. 证书链问题: 服务器使用的证书链不完整,或者客户端缺少必要的根证书或中间证书。
  3. 代理问题: 如果你的网络环境使用了代理服务器,代理服务器可能未正确配置 SSL/TLS 终端或转发证书。
  4. 环境问题 系统未正确设置或更新CA证书, 导致对google相关证书不信任
  5. VertexAI SDK 或相关库的 BUG 少数情况下, 是因为版本不兼容问题.

二、 解决方案

针对上述可能的原因,下面提供一系列解决方案,你可以逐一尝试:

1. 校准系统时间

确保运行代码的机器时间准确。可以使用 NTP 服务自动同步时间。

Linux (Ubuntu/Debian):

sudo apt-get install ntp
sudo ntpdate ntp.ubuntu.com

之后可以使用date 命令检查.

Windows:

在“日期和时间”设置中,启用“自动设置时间”和“自动设置时区”。

2. 更新 CA 证书包

客户端需要信任 Google 的根证书。更新系统的 CA 证书包通常可以解决问题。

Linux (Ubuntu/Debian):

sudo apt-get update
sudo apt-get install --reinstall ca-certificates

Linux (CentOS/RHEL):

sudo yum update ca-certificates

Python 环境(使用 requests 库):

如果你使用 requests 库,可以尝试更新 certifi 包:

pip install --upgrade certifi

3. 检查并配置代理 (如果使用代理)

如果你在使用代理服务器,请确保:

  • 代理服务器配置为正确处理 SSL/TLS 连接。
  • 代理服务器信任 Google 的根证书。
  • 在代码中正确配置了代理。

如果你的代码使用 requests,可以通过环境变量或直接在代码中设置代理:

import os
import requests

# 通过环境变量设置
os.environ['HTTP_PROXY'] = 'http://your_proxy_address:port'
os.environ['HTTPS_PROXY'] = 'http://your_proxy_address:port'

# 或者在代码中设置
proxies = {
  'http': 'http://your_proxy_address:port',
  'https': 'http://your_proxy_address:port',
}

# 使用 requests 发送请求时
# response = requests.get(url, proxies=proxies)

4. 显式指定 CA 证书路径 (requests, 部分 Python 环境)

有时, Python 环境可能无法自动找到系统 CA 证书,需要手动指定。

可以使用REQUESTS_CA_BUNDLE环境变量来解决。

  1. 找到你的 CA 证书文件路径: 多数情况下是 pem 格式的文件,具体路径需要根据操作系统和 Python 环境来确定。 上面安装 certifi 包后, certifi.where() 可以返回它的证书位置。
  2. 设置环境变量 REQUESTS_CA_BUNDLE 将该环境变量设为证书文件的完整路径。
export REQUESTS_CA_BUNDLE=/path/to/your/ca-certificates.pem

你也可以在 Python 代码中设置:

import os
os.environ['REQUESTS_CA_BUNDLE'] = '/path/to/your/ca-certificates.pem'

langchain代码运行前指定,即可。

5. Vertex AI SDK 和相关库版本

确认 google-cloud-aiplatformlangchain 和其他相关库是最新版本, 或者是兼容的版本。旧版本有时会出现兼容性问题或 BUG。

pip install --upgrade google-cloud-aiplatform langchain

6. 检查凭据

仔细检查你的服务账号的JsonKey文件,是否包含了所需的权限,且服务账号在Google Cloud 控制台中是否处于激活状态。有时候JsonKey文件是错的,也会引发类似的SSL连接问题。

7. 绕过证书验证 (仅用于测试!)

强烈不建议在生产环境中使用此方法! 这样做会使你的应用面临中间人攻击的风险。 仅在绝对确信网络环境安全,且用于调试或临时测试时,可以考虑禁用证书验证。

修改代码, verify=False, 来绕过 requests 中的证书校验。如果不是直接调用 requests,而是通过其他库间接调用,需要找到相应的设置。Langchain 中不太容易直接修改底层 requests 库的设置,因此该方法通常只适用于调试。

重要:绝对不要在生产环境中使用此方法!

进阶技巧: 证书调试

如果怀疑是Google返回的证书有问题,或者代理篡改了证书,可以使用openssl命令进行调试

openssl s_client -connect your_vertex_ai_endpoint:443 -showcerts

your_vertex_ai_endpoint 替换为你的服务的地址和端口号. 输出会展示证书链等详细信息.检查:
* 证书是否过期。
* 证书链是否完整。
* 证书的颁发机构 (CA) 是否受信任.
* hostname 是否符合.

通过检查这些问题,可以确认是客户端配置错误,还是证书本身有问题.

根据这些信息,再进一步对症下药。