为何无法将代理连接至自托管Azure DevOps服务器?
本地DevOps Linux代理导入自定义证书后仍报SSL验证错误
问题描述
按照官方教程创建本地部署的Microsoft DevOps Linux Docker代理,操作流程:
- 创建目录,复制
Dockerfile和start.sh - 执行构建命令:
docker build -t my_agent . - 运行容器:
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
相关产品推荐
相关产品推荐

