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等多种后端,适合离线测试。
- 启动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
- 基础配置文件
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"
- 配置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 环境就绪检查清单
在进入下一章之前,请逐项确认以下组件状态:
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流水线可直接复用,确保开发、测试、生产环境一致。