git のコミットを GnuPG を使って署名付きにする
2017-10-17 09:00
  • 先日とあるプロジェクトのプルリクエストやコミットログを眺めていると、
    コミットメッセージの横に「 Verified 」と表示されているコミットを見つけました。

    軽く調べてみると、コミットやマージ、タグ作成の際に署名することができて、
    そうすることで、その内容が信頼できるものか判断できるようになるよ、っていう話みたいです。

    それには GnuPG というのが使われていて、鍵ペアを作成→ github に登録しなければならない、と。
    いまいますぐに必要というわけでもないですが、プロジェクトによっては署名付きコミットが必須のところも
    あるようなので、今のうちに入れておきます。

    まずは鍵ペアを作成するために必要な gpg コマンドをインストールします。

    GnuPG をインストールする

    ここの公式手順に従って GnuPG のインストールを進めていきました。
    ぼくは間違って GUI ツールをインストールしてしまいましたが、安心してください。コマンドラインツールのみでも提供されています!

    ぶっちゃけ homebrew でインストールするのが一番ラクです。笑

    gpg コマンドをインストールする


    $ brew install gnupg

    $ gpg --version
    gpg (GnuPG) 2.2.1
    libgcrypt 1.8.1
    Copyright (C) 2017 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    Home: /Users/xxxx/.gnupg
    サポートしているアルゴリズム:
    公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
    暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
    TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
    ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
    圧縮: 無圧縮, ZIP, ZLIB, BZIP2



    鍵ペアを作成する


    基本的には github のヘルプに書かれているとおりに実行していきますが、ぼくの mac はデフォルトの RSA が 2048 bit なので叩くコマンドを変更しました。

    鍵を作成する


    # --full-generate-key を実行すると作成する鍵の種類、ビット長、有効期限が選べます。

    $ gpg --full-generate-key
    gpg (GnuPG) 2.2.1; Copyright (C) 2017 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

    ご希望の鍵の種類を選択してください:
    (1) RSA と RSA (デフォルト)
    (2) DSA と Elgamal
    (3) DSA (署名のみ)
    (4) RSA (署名のみ)
    あなたの選択は? 1 <--- デフォルトのまま
    RSA 鍵は 1024 から 4096 ビットの長さで可能です。
    鍵長は? (2048) 4096 <-- github help にあるように、 4096 にしておきます
    要求された鍵長は4096ビット
    鍵の有効期限を指定してください。
    0 = 鍵は無期限
    = 鍵は n 日間で期限切れ
    w = 鍵は n 週間で期限切れ
    m = 鍵は n か月間で期限切れ
    y = 鍵は n 年間で期限切れ
    鍵の有効期間は? (0)10y <-- デフォルトは 2 年間となっているようでしたが、ここでは 10 年にしておきます。
    鍵は木 10/14 13:31:04 2027 JSTで期限切れとなります
    これで正しいですか? (y/N) y

    GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

    本名: ryotsun
    電子メール・アドレス: hogehogoe@hogehoge.com
    コメント: personal github account
    次のユーザIDを選択しました:
    "ryotsun (personal github account) "

    名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O <--- 問題なければ O を入力します

    # 以下、画面が切り替わり、文字化けした画面が表示されますが、パスフレーズの入力画面だと思われます。
    # パスフレーズを入力してエンターキーを押します

    たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
    す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
    成器に十分なエントロピーを供給する機会を与えることができます。

    # 続いてパスフレーズの確認画面が表示されます
    # パスフレーズを入力してエンターキーを押します
    たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
    す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
    成器に十分なエントロピーを供給する機会を与えることができます。
    gpg: 鍵8E7DFDD08F9F4EC2を究極的に信用するよう記録しました
    gpg: ディレクトリ'/Users/xxxxxx/.gnupg/openpgp-revocs.d'が作成されました
    gpg: 失効証明書を '/Users/xxxxxx/.gnupg/openpgp-revocs.d/26FCABFCC6C098246AC5A69B8E7DFDD08F9F4EC2.rev' に保管しました。
    公開鍵と秘密鍵を作成し、署名しました。

    pub rsa4096 2017-10-16 [SC] [有効期限: 2027-10-14]
    26FCABFCC6C098246AC5A69B8E7DFDD08F9F4EC2
    uid ryotsun (personal github account)
    sub rsa4096 2017-10-16 [E] [有効期限: 2027-10-14]



    こんな感じで鍵の作成ができます。

    鍵の確認をする


    $ gpg --list-secret-keys
    gpg: 信用データベースの検査
    gpg: marginals needed: 3 completes needed: 1 trust model: pgp
    gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
    gpg: 次回の信用データベース検査は、2027-10-14です
    /Users/xxxxx/.gnupg/pubring.kbx
    -----------------------------------
    sec rsa4096 2017-10-16 [SC] [有効期限: 2027-10-14]
    26FCABFCC6C098246AC5A69B8E7DFDD08F9F4EC2
    uid [ 究極 ] ryotsun (personal github account)
    ssb rsa4096 2017-10-16 [E] [有効期限: 2027-10-14]



    github に GPG 公開鍵を登録する

    まず、登録する秘密鍵の情報を表示し、鍵の ID を確認します。

    ID を確認する


    $ gpg --list-secret-keys --keyid-format LONG
    /Users/xxxxx/.gnupg/pubring.kbx
    -----------------------------------
    sec rsa4096/8E7DFDD08F9F4EC2 2017-10-16 [SC] [有効期限: 2027-10-14]
    26FCABFCC6C098246AC5A69B8E7DFDD08F9F4EC2
    uid [ 究極 ] ryotsun (personal github account)
    ssb rsa4096/C24DE64CA5B6A369 2017-10-16 [E] [有効期限: 2027-10-14]


    sec rsa4096/8E7DFDD08F9F4EC2 と書かれている部分の、 / スラッシュのあとの 8E7DFDD08F9F4EC2 が ID となります。
    公開鍵の中身を表示する


    $ gpg --armor --export 3AA5C34371567BD2
    -----BEGIN PGP PUBLIC KEY BLOCK-----

    mQINBFnkNiwBEAC7v/X7f2LQnb2XwsqSKhd+JFTadAdqSiSshvGQ4ilG3KhkXKfb
    2kMaf41BQNS0U9dQNl5DCGCRyFXHBxGeW8S65O1FtjPqZKIca5HUIJe5ZX4Szl+k
    ....## 中略 ##
    FQuGdpWfCWh3M1K2ku6F5dsfzY8ceOz1bhGW5HJHs567Z2/8MzwC0mj3Uj3UxCTk
    f9A6uPWP8II3HFGnQy18XTVBaPqYZaDj6g/gk1+wFXFz
    =r63s
    -----END PGP PUBLIC KEY BLOCK-----

    こんな感じで出力されるので、必ず -----BEGIN PGP PUBLIC KEY BLOCK----- から-----END PGP PUBLIC KEY BLOCK----- までコピーしましょう。

    github に公開鍵を登録する

    https://github.com/settings/keys にアクセスし、
    New GPG keyボタンをクリックして、先程コピーした公開鍵を貼り付けます。
    貼り付けたら、 Add GPG key で鍵を登録します。

    git の設定をする

    github への鍵登録が済んだら、次はローカルの git の設定をします。

    参考資料

    https://help.github.com/articles/telling-git-about-your-gpg-key/


    ## ぼくはリポジトリごとにユーザーを設定したいので、明示的に local を指定しています。
    ## 不要な場合は --global にしてください。
    $ git config --local user.signingkey 8E7DFDD08F9F4EC2
    $ echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile
    # .bash_profile の更新を反映
    $ source ~/.bash_profile

    これで準備が整いました。

    実際にコミットして確認する

    適当なリポジトリを作って何かをコミットしてみます。

    僕の場合は新規でテストリポジトリを作りました。
    README.md をコミットしてみます。
    テスト用コミット


    $ git commit -S -m "Initial commit"

    ##このあと、パスフレーズを聞かれるので入力します

    [master (root-commit) 247400a] Initial commit
    1 file changed, 0 insertions(+), 0 deletions(-)
    create mode 100644 README.md



    無事にコミットできました。

    なお、毎回 -S オプションを付けて署名するのは面倒だと思うので、以下で有効化します。僕の場合は例によってこのリポジトリのみ反映させます。

    署名を自動的に付加する


    $ git config commit.gpgsign true

    これで -S が不要になりました。

    ログ確認


    $ git show --show-signature
    commit 247400a32bc98c5100431e62b6a1ae6ca7ae2341
    gpg: 月 10/16 14:03:40 2017 JSTに施された署名
    gpg: RSA鍵26FCABFCC6C098246AC5A69B8E7DFDD08F9F4EC2を使用
    gpg: "ryotsun (personal github account) "からの正しい署名 [究極]
    Author: ryotsun
    Date: Mon Oct 16 14:03:40 2017 +0900

    Initial commit

    diff --git a/README.md b/README.md
    new file mode 100644
    index 0000000..e69de29



    なんか日本語だとダサいですねw
    最後に、リモートにプッシュして github 上でもバッジを確認しておきます。


    github gig verified

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2017-10-17 09:00
  • ツール
  • gitgithubGnuPGgpg秘密鍵署名コミット
  • 新しい記事へ
    Django でマークダウン記法っぽいものを実装する(その1)

    古い記事へ
    今月やりたいことリスト(2017年10月)

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 普段はなんちゃってプログラマやってます。海外から帰任してからは現場に戻って最前線でコード書いてます。 週末は気の向くままにプログラミングしたり、写真撮りに出かけたり、家でhuluみながらまったりしたりしています。(*´ω`*)モキュ