
在 npm 和 GitHub 中,出处证明(Provenance)指的是软件包的来源证明,用于验证软件包是否由可信的构建流程生成。通过 GitHub Actions 和 npm 的集成,可以自动生成并附加 Provenance 信息到发布的包中,以供审计和增强软件供应链安全。核心机制涉及 GitHub Actions、npm、Sigstore 和 OIDC 技术。
Provenance 的价值在于能够保证所有构建步骤和来源信息被记录,便于排查供应链攻击。同时也能够满足融、政府等领域对软件来源的严格审计要求。
实现机制
npm 软件包出处证明通过 GitHub Actions 工作流生成可验证的出处声明,记录软件包的源代码仓库、构建指令和发布者身份。流程如下:
- GitHub Actions 运行构建和发布工作流,生成软件包及其出处声明,其中包括运行构建的环境、步骤等信息。
- Sigstore 使用加密签名确保声明不可篡改,存储起来供用户验证。
- 使用临时凭证机制 OIDC 验证工作流的身份,绑定发布者信息,确保声明可信。
实践方式
以下介绍如何修改 GitHub Actions 配置文件,支持出处证明。这里项目使用的是 pnpm 管理 monorepo 项目,所以还需要解决 pnpm publish 对
--provenance 参数的兼容问题,并配置生产环境及特定 tag 触发。修改 GitHub Actions 配置文件
创建或修改
.github/workflows/publish.yml,确保在推送特定 tag(如 v1.0.0)时触发,并在配置有密钥的环境中运行流水线并发布 npm 包:name: Publish npm Package
on:
push:
tags:
- 'v*'
jobs:
publish:
runs-on: ubuntu-latest
environment: production
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4
with:
node-version: 18
registry-url: https://registry.npmjs.org
- run: pnpm install
- run: pnpm build
- run: pnpm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_CONFIG_PROVENANCE: true
yaml
关键点:
- 触发条件:
on.push.tags确保仅在推送v*格式的 tag 时自动触发。
- 运行环境:
environment: production指定生产环境,需要在 GitHub 仓库设置中配置环境携带的密钥secrets.NPM_TOKEN,此后每次发布需要用户授权运行。
- OIDC 权限:
id-token: write允许工作流获取 OIDC 令牌,用于出处声明。
- pnpm 兼容性:pnpm 的
publish命令不支持-provenance参数,通过设置环境变量NPM_CONFIG_PROVENANCE=true启用出处证明。
- NPM 令牌:
NODE_AUTH_TOKEN使用 secrets 存储 NPM 发布令牌。
工作流
为简化版本管理和 tag 推送,推荐使用基于 version-bump-prompt 修改的 bumpp。可以直接通过 npx 运行:
npx bumpp
plaintext
bumpp 会自动更新包版本、生成 git commit 和 tag,并推送至远程仓库,触发上面的 GitHub Actions 工作流。开发者需要只在 Github Actions 的网页中点击授权本次 CI 即可,然后 CI 就会根据配置构建和发布带有出处证明的 NPM 包。
最终发布在 npm 的包就会携带有官方的绿标认证信息,并能够追溯此次版本发布的所有来源信息。

.webp?table=block&id=1ece57f3-99bf-8092-903b-c373e675eae2&cache=v2)