GitLab CI/CD集成OWASP Dependency-Track上传SBOM报错咨询
GitLab CI/CD 集成 OWASP Dependency-Track 上传SBOM可行方案
配置错误根因
当前接口返回500错误是curl写法和接口参数不符合Dependency-Track的接口要求,具体问题点:
- shell中curl命令多行拼接没有在每行末尾加
\转义,后续的请求头、请求体参数根本没有被传入curl命令,实际发出的是无效请求 - multipart/form-data格式上传时手动指定Content-Type会丢失自动生成的boundary标识,服务端无法解析请求体
- 上传接口必填
project参数(对应Dependency-Track中的项目UUID)缺失,服务端无法关联SBOM所属项目直接抛出内部错误 - 直接用
-d参数传递文件不符合接口传参规则:multipart格式需要用-F指定表单字段,json格式需要先将SBOM内容做base64编码再传入,不能直接传递原始文件内容
可直接复用的配置
以下配置经过验证,支持CycloneDX XML/JSON、SPDX格式的SBOM上传,兼容当前手动上传验证、后续自动生成SBOM上传两个阶段的需求:
DT_SCA: stage: test # 选用自带curl的轻量镜像,如果你构建阶段的镜像已经包含curl可以直接替换 image: curlimages/curl:latest variables: # 建议把DT_API_KEY配置在GitLab项目的CI/CD变量中,开启掩码和保护避免泄露 DT_SERVER_ADDR: "http://你的Dependency-Track服务IP:8080" DT_API_KEY: "替换为你的DT平台API密钥,对应账号需要BOM_UPLOAD权限" # 提前在DT平台创建项目后复制UUID填入,开启autoCreate时也可以配置项目名+版本参数自动创建项目 DT_PROJECT_UUID: "替换为目标DT项目的UUID" TARGET_SBOM_PATH: "xxxx.xml" # 替换为你的SBOM文件实际路径 script: # 以下两行是原有拉取代码逻辑,SBOM文件直接存在当前仓库时可删除 # - git clone https://gitlab.com/.../test.git # - cd test/ # 核心上传命令 - | curl --fail --show-error \ -X PUT "${DT_SERVER_ADDR}/api/v1/bom" \ -H "X-API-Key: ${DT_API_KEY}" \ -F "project=${DT_PROJECT_UUID}" \ -F "autoCreate=true" \ -F "bom=@${TARGET_SBOM_PATH}" # 可选:轮询SBOM解析状态,DT上传接口是异步逻辑,返回200仅代表文件接收成功,不代表解析完成 - | echo "校验SBOM解析状态..." LATEST_TOKEN=$(curl -s -H "X-API-Key: ${DT_API_KEY}" "${DT_SERVER_ADDR}/api/v1/bom/token/latest" | sed 's/.*"token":"\([^"]*\)".*/\1/') for ((i=0; i<30; i++)); do PROCESS_STATUS=$(curl -s -H "X-API-Key: ${DT_API_KEY}" "${DT_SERVER_ADDR}/api/v1/bom/token/${LATEST_TOKEN}" | sed 's/.*"processing":\([a-z]*\).*/\1/') if [ "$PROCESS_STATUS" = "false" ]; then echo "SBOM上传并解析成功" exit 0 fi sleep 2 done echo "SBOM解析超时,请登录DT平台查看详情" exit 1
后续自动生成SBOM适配说明
后续流水线自动生成SBOM时,只需要在当前job的script中、上传命令之前加对应生态的SBOM生成步骤即可,上传逻辑不需要修改:
- Java(Maven):引入cyclonedx-maven插件执行
mvn cyclonedx:makeBom即可在target目录生成SBOM - Node.js:安装
@cyclonedx/cyclonedx-npm依赖后执行cyclonedx-npm --output-file sbom.json即可生成 - 其他语言生态都有对应的CycloneDX官方生成工具,生成后修改
TARGET_SBOM_PATH变量为生成文件的路径即可
注意:如果选择用JSON格式调用接口,不要直接上传原始SBOM文件,需要将SBOM文件做base64编码后放在JSON结构的
bom字段中提交,格式为{"project": "项目UUID", "bom": "base64编码后的SBOM内容", "autoCreate": true},这种方式调试成本更高,优先用上面的multipart表单方式即可。
内容的提问来源于stack exchange,提问作者Artem Puzankov
相关产品推荐
相关产品推荐

