C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

あるマシンの GPG 鍵ペアを別のあるマシンでも使いたい場合にすること、手順のメモ。Git, GitHub, VSCode 関連のおまけ付き

さいきんは多くの作業は WSL / Ubuntu でしているのだけど、 WSL の親になってる Windows でも VSCodeVisual Studio で作業する機会が増えてきました。git のコミットだけ WSL で /mnt/c/... へ辿ってやったりすればいいのだけど、事実上同じ(だけど論理的には別になってる)マシンなので同じ GPG 鍵ペアーを使えるようにしようかなって思ったので、その手順のメモ。

環境

メモの例に somebody@example.com を ID にします。あるWSL環境をマシンA、そのWSL環境をホストしている親のWindows環境をマシンBのように模した例。

# マシンA 側の WSL / Ubuntu の Git のバージョン
git version 2.17.1
# マシンB 側の Git for Windows のバージョン
git version 2.21.0.windows.1
# マシンAのWSL環境およびそのホストのマシンBのWindowのバージョン
Microsoft Windows [Version 10.0.7763.437]

1. マシンAでGPG鍵ペアーを作る

WSL ならその中の任意のシェル、環境で。

# つくる
gpg --gen-key
# 作った鍵の確認
gpg --list-keys

あとは Git や GitHub 用のおまけ。

# Git で GPG 署名を標準で有効に設定
git config --global commit.gpgsign true
# 未設定だったり必要なら email とか signingkey の設定とか
git config --global user.email somebody@example.com
## 実際は X じゃなくて作成時のログや gpg --list-keys で公開鍵を確認して設定
git config --global user.signingkey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# GitHub に登録したりする用の公開鍵のテキストのエクスポート
gpg --armor --export somebody@example.com

2. マシンAでGPG鍵ペアーをエクスポート

# 公開鍵をカレントディレクトリーの public.key ファイルへ
gpg -o public.key --export somebody@example.com
# 秘密鍵をカレントディレクトリーの secret.key ファイルへ
gpg -o secret.key --export-secret-keys somebody@example.com

3. マシンBでGPG鍵ペアーをインポート

WSLをホストしている親のWindows環境での Git での使用なら Git for Windows を入れて Git Bash から。

# カレントディレクトリーの public.key から公開鍵をインポート
gpg --import public.key
# カレントディレクトリーの secret.key から秘密鍵をインポート
gpg --import --allow-secret-key-import secret.key
# インポートした公開鍵は信用(trust)値が不明(unknown)になっているので自分で作った場合の ultimate 信用にしておく
# gpg の対話モードで sign コマンドから 5 = I trust ultimately する
gpg --edit-key somebody@example.com
gpg> sign

このあと、マシンA同様に Git で使用可能に git config を必要に応じて叩いておく。

おまけ、適当に Git の repos を作って動作確認。

mkdir hoge
cd hoge
echo hoge > hoge.txt
git init
# Git の設定が足りてなかったり GPG 鍵ペアーをちゃんとインポートできてないと失敗するかもしれない
git commit -m hoge
# 期待動作できていれば GPG 署名に関するメッセージが追加されてコミット・ログが出力される
git log --show-signature

おまけ、 cmd で叩かれる git がどこの git か確認したいとき:

# Linux 一般で `which git` に相当する Windows の cmd での操作
where git

おまけ、ここまでやった上で VSCode の Git 統合機能でも GPG 署名を有効化する設定(Preferences):

"git.enableCommitSigning": true

f:id:USAGI-WRP:20190414123757p:plain

設定したら動作試験用の repos に VSCode からもコミットして、署名が付いているか確認する。確認は VSCode では素ではできないので、拡張なり、 Git Bash なり、何かしらでログを見て行う。

期待動作していれば Git Bash ではこんなログを見られる(このスクリーンショットは somebody@example.com じゃなくて実際にわたしの公開鍵がついている例だけど):

f:id:USAGI-WRP:20190414125325p:plain

参考

  1. GnuPGのコマンド