GitLab CI发布npm包遇CA_CREATE_SIGNING_CERTIFICATE_ERROR报错求助
问题背景
我有一台私有GitLab服务器,按照官方指南配置CI流水线发布npm包到项目仓库,Job配置如下:
npm: image: node id_tokens: SIGSTORE_ID_TOKEN: aud: sigstore variables: npm_config_cafile: $CI_SERVER_TLS_CA_FILE npm_config_registry: $CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/npm/ before_script: npm config set -- //$CI_SERVER_HOST/api/v4/projects/$CI_PROJECT_ID/packages/npm/:_authToken=$CI_JOB_TOKEN script: - npm config set strict-ssl false - npm publish
最初遇到错误:
npm error Provenance generation in GitLab CI requires 'SIGSTORE_ID_TOKEN' with 'sigstore' audience to be present in 'id_tokens'
添加id_tokens:SIGSTORE_ID_TOKEN:aud: sigstore后解决了该问题,但出现新错误:
npm error code CA_CREATE_SIGNING_CERTIFICATE_ERROR
npm error error creating signing certificate - (400) There was an error processing the identity token
npm error cause (400) There was an error processing the identity token
GitLab实例使用自定义CA证书,尝试设置npm_config_cafile和关闭strict-ssl无效,调试日志显示sigstore的fulcio服务请求失败:
notice Publishing to https://my-gitlab.myserver.com/api/v4/projects/1234/packages/npm/ with tag latest and public access
http fetch POST https://fulcio.sigstore.dev/api/v2/signingCert attempt 1 failed with 400
移除SIGSTORE_ID_TOKEN会回到最初的错误,求解决方法。
解决步骤
1. 让sigstore请求信任自定义CA证书
npm_config_cafile仅作用于npm仓库请求,sigstore相关请求(如fulcio)不会读取这个配置。需要将自定义CA证书添加到系统信任根:
修改before_script,添加证书导入步骤:
before_script: - npm config set -- //$CI_SERVER_HOST/api/v4/projects/$CI_PROJECT_ID/packages/npm/:_authToken=$CI_JOB_TOKEN - cp $CI_SERVER_TLS_CA_FILE /usr/local/share/ca-certificates/custom-ca.crt - update-ca-certificates
这样Node.js发起的所有HTTPS请求(包括sigstore服务)都会信任该CA证书。
2. 禁用Provenance生成(快速绕过)
如果不需要npm包的溯源(Provenance)功能,直接在发布命令中禁用它,无需配置SIGSTORE_ID_TOKEN:
修改script中的publish命令:
script: - npm config set strict-ssl false - npm publish --provenance false
同时可以删除id_tokens配置块,避免不必要的认证流程。
3. 检查GitLab ID Token配置
确保私有GitLab服务器允许生成受众为sigstore的ID令牌:
- 管理员后台进入Settings > CI/CD > Token authentication settings,确认ID tokens功能已启用。
- 项目级CI/CD配置中,确保没有限制ID令牌的受众范围。
4. 验证网络连通性
确认GitLab Runner可以正常访问fulcio.sigstore.dev,没有被防火墙、代理拦截:
- 若使用代理,在CI变量中设置
HTTP_PROXY、HTTPS_PROXY,并确保代理放行sigstore相关域名。 - 在Job中添加
curl https://fulcio.sigstore.dev命令测试连通性。
内容的提问来源于stack exchange,提问作者jeremywat

