Docker容器中使用Azure Log Analytics Python SDK拉取数据时SSL证书验证失败求助
Docker容器中使用Azure Log Analytics Python SDK拉取数据时SSL证书验证失败求助
我之前在公司ZScaler代理环境下,也碰到过容器里Azure SDK SSL验证失败的一模一样的问题,给你几个排查和解决的方向,应该能搞定:
1. 先把ZScaler证书转成正确的格式
ZScaler导出的.cer一般是DER二进制格式,但系统的ca-certificates只认PEM文本格式的证书。你先在本地把证书转成PEM格式:
# 本地执行转换,输出后缀用.crt(系统识别的格式) openssl x509 -inform DER -in zscalercert.cer -out zscalercert.crt
2. 调整Dockerfile的证书加载逻辑
你的Dockerfile里注释了证书复制步骤,而且顺序也有点问题。修改成下面的流程,确保证书被正确加入系统信任链:
FROM ubuntu:24.04 RUN apt-get update && apt-get install -y \ python3.12 \ python3-pip \ curl \ gnupg \ unixodbc-dev \ ca-certificates \ openssl \ && rm -rf /var/lib/apt/lists/* # 微软ODBC驱动安装步骤不变 RUN curl -sSL https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl -sSL https://packages.microsoft.com/config/ubuntu/22.04/prod.list > /etc/apt/sources.list.d/mssql-release.list RUN apt-get update RUN ACCEPT_EULA=Y apt-get install -y msodbcsql18 WORKDIR /usr/local/app # 先复制转换好的ZScaler证书到系统CA目录 COPY server/zscalercert.crt /usr/local/share/ca-certificates/ # 强制刷新CA证书缓存,确保新证书被加载 RUN update-ca-certificates --fresh # 后续的依赖安装、代码复制步骤不变 COPY requirements.txt ./ RUN pip install --break-system-packages --no-cache-dir -r requirements.txt COPY . . # 关键:强制Python用系统的CA证书(避免用certifi自带的bundle) ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt CMD ["python3", "server/server.py"]
3. 代码层面的兜底方案(如果系统CA还是不生效)
如果上面的步骤还是不行,直接在LogsQueryClient初始化时指定ZScaler证书的绝对路径(要和容器里的路径完全对应):
from azure.monitor.query import LogsQueryClient from azure.identity import DefaultAzureCredential import datetime # 注意:这里的路径是容器内的证书路径,要和Dockerfile里COPY的一致 client = LogsQueryClient(credentials, verify="/usr/local/app/server/zscalercert.crt") response = client.query_workspace( workspace_id=LOG_ANALYTICS_WORKSPACE_ID, query=kqlQuery, timespan=(datetime.utcnow() - timeDeltaHrs, datetime.utcnow()) ) data = response.tables[0].rows
4. 验证证书是否生效的小技巧
可以在容器里手动测试SSL连接,确认证书是否能正常验证Azure的API:
# 进入运行中的容器 docker exec -it <你的容器ID> bash # 测试连接Log Analytics API openssl s_client -connect api.loganalytics.io:443 -CAfile /etc/ssl/certs/ca-certificates.crt
如果最后输出Verify return code: 0 (ok),说明证书已经生效了。
常见坑点提醒
- 确保本地的
server/zscalercert.crt是转换后的PEM格式,不要用原来的.cer - Dockerfile里的
COPY路径要和你的本地文件结构对应(比如你本地的证书在./server目录下,容器里才会被复制到/usr/local/app/server) - 不要用
verify=False(生产环境绝对禁止,会有安全风险)




