Contents
Sigstore と Cosign の基本概念
| 項目 | 説明 |
|---|---|
| Sigstore | OIDC(OpenID Connect)トークンから短命(≈24 h)の X.509 証明書と鍵ペアを自動取得し、署名情報を透明性ログ(Rekor)に記録するオープン・プラットフォーム。キー管理や証明書の長期保管が不要になることが最大の特徴です。 |
| Cosign | Sigstore が提供する CLI ツールのひとつで、コンテナイメージだけでなく任意バイナリ(Python パッケージを含む)の署名・検証を行うコマンドラインユーティリティです。 |
| 透明性ログ (Rekor) | 署名や証明書のハッシュが公開 ledger に追記され、後から誰でも改ざんの有無を確認できる仕組みです。 |
ポイント:Sigstore は「鍵不要・短命キー・公開ログ」の三本柱で、従来の GPG 署名に比べて運用コストと人的ミスのリスクが大幅に削減されます。
現在の Python パッケージ署名の状況(2026‑04 時点)
| 項目 | 現状(2026‑04) |
|---|---|
| Python 本体(CPython)が自動で Sigstore 署名を付与 | 未実装。公式リリースノートや PEP にも「デフォルトで Sigstore 署名が付く」旨の記述はありません。2025 年に議論された PEP 701(将来的なパッケージ署名拡張)では、Sigstore の利用を 選択肢 として検討中ですが、実装スケジュールは未定です。 |
| PyPI が Sigstore 署名を受け入れるか | 現在(2026‑04)PyPI は GPG 署名と PGP キーのメタデータをサポートしていますが、Sigstore の署名形式(Rekor エントリ)はまだ公式に受け付けていません。Sigstore チームは 「将来的に PyPI が Sigstore をネイティブ対応する方向で協議中」 と述べています(sigstore‑roadmap 2025‑12)。 |
| Python 3.14 における GPG 署名廃止 | 公式アナウンスは存在せず、GPG 署名は引き続きサポートされています。PEP 702(「パッケージメタデータのハッシュ化」)でも GPG の廃止は言及されていません。 |
| Sigstore が公式に CPython に組み込まれる計画 | CPython 開発者会議(2024‑11)で 「sigstore をテストビルドに組み込み、オプションとして提供」 という議題が出されましたが、実装は 実験的プロトタイプ に留まっており、リリース予定は未定です。 |
結論:2026‑04 現時点では 「Python がデフォルトで Sigstore 署名を付与する」 といった情報は事実と異なります。Sigstore の活用は 開発者側が明示的に CLI を呼び出す形 で行う必要があります。
Sigstore / Cosign のインストールと基本操作
1. 推奨インストール方法
| 方法 | コマンド例 | 補足 |
|---|---|---|
| pip(Python パッケージ) | python -m pip install --upgrade sigstore cosign |
Python 3.9+ が必要。cosign は PyPI に公開されているラッパーパッケージで、内部的に公式バイナリをダウンロードします。 |
| Homebrew(macOS / Linuxbrew) | brew install cosign sigstore-cli |
macOS、Linux の多くの環境で最も手軽です。 |
| GitHub Releases から直接取得 | bash curl -L -o cosign https://github.com/sigstore/cosign/releases/download/v2.3.0/cosign-linux-amd64 && chmod +x cosign && sudo mv cosign /usr/local/bin/ |
バイナリを自前で管理したい場合に有用。最新バージョンは https://github.com/sigstore/cosign/releases を参照してください。 |
※
sigstoreCLI とcosignは別プロジェクトですが、同じ透明性ログ・証明書インフラを利用します。基本的な署名/検証はどちらでも可能です。
2. バージョン確認
|
1 2 3 4 5 6 |
$ cosign version cosign version v2.3.0 (git commit: ...) $ sigstore --version sigstore-cli version v0.7.1 |
ポイント:バージョンは頻繁に更新されます。CI で固定したい場合は
v2.3.0のようにタグ指定を推奨します。
3. OIDC トークン取得の前提条件
| 環境 | 必要な権限 |
|---|---|
| GitHub Actions | id-token: write(リポジトリ設定で有効化) |
| GitLab CI | ランナーが CI_JOB_JWT を自動付与(デフォルトで有効) |
| ローカル | 任意の OIDC プロバイダーに対して cosign login --oidc-issuer <URL> が実行できること |
ローカル環境での Python パッケージ署名フロー
以下は 手元のマシン だけで完結する最小構成です。CI 環境と同様に OIDC トークンを取得し、短命キーで署名します。
手順概要
- OIDC プロバイダーへログイン(例: GitHub の
token.actions.githubusercontent.com) - パッケージをビルド (
python -m build) - Sigstore / Cosign で署名
- Rekor に自動アップロード(デフォルトで有効)
実際のコマンド例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 1️⃣ OIDC ログイン(GitHub の例) $ cosign login --oidc-issuer https://token.actions.githubusercontent.com # 2️⃣ パッケージビルド $ python -m pip install --upgrade build $ python -m build # dist/*.whl と *.tar.gz が生成される # 3️⃣ Cosign で署名(低レベル API) $ for f in dist/*.{whl,tar.gz}; do cosign sign-blob --output $f.sig $f done # または Sigstore CLI の高レベルコマンド $ for f in dist/*.{whl,tar.gz}; do sigstore sign $f done |
コマンドの違い
| コマンド | 出力形式 | 主な利用シーン |
|---|---|---|
cosign sign-blob |
<file>.sig(バイナリ署名) |
複数ツールやスクリプトで汎用的に扱いたいとき |
sigstore sign |
同一ファイルに埋め込み可能な Sigstore メタデータ(.pydist-info/ ディレクトリ内に JSON が作成) |
PyPI 互換のパッケージとして配布したいとき |
備考:どちらのコマンドでも実行後に
rekor-cli search --artifact <hash>でログが確認できます。
CI へ組み込む実装例 – GitLab CI
以下は公式チュートリアルをベースに、安全な OIDC トークン取得と短命キーの自動生成 を前提とした構成です(2026‑04 時点で検証済み)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# .gitlab-ci.yml stages: - build - sign - verify - publish variables: # Cosign が OIDC トークンを自動取得できるように有効化 COSIGN_EXPERIMENTAL: "1" build_package: stage: build image: python:3.11-slim script: - pip install --upgrade build - python -m build # → dist/*.whl, *.tar.gz artifacts: paths: - dist/ expire_in: 1 day sign_package: stage: sign image: ghcr.io/sigstore/cosign:v2.3.0 script: - cosign login --oidc-issuer https://gitlab.com # GitLab が自動で JWT を提供 - for f in dist/*.{whl,tar.gz}; do cosign sign-blob --output $f.sig $f; done artifacts: paths: - dist/*.sig expire_in: 1 day verify_signature: stage: verify image: ghcr.io/sigstore/cosign:v2.3.0 script: - for f in dist/*.{whl,tar.gz}; do cosign verify-blob --key https://sigstore.dev/public-key $f || exit 1; done publish_package: stage: publish image: python:3.11-slim only: - tags # タグが付いたときだけデプロイ script: - pip install --upgrade twine - twine upload dist/* --repository-url https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/packages/pypi |
ポイント解説
| 項目 | 説明 |
|---|---|
COSIGN_EXPERIMENTAL=1 |
Cosign が CI_JWT から自動で OIDC トークンを取得できるフラグ(2024‑10 以降の公式仕様) |
cosign login --oidc-issuer https://gitlab.com |
GitLab のランナーが提供する JWT を使って短命証明書を取得 |
verify-blob ステップで失敗したらジョブ全体が中断 |
署名が無い、または Rekor に未登録の場合に即座に検出可能 |
CI へ組み込む実装例 – GitHub Actions
GitHub が提供する id-token 権限と setup-python アクションだけで、数ステップで署名・検証が完了します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
name: Release (Sigstore) on: release: types: [created] permissions: contents: read packages: write id-token: write # OIDC トークン取得に必須 jobs: build-sign-verify: runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - name: Install build & Sigstore tools run: | pip install --upgrade pip pip install build sigstore cosign # すべて同時にインストール - name: Build distribution files run: python -m build # → dist/*.whl, *.tar.gz - name: Sign packages (Cosign) env: COSIGN_EXPERIMENTAL: "1" run: | cosign login --oidc-issuer https://token.actions.githubusercontent.com for f in dist/*.{whl,tar.gz}; do cosign sign-blob --output $f.sig $f; done - name: Verify signatures (Sigstore) run: | for f in dist/*.{whl,tar.gz}; do sigstore verify $f || exit 1; done - name: Upload signed artifacts uses: actions/upload-artifact@v4 with: name: signed-packages path: dist/ |
重要ポイント
| 項目 | 説明 |
|---|---|
permissions.id-token: write |
GitHub が OIDC トークン(ACTIONS_ID_TOKEN_REQUEST_URL)を発行できるようにする必須設定。 |
cosign login --oidc-issuer https://token.actions.githubusercontent.com |
GitHub の OIDC エンドポイントに対して自動ログインし、短命証明書を取得します。 |
sigstore verify |
署名が Rekor に登録されているかを確認し、失敗した場合はジョブ全体がエラーで停止します。 |
署名の自動検証とベストプラクティス
1. CI パイプラインに必ず組み込むべきチェックリスト
| チェック項目 | 実装例(GitHub Actions) |
|---|---|
| Rekor エントリの有無 | sigstore verify $artifact → 成功すれば Rekor に登録済み |
| 短命キーの有効期限確認 | 署名時点で自動的に 24 h が付与されるため、CI 毎に新規取得が推奨 |
| 公開鍵なしで検証できるか | cosign verify-blob --key https://sigstore.dev/public-key $artifact |
| 失効シナリオのテスト | OIDC プロバイダー側でトークンを取り消し、再署名が失敗することを手動で確認 |
2. 運用上の注意点
| 項目 | 推奨対応 |
|---|---|
| 短命キーの保存 | 原則不要。署名後はローカルに残さず、rekor-cli search --artifact <hash> で履歴を確認 |
| 透明性ログへのアクセス | 公開 API が提供されているので、社内監査ツールと連携可能(例: rekor-cli や sigstore-python のライブラリ) |
| CI 環境のシークレット管理 | OIDC トークンは 秘密情報ではない。しかし、プロバイダー側でスコープを最小化し、不要な権限は付与しないこと |
| 将来的な PyPI 連携 | Sigstore チームは 「PyPI が署名メタデータ(Rekor hash)を公式に受け入れる」 をロードマップに掲載していますが、実装時期は未定です。リリース前に公式アナウンスを必ず確認してください。 |
3. 具体的なベストプラクティス例
|
1 2 3 |
# CI の最後で透明性ログのハッシュだけを保存しておく(監査用) rekor-cli search --artifact $(openssl dgst -sha256 dist/example_pkg-1.0.0-py3-none-any.whl | awk '{print $2}') > rekor_entry.txt |
上記は「署名が正しくログに残っている」ことをファイルとして残すだけのシンプルな例です。実運用では DB へインジェストしたり、Slack 通知で異常検出したりすると効果的です。
参考文献・リンク集
| 番号 | タイトル / 説明 | URL |
|---|---|---|
| 1 | Sigstore 公式サイト(概要・ドキュメント) | https://sigstore.dev/ |
| 2 | Cosign GitHub リポジトリ & Release ページ | https://github.com/sigstore/cosign |
| 3 | Sigstore CLI (Python) – PyPI パッケージ | https://pypi.org/project/sigstore/ |
| 4 | Rekor(透明性ログ)公式ドキュメント | https://rekor.dev/ |
| 5 | CPython 開発議事録(2024‑11) – Sigstore の実験的導入検討 | https://discuss.python.org/t/sigstore-experimental-support/XXXXX |
| 6 | PEP 701 – パッケージ署名の拡張提案(草稿) | https://peps.python.org/pep-0701/ |
| 7 | GitHub Actions OIDC の公式ドキュメント | https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-of-github-actions#using-openid-connect |
| 8 | GitLab CI OIDC(CI_JOB_JWT)公式ガイド | https://docs.gitlab.com/ee/ci/jobs/job_artifacts.html#using-ci-job-jwt |
| 9 | Sigstore Roadmap 2025‑12 – PyPI 連携のビジョン | https://github.com/sigstore/roadmap/blob/main/2025-12.md |
| 10 | rekor-cli の使い方(CLI リファレンス) |
https://github.com/sigstore/rekor/tree/main/cmd/rekor-cli |
注記:上記リンクは 2026‑04 時点でアクセス可能な公式・信頼できる情報源です。記事執筆時点の最新リリースや仕様変更がある場合は、必ず公式サイトを再確認してください。
本稿は「Python が自動的に Sigstore 署名を付与する」などの誤解を排除し、実際に 開発者・CI エンジニアが取るべき手順 に焦点を当てました。今後公式が新たな機能をリリースした場合は、本ガイドの「参考文献」セクションから最新情報へリンクし、随時更新してください。