🔐

GPG鍵の作成,保存,失効

2020/12/15に公開
1

語句定義

  • 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の保存状態と考えても良い.

価値および成果物

この記事の内容を実施することによる価値と成果物は次の通り.

  • 価値
    • ファイルやコンテンツ(メールやバイナリ)の暗号化.
    • 上記の一般利用における検証,署名.
    • 上記2つを別の鍵で行える.
    • 上記2つを行う鍵については,紛失してもPM-keyの信用を壊さない.
    • PM-keyの秘密鍵を通常利用時には利用しない.
  • 成果物
    • GPG鍵3種(PM-key, E-key, SA-key)
    • PM-keyの失効証明書(PM-key-revoke)
    • 公開鍵のエクスポートファイル(pub-keys)
    • 全秘密鍵のエクスポートファイル(full-secret-keys)
    • E-key,SA-keyの秘密鍵のエクスポートファイル(sub-secret-keys)

前提環境と準備

  • OS :: Ubuntu 16.04LTS
$ sudo apt update && sudo apt install gnupg
$ gpg --version
$ gpg2 --version

私のマシンではgpg2の方がより新しいので以後こちらを利用する.

作成

作成する鍵の暗号アルゴリズムや期限などは好みで選べば良い. ただ,互換性的には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種を作成.
// 以後この記事ではE機能のみをE-key,SA機能のみをSA-keyとする.

保存と秘密鍵の削除

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

  • 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 :: 隠し持つ保管用ファイル. セキュリティ高め,長期保存性,利便性を満たしたい.
$ 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
// ziped-fileをどこか安全な形態に保管. 暗所,気温,湿度を保った光学ディスクかなぁ.
// USBメモリ,SDカードなどの磁気,電荷方式はメンテフリーを考えると選択できない.
// メンテ,耐障害環境を整えられるなら磁気系はあり.

PM-key秘密鍵削除の原理

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

利用環境の移転

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

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

鍵の期限の更新

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

失効

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

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

E-key, SA-keyの失効はPM-keyの秘密鍵を戻した状態で行う.

$ gpg2 --edit-key <keyid>
gpg> key <num> // numには失効させるE-key, SA-keyの鍵IDを指定する.
gpg> revkey

参考

Discussion

td-shitd-shi

なお,この記事は自身が所持している複数のPCやPCに近いモノたちの間のデータ暗号化のためにまとめたものである. よって,実はサーバーに自身の鍵を登録して運用することを想定していない.