GPGで自分用の秘密鍵を1つに統一する

gpgはUIがややこしくて混乱するので使い方についてメモる

GPGとは

  1. 電子署名
  2. 公開鍵認証

を行うためのソフトウェア。秘密鍵を2つ作る。

  1. 署名のためのmaster key
  2. 署名に加えて暗号化を行うためのsub key

2つ作るのは単に利便性のため。master keyはインターネット上のあなたそのものなのでこれを流出させると死ぬ(正確には新しい人物としてやり直しになる)。よって、厳重に保管しておき、普段の運用にはsub keyを用いる。

master keyを使用するのは以下の場合

gpg, gpg2の2種類がある。どちらを使っても大差ないが、後者の方が

  1. 暗号化に外部ライブラリを用いている。(必要な機能だけコンパイルできるので、組み込みなどで便利)
  2. master keyを別に管理するのが楽(後述)

というメリットがある。

鍵登録までの手順

インストール

sudo apt install gnupg gnupg-agent gpgsm

master keyの作成。

オフライン環境で、一度もネットワークに繋いだことのないOSで実行する。具体的には好きなLinuxのディストリビューションのboot imageを作成してそこで行う。くれぐれもソースの読めないOSで行わないこと。

QUBES OSがsandboxとして使いやすいかも

gpgをローカルでインストールし(デフォルトで入っていることが多い)た後,gpg --gen-keyコマンドを実行する。

設定はすべてデフォルトでOK。RSAの鍵長を伸ばしてもセキュリティ強度はそこまで大きく変化しないという噂もあるが(参考: yubicoによる解説)、念の為RSA2048でなく、RSA4096で行う。ユーザー名と連絡先の記入の 後、エントロピーの取得のため、しばらくガチャガチャした後saveする。(結構長時間ガチャガチャする必要がある。だるい)

gpg --list-keys <ユーザー名> でIDを取得できるので、これを後の処理で使用する。

ここでは説明のためにMASTERIDというIDを用いる

顔写真の登録

こちらを参考に適切なサイズと解像度のJPEGを作成する。

gpg --edit-key MASTERID

でシェルが開くので、addphotoで登録する。

master keyの失効証明書を作成

gpg --output \<MASTERID\>.gpg-revocation-certificate --gen-revoke

発行の理由を説明して、master keyとは別に管理しておく。

sub keyの作成

gpg --edit-key MASTERID

から、addkeyを実行。あとはmaster keyの時と同様だが、有効期限をつけるとベター

署名と暗号化に同一の鍵を使うと、暗号化アルゴリズム依存の脆弱性が生じる場合があるので、暗号化、署名、認証のそれぞれに専用のsubkeyを作ると良い。

master keyを保存

必要なだけsub keyを作成したら、~/.gnupgをセキュアなストレージにコピーする

ストレージは使いやすいフラッシュドライブと並行して可能な限り長持ちする媒体が良い。CDに焼くかoptarでQRコードに変換してから紙に印刷する。

master keyをローカルから削除

gpgのバージョンによって必要な操作が違うのでgpg --versionで確認する。

GPG 2.1以降の場合

を削除する。ただし、<KEYGRIP>の確認はgpg2 --with-keygrip --listkey MASTERIDで行う。

GPG 2.1より古い場合

鍵を一つずつ削除することができないため、以下の手順を踏む必要がある。

  1. master keyのsub keyをすべてエクスポート。 gpg --output secret-subkeys --export-secret-subkeys MASTERID
  2. master keyを削除 gpg --delete-secret-keys MASTERID
  3. subkeyを戻す。 gpg --import secret-subkeys
  4. subkeyのバックアップを削除 rm recret-subkeys

gpg -Kですべての秘密鍵の情報を見ると、master keyのsecsec#(使用不可)になっていることがわかる。

パスワードの変更

gpg --edit-key MASTERID passwdでsub keyのpasswordを変更できる。バックアップした master keyはそのままなので安全。

公開鍵のアップロード

synchronizing key server(SKS)と呼ばれるところに公開する。 sks keyserver poolはヘルスチェックが継続的にされているのでここにアップロードするのが吉、1日毎にすべてサーバで同期が取られるので、アップロード場所に神経質になる必要はない。IPを隠したい場合は一応Torも使えるっぽい

使用するサーバを決めたらアドレスを~/.gnupg/gpg.confに書き込んでおく。

日本のサーバはないので、どこに設定しても大差なさそう。とりあえずMITのサーバ(pgp.mit.edu)にセットしておく。

riseupによるベストプラクティスによればhkpsと呼ばれる専用のプロトコル(デフォルトポートは11371)を用いるとよりセキュアらしいので、以下でインストール。

sudo apt install gnupg-curl # hkpsによる鍵のやり取りを可能にする。

keyのメタデータ(e.g. 誰を信頼しているか?)を隠した状態でやり取りするためのプロトコルらしい。

master keyを使用

master keyを保持しているUSBをマウントしてGNUPGHOMEをその中のパスに設定してexportする。

sub keyの再発行。

  1. master keyを使える状態にしたうえでgpg --edit-key MASTERID
  2. シェルからlistでIDの確認。
  3. revkeyで失効証明書を作成。

key serverに送信する。

master keyを失効させる。

  1. gpg --import \<MASTERID\>.gpg-revocation-certificate … 手元のmaster keyを失効
  2. gpg --send-keys MASTERID … 執行した鍵をサーバに登録

sub keyの使用

署名用のsub keyはいくつ持っても良いが、解号用のsubkeyは最新のものしか使えないため、すべてのマシンで同じものを用いなくてはならない。紛失時の対応も楽なので、同時に使う秘密鍵はひとつにしておいたほうが良い。

コマンド一覧

ssh鍵としての使用

  1. gpg-agentがSSH-agentとしても機能するようにする。
  2. gpg秘密鍵をSSH鍵ペアとして使用する。

の2種類を分けて考える必要がある。ここでは後者について述べる

gpg-agentがSSH-agentとしても機能するようにする。

~/.gnupg/gpg-agent.confに必要な設定を書き込むことができる。コマンドラインから指定可能なオプションはすべて指定できるので、enable-ssh-supportとお好みのオプションを書き込んで再起動する。

##gpg秘密鍵をSSH鍵ペアとして使用する。

monkeyshpere projectの一部としてopenpgpをsshとして使用するためのソフトウェアpgp2sshを開発している。

Note: このMonkeysphereの、root CAを廃止してweb of trustを実現するという目標はそれ自体大変興味深いので、デジタル左翼の皆さんは一読の価値ありです。 なぜroot CAおよびHTTPSプロトコルそのものが邪悪なのかに関しては同団体の人物が書いたTechnical Architecture shapes Social Structureという文書が参考になります。

sshdが解釈可能な形式に鍵を変換(ここでは0A72B72というsub key鍵IDを用いる。)


gpg2 --export-secret-subkeys \
  --export-options export-reset-subkey-passwd 0A072B72! | \ # ! をつけないと、全兄弟keyをエクスポートしてしまう
  openpgp2ssh 0A072B72 > gpg-auth-keyfile

gpgkey2ssh <鍵ID>でも可

あとは普通のssh秘密鍵のように扱う。

参考

Tweet This Page
BTC address: 16BQGsTmsKtbMMT2Zwj4qNZnnAncnVCtWo
LTC address: LZuEiJecMZFN48k6jRhoRQZvH8VS1MBuGc