You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法将代理连接至自托管Azure DevOps服务器?

本地DevOps Linux代理导入自定义证书后仍报SSL验证错误

问题描述

按照官方教程创建本地部署的Microsoft DevOps Linux Docker代理,操作流程:

  1. 创建目录,复制Dockerfile和start.sh
  2. 执行构建命令:docker build -t my_agent .
  3. 运行容器:docker run -e AZP_URL=https://my_server -e AZP_TOKEN=my_token -e AZP_AGENT_NAME=my_agent my_agent

因服务器使用自定义证书,修改Dockerfile导入证书:

WORKDIR /azp
COPY ./my_server.crt /usr/local/share/ca-certificates/
COPY ./start.sh  ./
RUN update-ca-certificates && chmod +x start.sh

# ENTRYPOINT [ "/azp/start.sh" ]

调试时,容器内执行curl -v https://my_server/无证书错误,但运行start.sh脚本时失败,报错:

The SSL connection could not be established, see inner exception.

日志详情:

---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

原因分析

curl等系统工具依赖Linux系统的CA证书存储(已通过update-ca-certificates更新),但Azure DevOps代理基于.NET运行,.NET默认不会自动完全继承系统CA证书配置,导致代理程序无法识别导入的自定义证书。

解决方法

方法1:设置.NET环境变量强制使用系统证书

在docker run命令中添加环境变量,让.NET使用系统的证书处理逻辑:

docker run -e AZP_URL=https://my_server -e AZP_TOKEN=my_token -e AZP_AGENT_NAME=my_agent -e DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0 my_agent

也可以直接在Dockerfile中添加环境变量配置:

ENV DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0

方法2:确保.NET能读取系统完整证书链

虽然update-ca-certificates已更新系统证书,但可手动将证书复制到.NET的专属证书目录,确保.NET进程能加载:
修改Dockerfile,添加以下步骤:

RUN mkdir -p /usr/local/share/dotnet/ssl/certs && \
    cp /usr/local/share/ca-certificates/my_server.crt /usr/local/share/dotnet/ssl/certs/

方法3:指定证书路径环境变量

在start.sh脚本开头添加环境变量,强制.NET使用系统的CA证书文件:

export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt

额外检查项

  • 确认my_server.crt是PEM格式(可通过openssl x509 -in my_server.crt -text -noout验证,能正常输出证书信息即为有效)
  • 如果自定义证书由中间CA签发,需将中间CA证书也复制到/usr/local/share/ca-certificates/目录,再执行update-ca-certificates,确保证书链完整

内容的提问来源于stack exchange,提问作者Pascal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:52:31