個人のプライベートリポジトリだとあまり問題になりませんが、最近の Github は悪意のある偽装アカウントの PR、捨てアカウントによる悪意のあるコード混入など、セキュリティ的な問題が色々存在します。 そこで、GPG 鍵を設定し、Verifiedしたコミットを行うこともパブリックでは 1 つのマナー化しつつあります。 そんな GPG Key の設定方法についての方法を記載します

Linux で HTTPS での Git 操作を行う

…という前に Windows では Git Credential Manager for Windows が Git インストール時に基本的に付属しているため、 Github からのクローンやプッシュはそんなに大変なことではありません。Windows の資格情報に書き込んでしまえば、大抵のことはできます

が、Linux は少し面倒です(SSH オンリー対応なら楽ですが)
認証の方法は OAuth など色々な方法があるのですが、私は git-credential-managerpassを利用する方法を採用しています。 passは Linux で使えるパスワードマネージャーです。これならばターミナル上だけで操作する場合、完結が可能です

passは Homebrew などでインストールできます

brew install pass

git-credential-managerは Github のマニュアルのまま取得すれば良いです。Ubuntu の場合を示します

wget https://github.com/GitCredentialManager/git-credential-manager/releases/download/xxxx.deb
sudo dpkg -i xxxxxxx.deb
git-credential-manager-core configure

これで.gitconfigが書き換えられていることが確認できます
ただし、ここからCredential Storeの設定が必要になります

git config --global credential.credentialStore gpg

更に、Linux の場合GPG_TTYを環境変数に設定しないと怒られます。その為、シェルの環境変数に設定しなければなりません。fishを端末にしている場合を以下に示します

set GPG_TTY (tty)

passを使うに当たっては、gpg-id というものが必要になります。これはgpgコマンドで確認します

gpg --list-keys

確認後、passのデータベースを初期化します

pass init XXXXXXXXX

あとは Github でパーソナルトークンを発行し、適当なリポジトリをgit cloneします
デバイス認証とトークンどっち使うか聞かれるので、トークンを選択すれば、期限まで有効となります

Github の GPG 鍵の設定

さて、いよいよ本題ですが、GPG 鍵の発行方法です
これはgpgコマンドが使えれば、大体終わりです。Windows でも Linux でもどちらも同じです
Windowsの場合、GPG4Winというツールにより、Kleopatraというアプリで管理できます

次のコマンドで、RSA や 4096 ビットを選択した GPG キーを作成し、Github に公開鍵を貼り付ければ OK です。 メールアドレスなどは.gitconfigと合わせておきます。 つまり、一般的にはxxxxx+username@users.noreply.github.comがアドレスになります

gpg --full-gen-key
gpg --list-keys
gpg -a --export XXXXXXX

そして、.gitconfigも色々登録しておきます

git config --global gpg.program gpg # Windowsの場合フルパス
git config --global user.signingkey XXXXXX
git config --global commit.gpgsign true
git config --global tag.gpgsign true

ここまで来れば、大体 OK といった形です

GPG 鍵を複数デバイスで共有する

鍵を複数デバイスで共有し、コミットできるようにしたい場合があります
または、端末を引っ越しするようなケースです
その場合、以下のようにします

# 端末1
gpg -a --export-secret-key <gpg-id> > private.key

# 端末2
gpg --import private.key
gpg --edit-key <gpg-id>
gpg> trust # 5を選択