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

