GPG鍵の作成, 保存, 失効
Created , Modified .
* この記事はZennに寄稿した記事を自ら再構成したものである.
成果物
この記事の内容を実施することによる成果物は次の通り. 特に3種のGPG鍵のうち, 副鍵を紛失しても主鍵の信用を壊さない.
前提
語句定義
- 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カードなどの磁気, 電荷方式はメンテフリーを考えると選択できない. 裏を返せば, メンテナンス, 耐障害環境を整えられるなら磁気系はあり.