Skip to main content

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

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

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

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

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

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

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

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

デフォルトのステータス

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

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

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

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

検証レコードには、検証が完了したときをマークするタイムスタンプが含まれます。 この永続的なレコードにより、一貫した検証済み状態が保証され、リポジトリ内のコントリビューションの安定した履歴が提供されます。 このタイムスタンプを見るには、GitHub で [Verified] バッジをポイントするか、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 は GPG を自動的に使用して、Web インターフェイスで行ったコミットに署名します。 GitHub によって署名されたコミットは、確認済みの状態になります。 https://github.com/web-flow.gpg で入手可能な公開キーを使用して、署名をローカルで確認できます。

オプションとして、GitHub Codespaces で行ったコミットを GitHub GPG で署名させることもできます。 codespace で 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 キーを使ってコミットに署名できます。 詳細については、user.Signingkey に関する Git リファレンス ドキュメントを参照してください。 GitHub で認証するために SSH キーを既に使用している場合は、署名キーとして使用するために同じキーをもう一度アップロードすることもできます。 アカウントに追加できる署名キーの数に制限はありません。

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

Note

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 パッケージを使用して、ローカル署名されたコミットとタグが信頼されたルート証明書の公開キーに対して暗号化で検証可能であることを確認します。

Note

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

S/MIME を使ってコミットに署名し、それらのコミットを GitHub 上で検証済みにするには、以下の手順に従ってください:

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

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

ボットの署名検証

コミットの署名が必要な Organization および GitHub Apps は、コミットの署名にボットを利用できます。 コミットまたはタグが暗号的に検証可能なボット署名を持っている場合、GitHub はそのコミットまたはタグを検証済みとしてマークします。

ボットの署名検証は、要求が検証され GitHub App またはボットとして認証されており、カスタム作者情報、カスタムコミッター情報、およびコミットAPI などのカスタム署名情報が含まれていない場合にのみ機能します。

参考資料