GPG主鍵の更新

背景

これまでGPGで使っている主鍵がRSA4096であったが、そろそろECCに移行したいということから、今回GPG主鍵を更新するに至った。

手順

古い鍵のIDを控える

秘密鍵の一覧から、更新する鍵のIDを控える。

$ gpg -K

出力結果から、古い鍵のIDをコピーして、変数に代入しておく。

$ export OLDKEYID=...

新しい主鍵の作成

$ gpg --expert --full-gen-key

あとはプロンプトに従って主鍵を作成するだけ。この辺は多くの記事で語られていることなのでそれほど難しいことではないと思う。要点としては次のような点がある。

  • 鍵の種類の選択で「ECC(署名のみ)」を選択
  • 楕円曲線暗号の選択で「Curve 25519」を選択
  • 鍵の有効期限の指定で「0」(無期限)を指定

あとはユーザIDを入力すれば完了。

生成した鍵のIDを確認する。

$ gpg -K

出力されたIDを変数に代入しておく。

$ export KEYID=...

副鍵の作成

次に副鍵を作成する。

$ gpg --expert --edit-key $KEYID

プロンプトに従い、副鍵を作成する。とりあえずは「ECC(署名のみ)」と「ECC(暗号化のみ)」の二つを作成しておけば良いだろう。楕円曲線暗号の選択は「Curve 25519」を選択。鍵の有効期限も適当に設定する。

最後に save するのを忘れずに。

新旧の鍵に署名する

新旧の鍵に対してお互いに署名を行う。

$ gpg --default-key $OLDKEYID --sign-key $KEYID
$ gpg --default-key $KEYID --sign-key $OLDKEYID

署名されていることを確認する。

$ gpg --list-sigs $KEYID

旧鍵の失効

失効処理を行う(私は今回は行わなかった)。

新鍵をKeybaseで公開する

keybase pgp select --multi を実行する。その結果、次のようなエラーが出た。

ERROR key generation error: Unknown signature subpacket: 34 (error 905)

このIssue に同じ内容のエラーが報告されている。これを見る感じだと、鍵の機能が問題のようだ(詳しくは追っていない、必要がないため)。

Issueにある通りにコマンドを実行してみる。

gpg> showpref

showpref の結果を見て、AEADの機能を除いたものをsetする。

gpg> setpref AES256 AES192 AES 3DES SHA512 SHA384 SHA256 SHA224 SHA1 ZLIB BZIP2 ZIP Uncompressed mdc no-ks-modify

主となるuidをセットしていないと怒られる場合があるので、その場合は uid 1primary の順で実行して主となるuidをセットしておく。

もう一度 keybase pgp select --multi を実行して、終了した。

鍵を保存する

鍵のバックアップを取る。まずは鍵のIDを控える。

$ gpg -K --keyid-format short

鍵のIDを控える。

公開鍵と共通鍵暗号で暗号化した秘密鍵を保存する。まずは主鍵。

$ gpg --export --armor $KEYID > $KEYID.pub
$ gpg --export-secret-keys --armor $KEYID | gpg --cipher-algo AES256 -c --armor > $KEYID.sec

次に全ての副鍵。

$ gpg --export --armor $KEYID > $KEYID.pub
$ gpg --export-secret-subkeys --armor $KEYID | gpg --cipher-algo AES256 -c --armor > $KEYID.sec

あとは保存した鍵を適切に管理する。

参考文献