GPGによるコミットの署名

GitLab リポジトリで行ったコミットには、GPG(GNU Privacy Guard) キーで署名することができます。コミットに暗号署名を追加すると、そのコミットがなりすましではなく自分から発信されたものであることをより確実に保証することができます。GitLabが公開GPG鍵でコミット作成者の身元を確認できた場合、そのコミットはGitLab UIでVerifiedと表示されます。その後、プロジェクトのプッシュルールを設定して、GPGで署名されていないコミットを個別に拒否したり、検証されていないユーザーからのコミットをすべて拒否したりすることができます。

note
GitLabでは、すべてのOpenPGP、PGP、GPG関連の資料や実装に対してGPGという用語を使用しています。

GitLabがコミットを検証済みとみなすには:

  • コミッターは GPG 公開鍵/秘密鍵ペアを持っている必要があります。
  • コミッターの公開鍵は GitLab アカウントにアップロードされている必要があります。
  • GPG 公開鍵のメールアドレスの一つは、コミッターが GitLab で使っている認証済みのメールアドレスと一致しなければなりません。このアドレスを非公開にするには、GitLab がプロフィールで自動的に生成するコミット用の非公開メールアドレスを使います。
  • コミッターのメールアドレスは、GPG 鍵の検証済みメールアドレスと一致する必要があります。

GitLabは独自の鍵リングを使ってGPG署名を検証します。公開鍵サーバーにはアクセスしません。

GPGで検証されたタグはサポートされていません。

GPGの詳細については、関連トピックリストを参照してください。

ユーザーの公開GPG鍵の表示

