目次
実現したかったこと
- 各コミットにGPGキーを使った(検証済みの)署名を付けたかった
- 理想は
git commit -S -m "commit message"
で、"Verified"がつくコミットを作成できる状態
最初に行ったこと
- Githubドキュメント GitHub アカウントに GPG キーを追加する の手順に沿ってGPGキーを新しく作成、Github設定ページに登録した
- .gitconfigにも
user.signingkey=[KeyID]
、commit.gpgsign=true
を設定した
起こった問題
- Github設定ページで公開鍵登録時、検証されていない旨のエラーによりサブキーが登録できない
- メインキーを使って署名付きコミットを実行しようとすると、
error: gpg failed to sign the data
が発生してコミットできない
原因と思われるもの
- Github設定ページで公開鍵登録時、検証されていない旨のエラーによりサブキーが登録できない
→クロス認証が必要 - メインキーを使って署名付きコミットを実行しようとすると、
error: gpg failed to sign the data
が発生してコミットできない
→鍵検証に加えて鍵のUsage設定が一部不足?
最終的に実施した手順
- 既存のGPG鍵有無を確認する
gpg --list-secret-keys --keyid-format=long
- (GPG鍵を生成していなかったとして)新しくGPG鍵作成
gpg --full-generate-key # Use default in any question, and use new passphrase
- ここで各選択肢をデフォルトのまま進めていくと設定不足で以下問題が発生する
- 問題①:デフォルトのままだとサブキーの属性に"S"が付与されない
- 問題②:作成した状態のままだとサブキーが検証されてない?
- ここで各選択肢をデフォルトのまま進めていくと設定不足で以下問題が発生する
- GPG鍵を再確認
gpg --list-secret-keys --keyid-format=long
- 鍵の用途を修正
- ここでサブキーの属性に"S"を付与し、問題の原因①が解決
gpg --edit-key [Github user name] ※gpg> key 1 ※gpg> change-usage ※Your selection? s ※Your selection? q ※gpg> save
- GPG鍵にCross-Cretificationを設定する
- たぶん前ステップと一緒にできる
- ここでサブキーの検証が行われ、問題の原因②が解決
gpg --edit-key [Github user name] ※gpg> key 1 ※gpg> cross-certify ※gpg> save
- メイン側のキーIDをコピー
$ gpg --list-secret-keys --keyid-format=long ... ------------------------------------ sec XXXXX/[Main key ID (ここをコピー)] [Created date] [expires: YYYY-MM-DD] uid [Github user name] <email address> ssb XXXXX/[Sub key ID(Do not need to copy)] [Created date]
- コミットのたびに-Sオプション付けるのは面倒なので、.gitconfigに署名設定追加
git config --global user.signingkey [前ステップでコピーしたキーID] git config --global commit.gpgsign true
- 公開鍵を出力してコピー
gpg --armor --export [前々ステップでコピーしたキーID] Prints the GPG key ID, in ASCII armor format # 公開鍵が出てくるので、コピー
- Githubのユーザ設定ページに入って、GPG鍵を登録
- 自環境の場合、
~/.bashrc
の最後に以下追記が必要だったexport GPG_TTY=$(tty)
-
~/.bashrc
をリロードsource ~/.bashrc