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

GitLab CI/CD执行bash命令时curl无法加载PEM证书的问题

问题描述

在GitLab CI/CD的某个阶段执行bash命令时,使用key和pem证书调用脚本出现curl证书加载错误,具体步骤和错误如下:

CI/CD中的执行步骤:

- METHOD="POST"
- key_string="${CLIENT_CERTIFICATE_KEY}"
- pem_string="${CLIENT_CERTIFICATE_PEM}"
- bash ./integration_test.sh DBT_Provision "$METHOD" "$(cat ./provision_and_unprovision_payload_dbt.json)" https://some-url/v1/provision <(printf '%s' "$key_string") <(printf '%s' "$pem_string")

出现的错误:

curl: (58) could not load PEM client certificate from /dev/fd/12, LibreSSL error error:09FFF06C:PEM routines:CRYPTO_internal:no start line, (no key found, wrong pass phrase, or wrong file format?)

integration_test.sh中的相关代码:

echo "Invoking $1 Request..."

payload=$3

response=$(curl --key "$5" --cert "$6" -k -X "$2" -d "$payload" "$4")
echo $(curl --key "$5" --cert "$6" -k -X "$2" -d "$payload" "$4")
可能的问题及解决办法
  • CI/CD变量丢失换行符:CLIENT_CERTIFICATE_KEY和CLIENT_CERTIFICATE_PEM这类证书变量在GitLab CI/CD中如果直接粘贴带换行的内容,默认会把换行转为空格,生成的临时文件内容是无换行的连续字符串,不符合PEM格式要求。
    解决:把这两个变量的GitLab类型改成**"文件"**;如果变量里的换行是用\n转义的,就用printf '%b' "${CLIENT_CERTIFICATE_KEY}"来解析转义换行。

  • key与pem内容搞反:脚本里--key对应第5个参数(key临时文件),--cert对应第6个参数(pem临时文件),如果环境变量里把pem内容存到了key变量、key内容存到pem变量,curl加载时就会格式错误。
    解决:临时打印变量内容(注意不要泄露敏感信息),确认CLIENT_CERTIFICATE_KEY是私钥、CLIENT_CERTIFICATE_PEM是公钥证书。

  • 变量包含多余引号:如果环境变量本身带引号,printf '%s' "$key_string"会把引号也输出到临时文件,导致PEM内容被引号包裹,不符合格式。
    解决:检查变量内容,确保没有多余引号;如果有,用printf '%s' "${key_string//\"/}"去掉引号。

  • PEM格式不规范:LibreSSL对PEM格式校验严格,比如起始/结束标记写错(如---- BEGIN PRIVATE KEY ----少了一个-)、缺少结束行,或者Base64内容损坏。
    解决:确认key和pem的格式,必须包含正确的-----BEGIN/END ...-----标记,中间的Base64内容完整无错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:12:48