ユーザーの公開GPG鍵を見るには、以下の方法があります:

  • https://gitlab.example.com/<USERNAME>.gpg にアクセスしてください。 GitLabは、ユーザーがGPGキーを設定している場合はGPGキーを表示し、GPGキーを設定していないユーザーの場合は空白のページを表示します。
  • ユーザーのプロフィール(https://gitlab.example.com/<USERNAME> など)にアクセスします。ユーザープロファイルの右上隅で、View public GPG keys({key})を選択します。

コミット署名の設定

コミットに署名するには、ローカルマシンと GitLab アカウントの両方を設定する必要があります:

  1. GPG キーを作成します。
  2. アカウントにGPGキーを追加します。
  3. GPGキーをGitに関連付けます
  4. Git のコミットに署名します。

GPG キーの作成

GPGキーをまだお持ちでない場合は、作成してください:

  1. お使いのオペレーションシステムにGPGをインストールしてください。お使いのオペレーティング・システムにgpg2 がインストールされている場合は、このページのコマンドでgpggpg2 に置き換えてください。
  2. 鍵ペアを生成するには、gpg のバージョンに適したコマンドを実行します:

    # Use this command for the default version of GPG, including
    # Gpg4win on Windows, and most macOS versions:
    gpg --gen-key
       
    # Use this command for versions of GPG later than 2.1.17:
    gpg --full-gen-key
    
  3. 鍵が使用するアルゴリズムを選択するか、Enter を押してデフォルトのオプション、RSA and RSA を選択します。
  4. 鍵の長さをビット単位で選択します。GitLabは4096ビットの鍵を推奨しています。
  5. 鍵の有効期間を指定します。この値は主観的なもので、デフォルト値は有効期限なしです。
  6. 回答を確認するには、y を入力します。
  7. 名前を入力してください。
  8. メールアドレスを入力してください。GitLabアカウントの認証済みメールアドレスと一致している必要があります。
  9. オプションです。名前の後の括弧内に表示するコメントを入力してください。
  10. GPG は、これまでに入力した情報を表示します。情報を編集するか、O (Okay の場合) を押して続行します。
  11. 強力なパスワードを入力し、確認のためにもう一度入力します。
  12. 秘密鍵GPGを一覧表示するには、このコマンドを実行します。<EMAIL> は、鍵を生成したときに使用したメールアドレスに置き換えてください:

    gpg --list-secret-keys --keyid-format LONG <EMAIL>
    
  13. 出力で、sec 行を確認し、GPG 鍵 ID をコピーしてください。これは/ 文字の内部から始まります。この例では、鍵IDは30F2B65B9246B6CA です:

    sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
          D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
    uid                   [ultimate] Mr. Robot <your_email>
    ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
    
  14. 関連する公開鍵を表示するには、このコマンドを実行し、<ID> を前のステップの GPG 鍵 ID に置き換えます:

    gpg --armor --export <ID>
    
  15. BEGIN PGP PUBLIC KEY BLOCKEND PGP PUBLIC KEY BLOCK の行を含む公開鍵をコピーします。この鍵は次のステップで必要になります。

アカウントにGPGキーを追加

ユーザー設定にGPGキーを追加するには、以下の手順に従います:

  1. GitLab にサインインします。
  2. 左のサイドバーで、自分のアバターを選択してください。
  3. プロフィールの編集を選択します。
  4. GPGキー({key})を選択します。
  5. Add new keyを選択します。
  6. Keyに _公開_鍵を貼り付けます。
  7. 鍵をアカウントに追加するには、Add keyを選択します。GitLabは鍵の指紋、メールアドレス、作成日を表示します:

    GPG key single page

キーを追加した後は編集できません。その代わりに、問題のある鍵を削除して再度追加してください。

Git に GPG 鍵を関連付けます。

GPG 鍵を作成してアカウントに追加したら、Git がその鍵を使うように設定しなければなりません:

  1. このコマンドを実行すると、先ほど作成した GPG 秘密鍵の一覧が表示されます。<EMAIL> を鍵のアドレスに置き換えてください:

    gpg --list-secret-keys --keyid-format LONG <EMAIL>
    
  2. sec で始まる GPG 秘密鍵 ID をコピーします。 この例では、秘密鍵 ID は30F2B65B9246B6CA です:

    sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
          D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
    uid                   [ultimate] Mr. Robot <your_email>
    ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
    
  3. このコマンドを実行すると、Git があなたの鍵でコミットに署名するように設定されます。<KEY ID> をあなたの GPG 鍵 ID に置き換えてください:

    git config --global user.signingkey <KEY ID>
    

Git のコミットへの署名

公開鍵をアカウントに追加したら、コミットひとつひとつに手動で署名することもできますし、Git がデフォルトで署名付きコミットを行うように設定することもできます:

  • Git の各コミットに手動で署名します:
    1. 署名したいコミットに-S フラグを追加します:

      git commit -S -m "My commit message"
      
    2. GPGキーのパスフレーズを入力します。
    3. GitLab にプッシュして、コミットが検証されていることを確認します。
  • デフォルトでは、このコマンドを実行してすべての Git コミットに署名します:

     git config --global commit.gpgsign true
    

条件付きで署名キーを設定

仕事用と個人用など、別々の目的で署名鍵を管理する場合は、.gitconfig ファイルでIncludeIf ステートメントを使い、どの鍵でコミットに署名するかを設定します。

前提条件:

  • Git バージョン 2.13 以降が必要です。
  1. メインの~/.gitconfig ファイルと同じディレクトリに、.gitconfig-gitlab.
  2. メインの~/.gitconfig ファイルに、GitLab 以外のプロジェクトで作業するための Git 設定を追加します。
  3. この情報をメインの~/.gitconfig ファイルの最後に追加してください:

    # The contents of this file are included only for GitLab.com URLs
    [includeIf "hasconfig:remote.*.url:https://gitlab.com/**"]
       
    # Edit this line to point to your alternate configuration file
    path = ~/.gitconfig-gitlab
    
  4. 代替.gitconfig-gitlab ファイルに、GitLab リポジトリにコミットするときに使用する設定オーバーライドを追加します。メインの~/.gitconfig ファイルの設定は、明示的に上書きしない限りすべて保持されます。この例では

    # Alternate ~/.gitconfig-gitlab file
    # These values are used for repositories matching the string 'gitlab.com',
    # and override their corresponding values in ~/.gitconfig
       
    [user]
    email = you@example.com
    signingkey = <KEY ID>
       
    [commit]
    gpgsign = true
    

コミットの確認

マージリクエストやプロジェクト全体のコミットをレビューすることができます:

  1. プロジェクトのコミットをレビューするには:
    1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
    2. コード > コミットを選択します。
  2. マージリクエストのコミットをレビューするには
    1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
    2. コード > マージリクエストを選択し、マージリクエストを選択します。
    3. コミットを選択します。
  3. レビューしたいコミットを確認します。署名済みのコミットには、GPG 署名の検証状況に応じてVerifiedまたはUnverifiedバッジが表示されます。未署名のコミットにはバッジは表示されません:

    Signed and unsigned commits

  4. コミットの署名の詳細を表示するには、GPG バッジを選択します:

    Signed commit with verified signature

    Signed commit with unverified signature

GPGキーの取り消し

GPGの鍵が危なくなったら、その鍵を失効させましょう。キーを取り消すと、将来のコミットも過去のコミットも変更されます:

  • この鍵で署名された過去のコミットは未検証としてマークされます。
  • このキーで署名された将来のコミットは未検証としてマークされます。

GPG 鍵を破棄するには

  1. 左のサイドバーで、自分のアバターを選択してください。
  2. プロフィールの編集を選択します。
  3. GPGキー({key})を選択します。
  4. 削除する GPG キーの横にある [失効] を選択します。

GPG キーの削除

GitLabアカウントからGPGキーを削除する場合:

  • この鍵で署名された以前のコミットは検証されたままです。
  • この鍵を使用しようとする将来のコミット (作成されたがまだプッシュされていないコミットを含む) は検証されません。

アカウントからGPGキーを削除するには

  1. 左のサイドバーで、自分のアバターを選択してください。
  2. プロフィールの編集を選択します。
  3. GPGキー({key})を選択します。
  4. 削除する GPG キーの横にある [削除]({remove}) を選択します。

将来のコミットと過去のコミットの両方の検証を解除する必要がある場合は、代わりに関連するGPGキーを取り消します

トラブルシューティング

署名付きコミットの検証に関する問題の修正

コミットには、X.509 証明書や GPG 鍵を使って署名することができます。どちらの方法でも、複数の理由で検証プロセスに失敗することがあります:

説明可能な修正
UNVERIFIEDコミット署名が無効です。有効な署名でコミットに署名してください。
SAME_USER_DIFFERENT_EMAILコミットへの署名に使われた GPG 鍵にはコミッターの電子メールは含まれていませんが、コミッターの別の有効な電子メールは含まれています。コミットを修正して GPG 鍵と一致するメールアドレスを使用するか、GPG 鍵を更新してメールアドレスを含めるようにしてください。
OTHER_USER署名と GPG 鍵は有効ですが、鍵がコミッターとは別のユーザーのものです。正しいメールアドレスを使用するようにコミットを修正するか、ユーザーに関連付けられたGPGキーを使用するようにコミットを修正してください。
UNVERIFIED_KEYGPG 署名に関連付けられた鍵には、コミッターに関連付けられた検証済みのメールアドレスがありません。GitLab プロファイルにメールを追加して検証するか、GPG 鍵を更新してメールアドレスを含めるか、コミットを修正して別のコミッターのメールアドレスを使用してください。
UNKNOWN_KEYこのコミットの GPG 署名に関連付けられた GPG 鍵が GitLab にとって不明です。 GPGキーをGitLabプロファイルに追加してください。
MULTIPLE_SIGNATURESコミットに対して複数の GPG または X.509 署名が見つかりました。GPGまたはX.509署名を1つだけ使用するようにコミットを修正してください。

シークレットキーが使用できません。

secret key not available またはgpg: signing failed: secret key not available のエラーが表示された場合は、gpgの代わりにgpg2 を使用してみてください:

git config --global gpg.program gpg2

GPG鍵がパスワードで保護されていて、パスワード入力プロンプトが表示されない場合は、シェルのrc ファイルにexport GPG_TTY=$(tty) を追加してください (一般的には~/.bashrc または~/.zshrc)。

GPGがデータへの署名に失敗しました

GPGキーがパスワードで保護されていて、エラーが表示された場合:

error: gpg failed to sign the data
fatal: failed to write commit object

パスワード入力プロンプトが表示されない場合は、シェルのrc ファイル (一般的には~/.bashrc または~/.zshrc) にexport GPG_TTY=$(tty) を追加し、ターミナルを再起動してください。