GPG鍵の作成, 保存, 失効

Created , Modified .

* この記事はZennに寄稿した記事を自ら再構成したものである.

成果物

この記事の内容を実施することによる成果物は次の通り. 特に3種のGPG鍵のうち, 副鍵を紛失しても主鍵の信用を壊さない.

List 1. 成果物

  • GPG鍵3種, 主鍵(PM-key), 暗号化/復号用副鍵(E-key), 署名/検証用副鍵(SA-key)
  • 主鍵の失効証明書(PM-key-revoke)
  • 公開鍵のエクスポートファイル(pub-keys)
  • 全秘密鍵のエクスポートファイル(full-secret-keys)
  • E-key, SA-keyの秘密鍵のエクスポートファイル(sub-secret-keys)

前提

語句定義

Web of Trust

信頼の輪 ぶっちゃけただの運用方法や管理方法の類.

公開鍵, 秘密鍵

1つの鍵ペアのうち, 公に出回るのが公開鍵, 自分で隠し持つのが秘密鍵.

PGP, GPG

PGP = Pretty Good Privacy, でその実装の一つが GPG = Gnu PG.

主鍵, 副鍵

GPGでは1つの主鍵に複数の副鍵をつけることができる. それぞれに公開鍵と秘密鍵を持つ. また, 暗号化/復号(encrypt), 署名(sign), 検証(auth), 認証(cert)をそれぞれの鍵に別々に設定できる.

PM-key

この記事では主鍵を指す. 認証(C)機能のみを有するものとする.

E-key

この記事では副鍵を指す. 暗号化/復号(E)機能のみを有する.

SA-key

この記事では副鍵を指す. 署名(S)機能, 検証(A)機能のみを有する.

マシン

利用しているLinux環境のPCのこと. この記事ではGPGの保存状態と考えても良い.

pub-keys

公開鍵のエクスポートファイル. 広まって大丈夫.

full-secret-keys

PM-key, E-key, SA-keyの秘密鍵のエクスポートファイル. 隠し持つもの.

sub-secret-keys

E-key, SA-keyの秘密鍵のエクスポートファイル. 隠し持つもの.

PM-key-revoke

PM-keyの失効証明書. 隠し持つけど, サーバーに上げないなら無用.

ziped-file

隠し持つ保管用ファイル. セキュリティ高め, 長期保存性, 利便性を満たしたい[*1].

環境

OS :: Ubuntu 16.04LTS 私のマシンではgpg2の方がより新しいためこちらを利用する.

        $ sudo apt update && sudo apt install gnupg
        $ gpg --version
        $ gpg2 --version
      

作成

作成する鍵の暗号アルゴリズムや期限などは好みで選べば良い. ただ, 互換性的にはRSAになってしまうだろう. 作れる最長のbit数を指定してやれば充分な耐久性を持つはずだ. ここではPM-keyはECC25519で作ることにした. 通常利用しない(ハズ)だから, まぁ互換性欠けてても大丈夫だろう.

        $ gpg2 --expert --full-gen-key
        // ECC25519(Ed25519相当), 無期限, C機能のみ
        // これがPM-key(主鍵).
        // 以後のkeyidにはuser-name, email, 鍵IDが利用可能.
        
        $ gpg2 --edit-key <keyid>
        gpg> addkey
        // RSA4096, 5year, E機能のみとSA機能のみの2種を作成.
      

保存と秘密鍵の削除

保存目的以外も割といろんなものを作っている. また, PM-keyの秘密鍵を削除する. [*1] [*2]

        $ gpg2 -a --export <keyid> > pub-keys
        $ gpg2 -a --export-secret-keys [keyid] > full-secret-keys
        $ gpg2 -a --export-secret-subkeys [keyid] > sub-secret-keys
        $ gpg2 -a --gen-revoke <keyid> > PM-key-revoke
        $ gpg2 --delete-secret-key <keyid>
        $ gpg2 --import sub-secret-keys
        
        $ zip <ziped-file> full-secret-keys sub-secret-keys PM-key-revoke
      

PM-key秘密鍵削除の原理

単純に言って, 一旦全部の秘密鍵の情報を消してから, E-keyとSA-keyの秘密鍵情報を戻しているだけである. PM-keyの秘密鍵情報が必要になれば, full-secret-keysをimportすればよい.

利用環境の移転

移転先のマシンで以下を実行.

        $ gpg2 --import pub-keys
        $ gpg2 --import sub-secret-keys
      

鍵の期限の更新

次のコードの<num>には失効させるE-keyまたはSA-keyの鍵IDを指定する.

        $ gpg2 --edit-key <keyid>
        gpg> key <num>
        gpg> expire
        gpg> key // 続けて操作する場合, 一旦, 鍵選択をリセットする.
      

失効

PM-keyの失効は失効証明書をimportすることで行う.

        $ unzip <ziped-file>
        $ gpg2 --import PM-key-revoke
      

E-key, SA-keyの失効はPM-keyの秘密鍵を戻した状態で行う. 次のコードの<num>には失効させるE-keyまたはSA-keyの鍵IDを指定する.

        $ gpg2 --edit-key <keyid>
        gpg> key <num>
        gpg> revkey
      

参考


*1 :: ziped-fileをどこか安全な形態に保管. 暗所, 気温, 湿度を保った光学ディスクかなぁ.

*2 :: USBメモリ, SDカードなどの磁気, 電荷方式はメンテフリーを考えると選択できない. 裏を返せば, メンテナンス, 耐障害環境を整えられるなら磁気系はあり.