4. 环境准备:安装Cosign、配置OpenID Connect、搭建本地测试环境

本章是进入Sigstore实战操作的第一步。在正式进行镜像签名、验证和策略部署之前,必须完成三个核心环境的搭建:Cosign命令行工具的安装、OpenID Connect(OIDC)身份提供者的对接配置,以及一个用于隔离测试的本地OCI镜像仓库。以下步骤均经过生产环境验证,适用于Linux/macOS及CI/CD容器环境。

前置检查:确保已安装 Docker Engine 20.10+ 或 Podman 3.0+,并具备 sudo 或 root 权限。Go 版本建议 1.21+(如需从源码编译 Cosign)。

4.1 安装Cosign

Cosign是Sigstore生态中最常用的客户端工具,负责镜像签名、验证和存储。推荐通过官方二进制或包管理器安装,避免依赖冲突。

安装方式 适用场景 命令/步骤
官方二进制(Linux/macOS) CI/CD、本地开发 curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-$(uname -s)-$(uname -m)" && chmod +x cosign-* && sudo mv cosign-* /usr/local/bin/cosign
Homebrew(macOS/Linux) 开发者工作站 brew install cosign
Go Install 需要特定版本或二次开发 go install github.com/sigstore/cosign/v2/cmd/cosign@latest
容器镜像 临时环境、Kubernetes Job docker pull gcr.io/projectsigstore/cosign:latest

安装完成后,验证版本并确认关键子命令可用:

cosign version
cosign help | grep -E "sign|verify|attest|triangulate"
关键路径:Cosign 2.x 默认使用 OIDC 进行身份绑定,不再依赖本地密钥对。若需离线或非交互模式,请提前配置环境变量 COSIGN_EXPERIMENTAL=1 以启用密钥less模式。

4.2 配置OpenID Connect(OIDC)

Sigstore的信任模型建立在OIDC身份之上。Cosign通过OIDC令牌将签名者的身份(邮箱、用户名、CI流水线ID)绑定到签名元数据中。以下配置适用于主流身份提供者。

4.2.1 支持的OIDC提供者

提供者 Issuer URL 典型受众(Client ID) 适用场景
GitHub Actions https://.actions.githubusercontent.com sigstore CI/CD流水线自动签名
Google Cloud Workload Identity https://accounts.google.com 自定义服务账号 GCP 工作负载
Microsoft Azure AD https://login.microsoftonline.com/<tenant-id>/v2.0 应用注册ID Azure 企业环境
GitLab CI/CD https://gitlab.com https://gitlab.com GitLab 流水线
本地测试(Dex / Keycloak) 自定义 自定义 离线开发、内网环境

4.2.2 本地OIDC测试环境搭建(使用Dex)

为隔离生产身份,推荐使用 Dex 作为本地OIDC提供者。Dex 支持静态用户、LDAP、GitHub等多种后端,适合离线测试。

  1. 启动Dex容器:
docker run -d --name dex \
  -p 5556:5556 \
  -v $(pwd)/dex-config.yaml:/etc/dex/config.yaml \
  ghcr.io/dexidp/dex:v2.37.0
  1. 基础配置文件 dex-config.yaml:
issuer: http://localhost:5556/dex
storage:
  type: sqlite3
  config:
    file: /var/dex/dex.db
web:
  http: 0.0.0.0:5556
staticClients:
  - id: cosign-local
    secret: cosign-local-secret
    name: 'Cosign Local Test'
    redirectURIs:
      - 'http://localhost:8099/auth/callback'
staticPasswords:
  - email: "admin@example.com"
    hash: "$2a$10$2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p"  # bcrypt of "password"
    username: "admin"
    userID: "08a8684b-db88-4b73-90a9-3cd1661f5466"
  1. 配置Cosign使用本地Dex:
export COSIGN_OIDC_ISSUER=http://localhost:5556/dex
export COSIGN_OIDC_CLIENT_ID=cosign-local
export COSIGN_OIDC_CLIENT_SECRET=cosign-local-secret
安全注意:本地Dex仅用于功能验证。生产环境必须使用受信任的公共OIDC提供者,并启用HTTPS。切勿在非测试网络暴露Dex的静态密码。

4.3 搭建本地OCI镜像仓库

签名操作需要目标镜像仓库支持OCI标准。推荐使用 Distribution Registry(Docker Registry 2.0) 或 Harbor 作为本地测试仓库。

4.3.1 启动本地Registry(带HTTPS)

Cosign默认要求仓库使用HTTPS。使用自签名证书快速搭建:

# 生成自签名证书
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 \
  -keyout certs/domain.key \
  -x509 -days 365 \
  -out certs/domain.crt \
  -subj "/CN=localhost" \
  -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"

# 启动Registry
docker run -d --name local-registry \
  -p 5000:5000 \
  -v $(pwd)/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

4.3.2 配置Docker信任自签名证书

将证书添加到系统信任链,避免Cosign验证时报错:

# Linux
sudo cp certs/domain.crt /usr/local/share/ca-certificates/local-registry.crt
sudo update-ca-certificates

# macOS
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain certs/domain.crt

4.3.3 推送测试镜像并验证

# 拉取一个轻量测试镜像
docker pull alpine:3.18

# 打标签并推送到本地仓库
docker tag alpine:3.18 localhost:5000/test-images/alpine:3.18
docker push localhost:5000/test-images/alpine:3.18

# 验证推送成功
curl -k https://localhost:5000/v2/_catalog
快速验证:若返回 {"repositories":["test-images/alpine"]},则本地仓库就绪。后续章节的签名操作将基于此仓库进行。

4.4 环境就绪检查清单

在进入下一章之前,请逐项确认以下组件状态:

环境就绪检查清单流程 1. Cosign 安装 2. OIDC 配置 3. 本地仓库 cosign version OIDC 获取 curl /v2/_catalog ✅ 三项全部通过 → 进入签名实战

4.5 常见问题与排错

现象 可能原因 解决方案
cosign sign 提示 OIDC 超时 浏览器无法弹出认证窗口(CI环境) 设置 export COSIGN_EXPERIMENTAL=1 并使用 --oidc-issuer 指定令牌
push 镜像时 TLS 错误 自签名证书未加入系统信任链 执行 update-ca-certificates 或配置 Docker daemon 的 insecure-registries
Dex 启动后无法获取令牌 redirectURI 不匹配或 secret 错误 检查 dex-config.yaml 中 staticClients 的 redirectURIs 是否包含 http://localhost:8099/auth/callback
cosign verify 报错 no matching signatures 签名未推送到仓库或仓库不支持 OCI 引用 确认使用 cosign sign 时仓库地址正确,且 Registry 版本 >= 2.7
最佳实践:建议将上述环境配置脚本化,保存为 setup-sigstore-env.sh,纳入项目版本库。后续CI/CD流水线可直接复用,确保开发、测试、生产环境一致。