GitHub署名付きでコミットしてかっこつける

2020/09/25に公開

署名とは

このようにVertifiedと書かれたコミットを見たことがありませんか?
Vertifiedされたコミット

かっこよ!!!

調べてみると公式のヘルプページにはこう書かれていました

GPG あるいは S/MIME を使って、タグやコミットにローカルで署名できます。 それらのタグやコミットは検証済みとして GitHub上でマークされ、他の人々がその変更が信頼できるソースから来たものと信頼できるようになります。

つまり、「これは信頼できるコミットだよ」って表現することができるということですね。(かっこつけるためではないようです)と

そもそも、署名を行わない場合GitHub側でクライアントとGitHubアカウントとの紐付けをメールアドレスの一致のみで行います。もし、Gitに他人のメールアドレスを設定した場合そのメールアドレスを持ったGitHubアカウントと紐付けられます。

ここで、自分のアカウントと署名を紐付けることで自分のアカウントによるコミットと証明する仕組みだそうです。

この署名にはGPGとS/MIMEの2種類があるそうです。今回はGPGを扱っていきます。もう1つのS/MIMEはどうやらOrganizationで使うものらしいです。

GPGを使い始める

GPGのインストール

Windowsの場合はGpg4win、mac OSの場合はGPGToolsをインストールしておきます。
Linuxの場合は

$ sudo apt install gpg

でインストールできます。

個人的にはWindowsのかたもWSLを使ったほうが楽だと思ういます

新しい鍵を作る

今回は2種類ペアの鍵が必要になります。

  1. このコードをコマンドプロンプト/ターミナルに入力し実行します

    $ gpg --full-generate-key
    
  2. 暗号化の方式を聞かれるのでそのままEnterを打ちます。

  3. 暗号の長さは4096ビット以上ではなければならないらしいですが、RSAの最長値は4096ビットのでそのまま4096と入力します。

  4. 鍵の有効期限を設定します。デフォルトの無期限で良い場合そのままエンターキーを押します。

  5. 内容を確認してくださいと聞かれるので、yと入力してEnterを押します。
    ここまでの流れはこんな感じです
    ここまでの流れ

  6. Realname:って聞かれてますけど普通にGitHubのID・メールアドレスを入力します。このとき、Gitに登録されているメールアドレスを指定してください。
    GitHubの情報を設定
    ちなみにコメントは何も書かずにEnterを押して大丈夫です。

  7. 修正する点がなければOと入力します。(IDを間違えた場合はN、メールアドレスを間違えたらEと入力します)

  8. パスワードを指定が求められるので、突破されないようなパスワードを指定します。
    パスワード打つ画面ハッカー感があって格好いい

  9. この画面が出たら成功です!
    成功!

確認・GitHub連携

$ gpg --list-secret-keys --keyid-format LONG

と打つと先ほど作成したキーが出てくるはずです。

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/appare/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/________ 2020-09-24 [SC]
      /////////////////////////////////
uid                 [ultimate] appare45 <mail@example.com>
ssb   rsa4096/****************** 2020-09-24 [E]

この図の_________の部分ををコピーしておきます。
(僕はコピーするところを間違えてめっちゃ時間をとられました)

$ gpg --armor --export ______________

として実行します。

すると、謎の文字列が出力されます。これが生の暗号鍵です。-----BEGIN PGP PUBLIC KEY BLOCK-----から-----END PGP PUBLIC KEY BLOCK-----の部分をコピーします。

GitHubの設定メニューからGPGキーを追加します。フィードに先ほどコピーした内容を貼り付けます。
GitHubの鍵の設定メニュー

$ test -r ~/.bash_profile && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile
$ echo 'export GPG_TTY=$(tty)' >> ~/.profile

この2つのコマンドを実行します

Gitに登録

ローカルのGitに対して、コミット時に使用する鍵を指定します。

$ git config --global -e

このコマンドを実行すると自動的にエディターが起動して.gitconfigが表示されます。
このはじめの部分([user])のsigningkey=先ほどコピーした鍵のidを追加します。

.gitconfig
[user]
	name = appare45
	email = 64473501+appare45@users.noreply.github.com 
	signingkey = 5889DA3AEFAC1F3A

これで設定は完了です。

コミット

かっこつけてコミットするには

$ git commit -S -m 'コミットメッセージ'

としてあげればOKです。

Tips

鍵に複数のメールアドレスを登録する

GPGの鍵に対して複数のメールアドレスを登録したい場合があると思います。その場合、すでにある鍵に対してメールアドレスを追加できます。

$ gpg -K

鍵の一覧が表示されるので、編集したい鍵のID(赤い部分)をコピーします。
Image from Gyazo

$ gpg --edit-key 先ほどコピーしたID

すると入力待ちの画面になります。adduidを入力します。

gpg > adduid

すると先ほどと同じID登録に進むので同じ手順で登録を行います。
IDを追加すると、鍵の内容が新しくなるのでGitHubに登録している鍵も1度削除して登録しなおしてください。

コミット時にデフォルトで署名するよう指定する

コミットの時毎度-Sを付けるのは面倒なのでデフォルトで署名をオンにします。

$ git config --global --add commit.gpgsign true

これで自動的に署名が行われるようになりました。

上手くいかないときは

僕はこれをやったら上手くいきました。

$ echo "test" | gpg2 --clearsign

としてパスフレーズを入力すると上手くいきます

参考

Discussion