You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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(生产环境绝对禁止,会有安全风险)

火山引擎 最新活动