3. 环境准备:安装 Cosign、配置 OpenID Connect、搭建本地 Rekor 实例

在深入调用 Sigstore 信任边界接口之前,必须搭建一套完整的本地实验环境。本章将指导你完成三个核心组件的部署:Cosign(签名/验证客户端)、OpenID Connect(身份代理层)和Rekor(透明性日志服务)。这套环境将作为后续所有接口调用的基础沙箱。

3.1 环境概览与组件关系

下图展示了本地实验环境中三个组件之间的调用关系与数据流。Cosign 作为 CLI 客户端,通过 OIDC 获取短期身份令牌,然后将签名元数据写入本地 Rekor 实例。

本地 Sigstore 实验环境组件关系图 本地 Sigstore 实验环境组件关系 Cosign CLI 签名 / 验证 / 上传 OIDC Provider 身份令牌签发 Rekor Server 透明性日志 获取 上传签名 / 查询条目 实验环境说明 • Cosign 通过 OIDC 获取短期身份令牌,无需长期密钥 • 签名负载和公钥引用写入本地 Rekor,实现可审计透明性 • 所有组件运行在 localhost,适合接口调试与教学验证

3.2 安装 Cosign

Cosign 是 Sigstore 生态中最常用的客户端工具,支持容器镜像、Blob 文件、记录等多种资产的签名与验证。推荐使用官方二进制安装方式,确保版本一致。

3.2.1 Linux / macOS 安装

# 下载最新稳定版(v2.4.0+)
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
sudo chmod +x /usr/local/bin/cosign

# 验证安装
cosign version

3.2.2 macOS(Homebrew)

brew install cosign

3.2.3 验证安装结果

执行以下命令确认 Cosign 可以正常工作:

cosign version

# 输出示例(关键字段):
#  ______   ______        ______   ______   ______   ______
# /_____/ /_____/       /_____/ /_____/ /_____/ /_____/
#  v2.4.1  2024-11-15T14:30:00Z  9a8b7c6d5e4f3a2b1c0d
版本兼容提示:本课程所有接口调用示例基于 Cosign v2.4.x。如果使用更早版本(v1.x),部分命令参数(如 cosign sign 的 --oidc-issuer 选项)可能不同。建议统一使用 v2.4+。

3.3 配置 OpenID Connect

Sigstore 默认使用 OIDC 作为身份层,支持 GitHub、Google、Microsoft 等公有身份提供商。在本地实验环境中,我们配置 Cosign 使用 GitHub OIDC 进行身份认证。

3.3.1 获取 GitHub OIDC 令牌(交互式)

# Cosign 会自动打开浏览器引导 GitHub OAuth 流程
cosign sign --oidc-issuer "https://oauth2.sigstore.dev/auth/auth" \
            --oidc-client-id "sigstore" \
            <your-image>

3.3.2 使用环境变量预配置 OIDC

在自动化流水线中,可以通过环境变量注入 OIDC 令牌,避免交互式浏览器弹窗:

# 设置 OIDC 令牌环境变量
export COSIGN_OIDC_=<your-oidc-jwt->

# 使用环境变量进行签名(无需交互)
cosign sign --oidc-issuer "https://oauth2.sigstore.dev/auth/auth" \
            <your-image>

3.3.3 OIDC 配置参数说明

参数 默认值 说明
--oidc-issuer https://oauth2.sigstore.dev/auth/auth OIDC 提供商地址,Sigstore 官方使用 sigstore.dev
--oidc-client-id sigstore OIDC 客户端标识,用于识别 Sigstore 应用
--oidc-client-secret (可选) 仅用于机密客户端流程,公有流程通常不需要
COSIGN_OIDC_ (环境变量) 预置 JWT 令牌,跳过交互式浏览器流程
安全提醒:OIDC 令牌是短期凭证(通常 10-60 分钟有效)。不要将令牌硬编码在脚本或配置文件中。在 CI/CD 环境中,使用平台提供的 OIDC 令牌注入机制(如 GitHub Actions 的 id-: write 权限)。

3.4 搭建本地 Rekor 实例

Rekor 是 Sigstore 的透明性日志服务,负责记录所有签名事件。在本地搭建 Rekor 实例,可以避免依赖公有 Rekor 服务,同时方便调试和教学。

3.4.1 使用 Docker Compose 快速部署

推荐使用官方 Docker Compose 配置,一键启动 Rekor Server 及其依赖的 Trillian 日志后端和 MySQL 数据库:

# 克隆 Rekor 仓库
git clone https://github.com/sigstore/rekor.git
cd rekor

# 使用 Docker Compose 启动本地 Rekor 集群
docker-compose -f docker-compose.yml up -d

# 等待所有服务就绪(约 30 秒)
docker-compose ps

# 输出示例:
#        Name                      Command               State           Ports
# -------------------------------------------------------------------------------------
# rekor-mysql          docker-entrypoint.sh mysqld      Up      3306/tcp
# rekor-server         /rekor-server serve              Up      0.0.0.0:3000->3000/tcp
# rekor-trillian-log   /trillian_log_server ...         Up      0.0.0.0:8090->8090/tcp

3.4.2 验证 Rekor 服务状态

# 检查 Rekor API 健康状态
curl -s http://localhost:3000/api/v1/log | jq .

# 预期返回(部分字段):
# {
#   "rootHash": "a1b2c3d4e5f6...",
#   "treeSize": 1,
#   "signedTreeHead": "eyJ..."
# }

3.4.3 配置 Cosign 使用本地 Rekor

通过环境变量或命令行参数,让 Cosign 将签名记录写入本地 Rekor 实例:

# 方式一:环境变量(推荐)
export REKOR_HOST=http://localhost:3000

# 方式二:命令行参数
cosign sign --rekor-url http://localhost:3000 \
            <your-image>

3.5 环境验证清单

完成上述安装后,执行以下验证步骤,确保所有组件正确联通:

  1. Cosign 可用性:cosign version 返回版本号且无报错。
  2. OIDC 令牌获取:cosign sign --oidc-issuer "https://oauth2.sigstore.dev/auth/auth" --dry-run 能够触发浏览器或返回令牌提示。
  3. Rekor 服务响应:curl http://localhost:3000/api/v1/log 返回 JSON 格式的日志状态。
  4. 端到端联通:使用 Cosign 对测试文件签名并上传到本地 Rekor:echo "test" > test.txt && cosign sign-blob --rekor-url http://localhost:3000 test.txt。
验证成功标志:签名命令完成后,在 Rekor 中查询到对应的条目 UUID,且 Cosign 返回 Signature wrote to ... 和 Rekor entry created with index: ... 两条确认信息。

3.6 常见问题与排错

问题现象 可能原因 解决方案
cosign: command not found Cosign 未安装或不在 PATH 中 确认 /usr/local/bin/cosign 存在且可执行
OIDC 浏览器无法打开 无图形界面环境(如 SSH) 使用 COSIGN_OIDC_ 环境变量预置令牌
Rekor 返回 connection refused Docker 容器未启动或端口映射错误 执行 docker-compose ps 检查容器状态
签名时提示 no matching OIDC OIDC 令牌过期或未正确设置 重新获取令牌或检查 COSIGN_OIDC_ 变量