GPGによるコミットの署名

  • GitLab 9.5で導入されました
  • GitLab 10.1 でサブキーのサポートが追加されました。

GitLabリポジトリで行われたGitコミットには、GPG鍵を使って署名することができます。 署名されたコミットは、コミッターの身元が確認できればVerifiedと表示されます。 コミッターの身元を確認するには、GitLabはその公開GPG鍵を要求します。

注:GPGという用語は、すべてのOpenPGP/PGP/GPG関連の資料と実装に対して使われます。

GPG認証タグはまだサポートされていません。

GPGの詳細については、参考文献をご覧ください。

GitLabのGPGの扱い方

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

GitLab で検証されるコミット:

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

GPGキーの生成

まだGPG鍵を持っていない場合は、以下の手順で始めることができます:

  1. お使いのオペレーティング・システムにGPGをインストールしてください。お使いのオペレーティング・システムにgpg2 がインストールされている場合は、以下のコマンドのgpggpg2 に置き換えてください。
  2. 以下のコマンドで秘密鍵と公開鍵のペアを生成します:

    gpg --full-gen-key
    
    注:Windowsや他のMacOSバージョンのGpg4winのような場合、ここでのコマンドはgpg --gen-key
  3. 最初の質問は、どのアルゴリズムを使用できるかです。希望の種類を選択するか、Enter 、デフォルト(RSAおよびRSA)を選択します:

    Please select what kind of key you want:
       (1) RSA and RSA (default)
       (2) DSA and Elgamal
       (3) DSA (sign only)
       (4) RSA (sign only)
    Your selection? 1
    
  4. 次の質問はキーの長さです。4096を選択することをお勧めします:

    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048) 4096
    Requested keysize is 4096 bits
    
  5. 鍵の有効期間を指定します。 これは主観的なものであり、デフォルト値である「無期限」を使用することもできます:

    Please specify how long the key should be valid.
             0 = key does not expire
          <n>  = key expires in n days
          <n>w = key expires in n weeks
          <n>m = key expires in n months
          <n>y = key expires in n years
    Key is valid for? (0) 0
    Key does not expire at all
    
  6. yと入力して、入力した答えが正しいことを確認してください:

    Is this correct? (y/N) y
    
  7. 本名、この鍵に関連付けるメールアドレス(GitLab で使用している認証済みメールアドレスと一致する必要があります)、オプションのコメントを入力します(Enter を押すとスキップされます):

    GnuPG needs to construct a user ID to identify your key.
    
    Real name: Mr. Robot
    Email address: <your_email>
    Comment:
    You selected this USER-ID:
        "Mr. Robot <your_email>"
    
    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
    
  8. 聞かれたら強力なパスワードを選び、確認のために2回入力してください。
  9. 以下のコマンドを使用して、作成したばかりのGPG秘密鍵を一覧表示します:

    gpg --list-secret-keys --keyid-format LONG <your_email>
    

    <your_email> を上記で入力したメールアドレスに置き換えてください。

  10. secで始まるGPG鍵IDをコピーします。 以下の例では、30F2B65B9246B6CAです:

    sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
          D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
    uid                   [ultimate] Mr. Robot <your_email>
    ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
    
  11. そのIDの公開鍵をエクスポートします(前のステップで使用した鍵IDを置き換えてください):

    gpg --armor --export 30F2B65B9246B6CA
    
  12. 最後に公開鍵をコピーし、プロフィール設定に追加します。

アカウントへのGPGキーの追加

注意:一度追加したキーは編集できず、削除することしかできません。 貼り付けがうまくいかなかった場合は、問題のキーを削除して再度追加する必要があります。

プロフィールの設定でGPGキーを追加できます:

  1. 右上のアバターをクリックし、「設定」に進んでください。

    Settings dropdown

  2. GPG keysタブに移動し、公開_鍵を_‘Key’ボックスに貼り付けます。

    Paste GPG public key

  3. 最後にAdd keyをクリックして GitLab に追加すると、フィンガープリントと対応するメールアドレス、作成日が表示されます。

    GPG key single page

GPG キーと Git の関連付け

GPG 鍵を作成してアカウントに追加したら、今度はどの鍵を使うのかを git に伝えます。

  1. 以下のコマンドを使用して、作成したばかりのGPG秘密鍵を一覧表示します:

    gpg --list-secret-keys --keyid-format LONG <your_email>
    

    <your_email> を上記で入力したメールアドレスに置き換えてください。

  2. secで始まるGPG鍵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に伝えます:

    git config --global user.signingkey 30F2B65B9246B6CA
    

    30F2B65B9246B6CA を GPG 鍵 ID に置き換えてください。

  4. (オプション)gitがgpg を使っていて、secret key not availablegpg: signing failed: secret key not availableのようなエラーが出る場合は、以下のコマンドを実行してgpg2に変更してください:

    git config --global gpg.program gpg2
    

コミットへのサイン

GPGキーを作成し、アカウントに追加したら、コミットへの署名を開始できます:

  1. 以前と同じようにコミットします。唯一の違いは、-S フラグを追加したことです:

    git commit -S -m "My commit msg"
    
  2. と聞かれたら、GPGキーのパスフレーズを入力します。
  3. GitLab にプッシュし、コミットが検証されていることを確認します。

コミットのたびに-S フラグを打つのが面倒なら、git に自動的に署名させることもできます:

git config --global commit.gpgsign true

コミットの検証

  1. プロジェクトやマージリクエストの中で、コミットタブに移動します。 署名されたコミットには、GPG 署名の検証状況に応じて、”Verified” または “Unverified” のバッジが表示されます。

    Signed and unsigned commits

  2. GPGバッジをクリックすると、署名の詳細が表示されます。

    Signed commit with verified signature

    Signed commit with verified signature

GPG 鍵の失効

鍵を失効させると、すでに署名済みのコミットは検証されなくなります。 この鍵を使用して検証されたコミットは、未検証の状態に変わります。 この鍵を失効させると、今後のコミットも未検証のままになります。 このアクションは、鍵が漏洩した場合に使用します。

GPGキーを失効させるには

  1. 右上のアバターをクリックし、「設定」に進んでください。
  2. GPGキーのタブに移動します。
  3. 削除したいGPGキーの横にある「Revoke」をクリックします。

GPGキーの削除

鍵を削除しても、すでに署名されたコミットの検証は解除されません。 この鍵を使用して検証されたコミットは検証されたままです。 この鍵を削除すると、プッシュされていないコミットだけが検証されないままになります。 すでに署名されたコミットの検証を解除するには、関連するGPG鍵をアカウントから削除する必要があります。

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

  1. 右上のアバターをクリックし、「設定」に進んでください。
  2. GPGキーのタブに移動します。
  3. 削除したいGPGキーの上にあるゴミ箱アイコンをクリックします。

署名されていないコミットの拒否

GPG署名されていないコミットをプッシュルールで拒否するようにプロジェクトを設定できます。

GPG署名API

API経由でコミットからGPG署名を取得する方法について説明します。

さらに読む

GPGの詳細については、こちらをご覧ください: