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
相关产品推荐
相关产品推荐

