Skip to main content

コミット署名の検証について

GPG、SSH、または S/MIME を使用して、ローカルでタグとコミットに署名できます。 これらのタグまたはコミットは、 GitHub で検証済みとしてマークされるため、他のユーザーは信頼できるソースからの変更を確実に行うことができます。

コミット署名の検証について

コミットとタグにローカルで署名して、行った変更の根拠を他のユーザに信頼してもらうことができます。 コミットまたはタグに暗号的に検証可能な GPG、SSH、または S/MIME 署名がある場合、 GitHub はコミットまたはタグを "Verified" または "Partially verified" マークします。"

リポジトリのコミット リスト内のコミットのスクリーンショット。 [検証済み] がオレンジ色の枠線で強調表示されています。

ほとんどの個々のユーザーにとって、コミットの署名には GPG または SSH が最適です。 通常、S/MIME 署名は、大規模な組織のコンテキストで必要です。 SSH 署名は最も簡単に生成できます。 既存の認証キーを GitHub にアップロードして、署名キーとしても使用することもできます。 GPG 署名キーの生成は、SSH キーを生成するよりも複雑ですが、GPG には SSH にはない機能があります。 GPG キーは、使用されなくなったときに有効期限が切れるか、取り消すことができます。 GPG 署名には、期限切れまたは失効に関する情報が含まれる場合があります。

コミットとタグは、ユーザーが警戒モードを有効にしたかどうかに応じて、次の検証状態になります。 デフォルト設定では、警戒モードは有効になっていません。 警戒モードを有効にする方法については、「すべてのコミットの検証ステータスを表示する」を参照してください。

コミットを署名することは、コミットをサインオフすることとは異なります。 コミットのサインオフの詳細については、「リポジトリのコミット サインオフ ポリシーの管理」を参照してください。

デフォルトのステータス

状態説明
検証済コミットが署名され、署名が正常に検証されました。
Unverifiedコミットは署名されていますが、署名を検証できませんでした。
確認状態なしコミットが署名されていません。

永続的なコミット署名の検証

署名 (GPG、SSH、S/MIME) の選択に関係なく、検証の済んだコミット署名は、そのリポジトリのネットワーク内で検証済みのままになります。 「リポジトリ間の接続を理解する」を参照してください。

コミット署名が GitHubにプッシュされたときに検証されると、検証レコードがコミットと共に格納されます。 時間が経過して、署名キーのローテーションや取り消し、またはコントリビューターの離職が発生したとしても、署名が検証済み状態を維持するよう、このレコードは編集できず、いつまでも存在します。

検証レコードには、検証が完了したときをマークするタイムスタンプが含まれます。 この永続的なレコードにより、一貫した検証済み状態が保証され、リポジトリ内のコントリビューションの安定した履歴が提供されます。 このタイムスタンプを表示するには、 GitHub の [検証済み] バッジをポイントするか、 verified_at フィールドを含む REST API を使用してコミットにアクセスします。 「コミット用の REST API エンドポイント」を参照してください。

永続的コミット署名の検証は、 GitHubにプッシュされた新しいコミットに適用されます。 この機能より前のコミットの場合、次回コミットの署名が GitHubで検証されるときに永続的なレコードが作成され、リポジトリの履歴全体で検証済みの状態が安定して信頼性が保たれるようにします。

取り消しと期限切れの後もレコードが残っている

永続的コミット署名の検証には、検証の時点でのコミットの検証済み状態が反映されます。 つまり、後で署名キーが取り消されたり、期限切れになったり、変更されたりした場合、以前に検証されたコミットは、最初の検証中に作成されたレコードに基づいて、検証済みの状態を維持します。 GitHub は、キーの状態の変更に応じて、以前に署名されたコミットを再検証したり、検証状態をさかのぼって調整したりしません。 Organization では、セキュリティ ポリシーに合わせてキーの状態を直接管理することが必要になる場合があり、キーのローテーションや取り消しが頻繁に計画されている場合は特にそうです。

検証レコードのスコープはそのリポジトリ ネットワークです

検証レコードはリポジトリ ネットワーク全体で永続的です。つまり、同じコミットが同じリポジトリまたはそのフォークに再度プッシュされる場合は、既存の検証レコードが再利用されます。 これにより、 GitHub は、ネットワーク内に表示されるたびにコミットを再検証することなく、関連するリポジトリ間で一貫した検証済み状態を維持できます。 この永続化により、リポジトリ ネットワーク内のコミットのすべてのインスタンスにおいて、コミットの信ぴょう性の一貫した信頼できる認識が促進されます。

リベースとマージの署名検証

pull request で Rebase と Merge オプションを使用する場合は、ヘッド ブランチのコミットがコミット署名の検証なしでベース ブランチに追加されることに注意することが重要です。 このオプションを使用すると、元のコミットのデータとコンテンツを使用して、GitHub によって変更されたコミットが作成されます。 つまり、GitHub は、このコミットを本当に作成していないため、汎用システム ユーザーとして署名することはできません。 GitHub では、コミッターの秘密署名キーにアクセスできないため、ユーザーの代わりにコミットに署名できません。

