mcpField
I
implementing-code-signing-for-artifacts

implementing-code-signing-for-artifacts

github.com/mukul975安全35.2k53 次安装8 周前更新
代码仓库

关于 implementing-code-signing-for-artifacts

面向构建与发布团队的制品代码签名实施指南,涵盖签名密钥管理、CI/CD 签名和部署验证。内容涉及 GPG、Sigstore 无密钥签名及 npm provenance,帮助验证制品来源与完整性。

主要功能

  1. 01生成并管理签名密钥
  2. 02在 CI/CD 中签署构建制品
  3. 03在部署流程中验证签名
  4. 04使用 npm provenance 发布包
  5. 05了解透明日志与信任链

适用场景

  1. 01为软件发布制品添加签名
  2. 02在部署时拒绝未签名制品
  3. 03为客户提供发布者身份验证
  4. 04为 npm 包附加来源证明

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill implementing-code-signing-for-artifacts

安装后在 Claude Code 中输入/implementing-code-signing-for-artifacts确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

为制品实施代码签名

何时使用

  • 在建立制品完整性验证以防止供应链篡改时
  • 在合规要求提供构建制品真实且未被修改的加密证明时
  • 在向需要验证发布者身份的客户分发软件时
  • 在实施拒绝未签名制品的零信任部署流水线时
  • 在满足 SLSA Level 2+ 对来源和完整性要求时

不要使用于加密制品(签名提供完整性,而非机密性)、专门用于容器镜像签名(请使用 cosign),或用于源代码认证(请使用提交签名)。

前置条件

  • 用于传统签名的 GPG 密钥对,或用于无密钥签名的 Sigstore 账户
  • 用于公开分发的、由证书颁发机构签发的代码签名证书
  • 能够访问签名密钥或身份提供商的 CI/CD 流水线
  • 部署流水线中的验证基础设施

工作流

第 1 步:生成并管理签名密钥
# Generate GPG key for artifact signing
gpg --full-generate-key --batch <<EOF
Key-Type: eddsa
Key-Curve: ed25519
Subkey-Type: eddsa
Subkey-Curve: ed25519
Name-Real: CI Build System
Name-Email: [email protected]
Expire-Date: 1y
%no-protection
EOF

# Export public key for distribution
gpg --armor --export [email protected] > signing-key.pub

# Export private key for CI/CD (store in secrets manager)
gpg --armor --export-secret-keys [email protected] > signing-key.priv
第 2 步:在 CI/CD 中为构建制品签名
# .github/workflows/build-sign.yml
name: Build and Sign

on:
  push:
    tags: ['v*']

jobs:
  build-sign:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      id-token: write  # For Sigstore keyless signing
    steps:
      - uses: actions/checkout@v4

      - name: Build artifacts
        run: |
          make build
          sha256sum dist/* > dist/checksums.sha256

      - name: Import GPG Key
        run: |
          echo "${{ secrets.GPG_PRIVATE_KEY }}" | gpg --batch --import
          gpg --list-secret-keys

      - name: Sign artifacts
        run: |
          for file in dist/*; do
            gpg --detach-sign --armor --local-user [email protected] "$file"
          done

      - name: Install cosign for keyless signing
        uses: sigstore/cosign-installer@v3

      - name: Keyless sign with Sigstore
        run: |
          for file in dist/*.tar.gz; do
            cosign sign-blob "$file" \
              --output-signature "${file}.sig" \
              --output-certificate "${file}.cert" \
              --yes
          done

      - name: Create Release with signed artifacts
        uses: softprops/action-gh-release@v2
        with:
          files: |
            dist/*
            dist/*.asc
            dist/*.sig
            dist/*.cert
第 3 步:在部署流水线中验证签名
# Verify GPG signature
gpg --import signing-key.pub
gpg --verify artifact.tar.gz.asc artifact.tar.gz

# Verify Sigstore keyless signature
cosign verify-blob artifact.tar.gz \
  --signature artifact.tar.gz.sig \
  --certificate artifact.tar.gz.cert \
  --certificate-identity [email protected] \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

# Verify checksums
sha256sum --check checksums.sha256
第 4 步:为 npm 包签名并附带来源
{
  "scripts": {
    "prepublishOnly": "npm run build && npm run test"
  },
  "publishConfig": {
    "provenance": true
  }
}
# Publish npm package with provenance attestation
npm publish --provenance

关键概念

术语定义
代码签名对软件制品进行签名的加密过程,用于验证发布者身份和制品完整性
分离签名存储在制品之外单独文件中的签名,允许独立分发
无密钥签名Sigstore 的方法,使用与 OIDC 身份绑定的短期证书,而非长期密钥
来源描述制品如何、在何处以及由谁构建的元数据
透明日志仅追加日志(Rekor),记录所有签名事件以供公开审计
信任链从根 CA 到签名证书的层级链,用于建立对签名者身份的信任
SLSASupply-chain Levels for Software Artifacts — 定义供应链安全级别的框架

工具与系统

  • GPG/PGP:用于签名和验证制品的传统非对称加密工具
  • Sigstore (cosign):使用 OIDC 身份和透明日志的现代无密钥签名基础设施
  • Rekor:Sigstore 的透明日志,不可篡改地记录所有签名事件
  • Fulcio:Sigstore 的证书颁发机构,签发与 OIDC 身份绑定的短期证书
  • notation:Microsoft 的制品签名工具,用于 OCI 注册表(Project Notary v2)

常见场景

场景:建立已签名的发布流水线

背景:一个开源项目需要为发布制品签名,以便用户验证真实性并检测篡改。

方法:

  1. 在 GitHub Actions 中使用 Sigstore 无密钥签名(无密钥管理开销)
  2. 使用 OIDC 身份通过 cosign sign-blob 为所有发布二进制文件签名
  3. 生成并签名校验和文件以进行批量验证
  4. 将签名、证书和校验和与发布制品一起上传
  5. 在项目 README 中记录验证说明
  6. 将验证步骤添加到 Homebrew formula 或 apt 仓库

陷阱:GPG 密钥泄露需要撤销并重新签名所有制品。Sigstore 无密钥签名通过使用临时密钥避免了这一点。如果 CI 系统被攻破,CI/CD 密钥中的长期签名密钥会成为供应链风险。

输出格式

Artifact Signing Report
========================
Pipeline: Build and Sign v2.3.0
Date: 2026-02-23
Signing Method: Sigstore Keyless + GPG

SIGNED ARTIFACTS:
  app-v2.3.0-linux-amd64.tar.gz
    GPG:      PASS ([email protected], EdDSA/Ed25519)
    Sigstore: PASS (Rekor entry: 24658135, Fulcio cert issued)
    SHA256:   a1b2c3d4...

  app-v2.3.0-darwin-arm64.tar.gz
    GPG:      PASS
    Sigstore: PASS (Rekor entry: 24658136)
    SHA256:   e5f6g7h8...

  checksums.sha256
    GPG:      PASS (detached signature)

TRANSPARENCY LOG:
  Entries recorded: 3
  Log index range: 24658135-24658137
  Verification: https://search.sigstore.dev

评论

支持 Markdown