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

Gitlab手动Job执行Curl请求遇自签名证书错误如何解决?

解决GitLab CI手动Job中Curl自签名证书验证失败问题

问题原因

本地命令提示符能成功调用是因为你的本地系统信任存储已经导入了目标接口的自签名CA证书,但GitLab Runner的运行环境(虚拟机、Docker容器或独立服务)默认没有这个证书,导致curl验证服务器证书合法性时失败。

解决方案

方案1:临时跳过SSL证书验证(不推荐生产环境)

直接在curl命令中添加-k或--insecure参数,强制跳过证书验证:

test-manual-job:
  stage: demo-test
  when: manual
  variables:
    QNAME: "${QNAME}"
  script:
    - echo "Hello world. User input is ${QNAME}"
    - curl -X GET -H 'Accept:application/json' "https://main-demo-services.nr.dflop-swf-prod.bee.ds.local/services/dataUser/reloadStatus/" --ssl-no-revoke -k

方案2:将自签证书导入GitLab Runner信任存储(推荐生产环境)

步骤1:导出目标服务器的CA证书

在本地终端执行以下命令导出证书(Windows用户可直接从浏览器导出证书为PEM格式):

openssl s_client -connect main-demo-services.nr.dflop-swf-prod.bee.ds.local:443 < /dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > ca-cert.pem

步骤2:上传证书到GitLab项目

将导出的ca-cert.pem文件放到项目根目录的certs文件夹下(没有就新建一个),并提交到Git仓库。

步骤3:修改CI配置导入证书

根据Runner的执行环境选择对应配置:

  • Linux/Docker Runner:
test-manual-job:
  stage: demo-test
  when: manual
  variables:
    QNAME: "${QNAME}"
  before_script:
    - mkdir -p /usr/local/share/ca-certificates/
    - cp certs/ca-cert.pem /usr/local/share/ca-certificates/
    - update-ca-certificates
  script:
    - echo "Hello world. User input is ${QNAME}"
    - curl -X GET -H 'Accept:application/json' "https://main-demo-services.nr.dflop-swf-prod.bee.ds.local/services/dataUser/reloadStatus/" --ssl-no-revoke
  • Windows Runner:
test-manual-job:
  stage: demo-test
  when: manual
  variables:
    QNAME: "${QNAME}"
  before_script:
    - Import-Certificate -FilePath certs/ca-cert.pem -CertStoreLocation Cert:\LocalMachine\Root
  script:
    - echo "Hello world. User input is ${QNAME}"
    - curl -X GET -H 'Accept:application/json' "https://main-demo-services.nr.dflop-swf-prod.bee.ds.local/services/dataUser/reloadStatus/" --ssl-no-revoke

方案3:Docker Executor专用 - 挂载证书到容器

如果你的GitLab Runner使用Docker executor,且Runner配置允许挂载本地文件,可以直接将证书挂载到容器的信任目录:

test-manual-job:
  stage: demo-test
  when: manual
  variables:
    QNAME: "${QNAME}"
  image: alpine:latest
  volumes:
    - ./certs/ca-cert.pem:/usr/local/share/ca-certificates/ca-cert.pem
  before_script:
    - update-ca-certificates
  script:
    - echo "Hello world. User input is ${QNAME}"
    - curl -X GET -H 'Accept:application/json' "https://main-demo-services.nr.dflop-swf-prod.bee.ds.local/services/dataUser/reloadStatus/" --ssl-no-revoke

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:33:13