これを回避するには、ローカルでリベースとマージを行い、変更を pull request のベース ブランチにプッシュします。

詳しくは、「GitHubのマージ メソッドについて」をご覧ください。

警戒モードが有効になっているステータス

状態説明
Verifiedコミットは署名され、署名の検証も成功しており、コミッターは警戒モードを有効化した唯一の作者。
Partially verifiedコミットは署名され、署名の検証も成功しているが、コミットには a) コミッターではなく b) 警戒モードを有効化した 作者がいる。 この場合、コミットの署名は作者の合意を保証しないので、コミットは部分的にのみ検証されています。
Unverified次のうち当てはまるものはどれですか?
- コミットは署名されていますが、署名を確認できませんでした。
- コミットが署名されておらず、コミッターが警戒モードを有効にしています。
- コミットが署名されておらず、作成者が警戒モードを有効にしています。

リポジトリ管理者は、ブランチでコミット署名を必須として、署名および検証されていないすべてのコミットをブロックできます。 詳しくは、「保護されたブランチについて」をご覧ください。

GitHub 上の署名されたコミットあるいはタグの検証ステータスをチェックして、コミットの署名が検証されない理由を表示することができます。 詳しくは、「コミットおよびタグの署名の検証ステータスを確認する」をご覧ください。

GitHub では、WEB インターフェイスを使用して行ったコミットに署名するために GPG が自動的に使用されます。 GitHubによって署名されたコミットは、検証済みの状態になります。 https://github.com/web-flow.gpg で入手可能な公開キーを使用して、署名をローカルで確認できます。

必要に応じて、GitHub で行うコミットに GitHub Codespaces GPG 署名するよう設定できます。 コードスペースの GPG 検証を有効にする方法の詳細については、 GitHub Codespaces の GPG 検証の管理 を参照してください。

GPG コミット署名の検証

自分で生成した GPG キーで、GPG を使ってコミットに署名できます。

GitHub では、OpenPGP ライブラリを使用して、ローカル署名されたコミットとタグが、 GitHub.comのアカウントに追加した公開キーに対して暗号で検証可能であることを確認します。

GPG を使用してコミットに署名し、それらのコミットを GitHubで検証するには、次の手順に従います。

  1. 既存の GPG キーがあるかチェックする
  2. 新しい GPG キーを生成する
  3. GITHUB アカウントに GPG キーを追加します
  4. Git へ署名キーを伝える
  5. コミットに署名する
  6. タグに署名する

SSH コミット署名の検証

SSH を使うと、自分で生成した SSH キーを使ってコミットに署名できます。 詳細については、Gitのリファレンスドキュメントを参照してください。 既に SSH キーを使用して GitHubで認証している場合は、署名キーとして使用するために同じキーをもう一度アップロードすることもできます。 アカウントに追加できる署名キーの数に制限はありません。

GitHub では、オープンソース Ruby ライブラリである ssh_data を使用して、GitHub.com でアカウントに追加した公開キーに対して、ローカル署名されたコミットとタグが暗号で検証可能であることを確認します。

メモ

SSH 署名の検証は、Git 2.34 以降で利用できます。 git の最新バージョンを入手するには、Git の Web サイトを参照してください。

SSH を使用してコミットに署名し、それらのコミットを GitHubで検証するには、次の手順に従います。

  1. 既存の SSH キーを確認する
  2. 新しい SSH キーを生成する
  3. GITHUB アカウントに SSH 署名キーを追加します
  4. Git へ署名キーを伝える
  5. コミットに署名する
  6. タグに署名する

S/MIME コミット署名の検証

S/MIME を使い、自分の Organization で発行した X.509 キーを用いてコミットに署名できます。

GitHub では、Mozilla ブラウザーで使用されるのと同じ信頼ストアである Debian ca-certificates パッケージを使用して、ローカル署名されたコミットとタグが、信頼されたルート証明書の公開キーに対して暗号で検証可能であることを確認します。

メモ

S/MIME 署名の検証は、Git 2.19 以降で利用できます。 git の最新バージョンを入手するには、Git の Web サイトを参照してください。

S/MIME を使用してコミットに署名し、それらのコミットを GitHubで検証するには、次の手順に従います。

  1. Git へ署名キーを伝える
  2. コミットに署名する
  3. タグに署名する

公開キーを GitHubにアップロードする必要はありません。

ボットの署名検証

コミット署名を必要とする組織や GitHub Apps は、ボットを使用してコミットに署名できます。 コミットまたはタグに暗号的に検証可能なボット署名がある場合、 GitHub はコミットまたはタグを検証済みとしてマークします。

ボットの署名検証は、リクエストが検証され、GitHub App またはボットとして認証されており、かつ Commits API などで指定するカスタム作成者情報、カスタムコミッター情報、カスタム署名情報のいずれも含まれていない場合にのみ機能します。

参考資料