Smile Engineering Blog

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

GPG キーのエクスポート/インポート

はじめに

過去の投稿「GitHub の Verified マーク」の中で GPG を使用しました。マシンの買い替えにあたり、手っ取り早く GPG キーを移行することにしたので備忘のためこの手順を残しておきます。

移行は、

  1. 古いマシンで GPG キー、GPG 署名キーのエクスポート
  2. 新しいマシンで GPG キー、GPG 署名キーのインポート
  3. 新しいマシンで GPG キーの所有者信頼を設定する

の手順で進めます。

キーのエクスポート

GPG キー、GPG 署名キーをエクスポートするには以下のコマンドを使用します。

gpg --export {GPG キー ID} > pub.key                # GPG キーのエクスポート
gpg --export-secret-keys {GPG キー ID} > sec.key    # GPG 署名キーのエクスポート

GPG キー ID は --keyid-format LONG で表示することができます。

bob@old-machine ~ % gpg --list-secret-keys --keyid-format LONG
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/bob/.gnupg/pubring.kbx
-----------------------------
sec   rsa4096/C611EFD63CD09CA7 2020-08-11 [SC]
      314EC2737F246F907368BA38C611EFD63CD09CA7
uid                 [ultimate] Bob Marley <bob@example.com>
ssb   rsa4096/D3375CB42A265387 2020-08-11 [E]

上記の場合 GPG キー ID は C611EFD63CD09CA7 なので、

gpg --export C611EFD63CD09CA7 > pub.key
gpg --export-secret-keys C611EFD63CD09CA7 > sec.key

とします。GPG 署名キーのエクスポートではパスフレーズを求められるので思い出して入力しましょう。

エクスポートした pub.keysec.key を安全な方法で新しいマシンに配置します。後者は秘密鍵ですので取り扱いには注意です。

キーのインポート

GPG キー、GPG 署名キーをインポートするには以下のコマンドを使用します。

gpg --import {エクスポートした GPG キーのファイル}
gpg --import {エクスポートした GPG 署名キーのファイル}

GPG 署名キーの方はエクスポートと同様にパスフレーズを求められます。

bob@new-machine ~ % gpg --import pub.key
gpg: key C611EFD63CD09CA7: public key "Bob Marley <bob@example.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
bob@new-machine ~ % gpg --import sec.key   
gpg: key C611EFD63CD09CA7: "Bob Marley <bob@example.com>" not changed
gpg: key C611EFD63CD09CA7: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

確認してみましょう。

bob@new-machine ~ % gpg --list-keys
/home/bob/.gnupg/pubring.kbx
-----------------------------
pub   rsa4096 2020-08-11 [SC]
      314EC2737F246F907368BA38C611EFD63CD09CA7
uid           [ unknown] Bob Marley <bob@example.com>
sub   rsa4096 2020-08-11 [E]
bob@new-machine ~ % gpg --list-secret-keys
/home/bob/.gnupg/pubring.kbx
-----------------------------
sec   rsa4096 2020-08-11 [SC]
      314EC2737F246F907368BA38C611EFD63CD09CA7
uid           [ unknown] Bob Marley <bob@example.com>
ssb   rsa4096 2020-08-11 [E]

インポートされていますね。ですが、状態が unknown です。このままでは不完全です。

所有者信頼を設定

GPG キーはキーの所有者に対する信頼の値を持ちます。unknown は未設定状態です。キーの所有者本人なのでこれを ultimate(キーを完全に信頼する)に変更します。所有者信頼の値を変更するには以下のコマンドを使用します。

gpg --edit-key {GPG キー ID} trust quit

コマンド投入後、対話に応える形で設定します。

bob@new-machine ~ % gpg --edit-key C611EFD63CD09CA7 trust quit
gpg (GnuPG) 2.2.20; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/C611EFD63CD09CA7
     created: 2020-08-11  expires: never       usage: SC  
     trust: unknown       validity: unknown
ssb  rsa4096/D3375CB42A265387
     created: 2020-08-11  expires: never       usage: E   
[ unknown] (1). Bob Marley <bob@example.com>

sec  rsa4096/C611EFD63CD09CA7
     created: 2020-08-11  expires: never       usage: SC  
     trust: unknown       validity: unknown
ssb  rsa4096/D3375CB42A265387
     created: 2020-08-11  expires: never       usage: E   
[ unknown] (1). Bob Marley <bob@example.com>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5                                                # 信頼の値を選択(I trust ultimately)
Do you really want to set this key to ultimate trust? (y/N) y   # yes!

sec  rsa4096/C611EFD63CD09CA7
     created: 2020-08-11  expires: never       usage: SC  
     trust: ultimate      validity: unknown
ssb  rsa4096/D3375CB42A265387
     created: 2020-08-11  expires: never       usage: E   
[ unknown] (1). Bob Marley <bob@example.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

確認してみます。

bob@new-machine ~ % gpg --list-keys
/home/bob/.gnupg/pubring.kbx
-----------------------------
pub   rsa4096 2020-08-11 [SC]
      314EC2737F246F907368BA38C611EFD63CD09CA7
uid           [ultimate] Bob Marley <bob@example.com>
sub   rsa4096 2020-08-11 [E]

bob@new-machine ~ % gpg --list-secret-keys
/home/bob/.gnupg/pubring.kbx
-----------------------------
sec   rsa4096 2020-08-11 [SC]
      314EC2737F246F907368BA38C611EFD63CD09CA7
uid           [ultimate] Bob Marley <bob@example.com>
ssb   rsa4096 2020-08-11 [E]

ultimate に変わっていますね!git タグの署名を検証し、成功すれば移行完了です(検証方法は 以前の回 を参照)。

パスフレーズの変更

GPG 署名キーのパスフレーズを変更したい場合は以下のコマンドを使用します。

gpg --edit-key {GPG キー ID} passwd quit

上記コマンドを叩くと既存のパスフレーズを求められたのち、新しいパスフレーズを設定することができます。

参考