使用Docker Compose+HTTPS部署Qdrant时遇证书验证失败问题
问题分析与解决方案
核心原因
searchai容器无法验证Qdrant的SSL证书,是因为容器内没有安装mkcert生成的本地根证书。主机能正常连接是因为mkcert自动把根证书添加到了主机的信任存储中,但容器是独立环境,默认不包含该根证书。
解决方案
1. 定位mkcert根证书路径
在主机上执行命令获取根证书所在目录:
mkcert -CAROOT
默认输出为~/.local/share/mkcert/,目录下的rootCA.pem就是需要的根证书文件。
2. 修改Docker Compose,挂载根证书到searchai容器
假设你的searchai服务在docker-compose中定义为searchai,添加volume挂载根证书,并更新容器的证书信任存储:
services: # 保留原有qdrant配置不变 qdrant: ... searchai: # 原有配置(镜像、端口等)不变 image: your-searchai-image ports: - "8000:8000" # 添加根证书挂载 volumes: - ~/.local/share/mkcert/rootCA.pem:/usr/local/share/ca-certificates/mkcert-rootCA.crt # 启动时更新证书信任(针对Debian/Ubuntu系镜像) command: sh -c "update-ca-certificates && python manage.py runserver 0.0.0.0:8000"
若searchai使用Alpine镜像,启动命令改为:
sh -c "cp /usr/local/share/ca-certificates/mkcert-rootCA.crt /etc/ssl/certs/ && update-ca-certificates && python manage.py runserver 0.0.0.0:8000"
3. 代码层面指定CA证书(无需系统级信任)
如果不想修改容器的系统信任存储,可直接在QdrantClient初始化时指定根证书路径:
qdrant_client = QdrantClient( url=kwargs.get("url", "https://qdrant"), port=kwargs.get("port", 6333), api_key=kwargs.get("apikey"), timeout=kwargs.get("timeout", 1000), # 指定挂载到容器内的根证书路径 ssl_ca_cert="/usr/local/share/ca-certificates/mkcert-rootCA.crt" )
4. 验证证书SAN包含容器名(可选)
确认生成的证书包含qdrant主机名,执行命令检查:
openssl x509 -in ./qdrant_data/tls/qdrant_3.pem -text -noout | grep -A 1 "Subject Alternative Name"
输出需包含DNS:qdrant,若缺失则重新生成证书:
mkcert qdrant localhost 127.0.0.1 ::1
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

