Yubikeyを使って、Githubのcommitをverifyする


個人的な興味でGithubや色んな証明周りを、ぼくである、と証明するために、Yubikeyを使い始めました。

現状認証や証明させているものの一覧は以下のような感じです。

- 認証
    - mac
    - github
    - facebook
    - dropbox
    - kraken
    - SSH(さくらインターネット, AWS)ログイン
- 証明
    - **github(GnuPG(commit verify))** ← 今回はこれ
    - メール(S/MIME(IdenTrust)及びGnuPG(暗号メール))
    - Keybase(GnuPGをアップロードできる)
    - Facebook(GnuPGをアップロードするページが用意されている)
- 署名（暗号化含む）
	- Atom（atom-gpg pluginをインストール）
	- iCloudの一部重要なメモ類（GnuPGで暗号化）

若干ありきたりではありますけども、証明できるもの、認証できるもの、署名できるものは全てYubikeyに依存し始めました。

iCloudのメモをYubikey＋GnuPGで暗号化しておくのはなかなかイケてるな、と思ってます。
説明はこの辺を参考にどうぞ

[Using GPG and SSH keys (GnuPG 2.1) with a Smartcard (Yubikey 4)](https://suva.sh/posts/gpg-ssh-smartcard-yubikey-keybase/)
[PGP 鍵を用いたファイルの暗号化](https://qiita.com/umi/items/2074aac509a6e78c4ef4)

ちなみに、ぼくのカード情報は…と思ったけど、出力したら色々個人情報露出することになるやないかーい！

## 今回やろうと思っていること

GithubをMacとYubikeyを使い、commit時にverifyをつける

どういうことかというと、詳細は以下を参照ください。

![verify.png](https://qiita-image-store.s3.amazonaws.com/0/13837/3313a816-8932-d83d-bbc1-4fb8c3a1533f.png "verify.png")

Verifiedがついててかっこいい！
ぼくがcommitしたんだよ！ってことを証明しています。

## なぜYubikeyが必要なのか？

Yubikey一つあれば署名も証明も暗号化も行えます。
Yubikeyがない人は単純にGPG Suiteをインストールし、GPG鍵（秘密鍵・公開鍵）を作成するだけでも証明できます。
でも、GPG Suiteだけだと弱いんです。
何が弱いって、証明する物理的なものがないから弱いんです。
GPG Suiteだけ使った場合、MacやWindows, Linuxが自分のものであれば、証明そのものは問題ありません
アカウントハックされた場合の方に問題があり、パスフレーズも漏れている場合、乗っ取られたマシンで簡単に証明や署名、復号化が出来てしまいます。

**Yubikeyを使っている場合、そのYubikeyを物理的に差さないと署名や証明、復号化はできません。**
外出時、離席時は抜くようにすれば、第三者が何かしようと思っても、あれ？あれ？となり、証明する手段がありませんので、物理的な機器があると強いんです。

## GnuPGを使うための事前準備

ていうてもググったら出てくる情報をまとめているだけですが…。

```
brew install gnupg@2.0 pinentry pinentry-mac gpg-agent
```

[GPG Suite](https://gpgtools.org/)を入れておきます。

gpg --card-editコマンドなどの使い方は以下に説明があります（英語ですが
[Using GPG and SSH keys (GnuPG 2.1) with a Smartcard (Yubikey 4)](https://suva.sh/posts/gpg-ssh-smartcard-yubikey-keybase/)

あ、この記事に２つ目のアドレスを追加する方法が書かれてるからやってみよう…（今回の記事に関係ないけど気づいてしまった）

ともかく、記事通りにセットアップができれば、あとは、以下の要領でconfig周りに手を入れていきます。

vim ~/.gnupg/gpg.conf

```
use-agent
```

batch <- これも使っちゃダメでした。(2018/2/14)


vim ~/.gnupg/gpg-agent.conf
(macの場合はいらないことが判明しました。エラーが出るようならなくてOKです。)

```
use-standard-socket
pinentory-program /usr/local/bin/pinentory-mac
```

最後に.gitconfigもしくは.git/configのために以下のコマンドを叩きます。

user.signingkey XXXXXXXXXXXで鍵のsecretを指定するのですが、確認方法は、以下のコマンドで確認できます。

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

出力結果の例

```
yxxxxx:~ y_xxxxx$ gpg --list-secret-keys --keyid-format LONG
/Users/y_xxxxx/.gnupg/pubring.kbx
-----------------------------------
sec>  rsa4096/XXXXXXXXXXXXXXXX 2018-01-27 [SC]
      58F7C266F3F62 ~ BAD8E247C4C
   カードシリアル番号 = 0001 01111110
uid                 [  究極  ] yyyy xxxxx (by comment) <y.xxxxx@example.com>
ssb>  rsa4096/YYYYYYYYYYYYYYYY 2018-01-27 [A]
ssb>  rsa4096/ZZZZZZZZZZZZZZZZ 2018-01-27 [E]

```

.gitconfigに書いてしまって良い場合は以下のような感じです。

```
git config --global user.name "xxxx yyyyy"
git config --global user.email "y.xxxx@example.com"
git config --global gpg.program $(which gpg)
git config --global user.signingkey XXXXXXXXXXXXXXXX
git config --global commit.gpgsign true
```

個別に指定する場合は、git cloneした中にある.git/configにコマンドを実行します。

```
git config --local user.name "xxxx yyyyy"
git config --local user.email "y.xxxx@example.com"
git config --local gpg.program $(which gpg)
git config --local user.signingkey XXXXXXXXXXXXXXXX
git config --local commit.gpgsign true
```

これでgit commitとgit pushすれば完了です。
（別件が入りばたついてきたので、ご不明な点があればコメントください）