GnuPG key signの作業をする(signing-party/caff)

Pocket

先日JNUGの総会へ行ってきて、OpenPGPの鍵の本人確認をしてきました。その後にやるべき作業を、忘備録として記しておきます。

key signの作業を楽にするためのツールはいろいろありますが、今回はsigning-partyパッケージに含まれるcaffを使います。

Package: signing-party
Version: 1.1.4-1
Maintainer: Thijs Kinkhorst <thijs@debian.org>
Description-ja: 各種 OpenPGP 関連ツール
 signing-party はあらゆる種類の PGP/GnuPG 関連ツール集で、キーサイン、
 キーリングの分析、キーサインパーティの準備用ツールを含んでいます。
 .
  * caff: "CA - Fire and Forget" 鍵にサインしてメールを送信します
  * pgp-clean: 自己署名以外の全署名を鍵から削除します
  * pgp-fixkey: 鍵から破損したパケットを除去します
  * gpg-mailkeys: サイン済みの鍵をその所有者へ単純にメール送信します
  * gpg-key2ps: 指紋を短冊にした PostScript ファイルを生成します
  * gpgdir: 再帰的にディレクトリを暗号化するツールです
  * gpglist: あなたの UID にサインした人を表示します
  * gpgsigs: GnuPG 鍵の一覧に対してサイン済みの鍵に注釈を付けます
  * gpgparticipants: パーティ参加者の一覧を主催者向けに作成します
  * gpgwrap: パスフレーズ用ラッパーです
  * keyanalyze: キーリングの minimum signing distance (MSD) を分析します
  * keylookup: gpg --search の ncurses ラッパーです
  * sig2dot: GnuPG 署名の一覧を .dot ファイルに変換します
  * springgraph: .dot ファイルからグラフを作成します
Homepage: http://pgp-tools.alioth.debian.org/
</thijs@debian.org>

pkgsrcにはcaff単独でsecurity/caffがあるので、そちらを使いましょう(実際にはsigning-partyのtar ballを取得します)。

まず、ID確認の完了したユーザーの公開鍵を入手します。公開キーサーバーに登録されていることもありますし、人によっては公開していない場合もあります。後者の場合はメールなどで直接受け取ってください。キーサーバーから取得する方法は以下のようになります。

$ gpg --keyserver pgp.nic.ad.jp --recv-keys "keyid"
gpg: 鍵xxxxxxxxをhkpからサーバーpgp.nic.ad.jpに要求
gpg: 鍵xxxxxxxx: 公開鍵“User Name <user@example.com>"を読み込みました
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、classic信用モデル
gpg: 深さ: 0  有効性:   3  署名: 127  信用: 0-, 0q, 0n, 0m, 0f, 3u
gpg: 深さ: 1  有効性: 127  署名:  33  信用: 126-, 0q, 0n, 0m, 1f, 0u
gpg: 次回の信用データベース検査は、2016-07-04です
gpg:     処理数の合計: 1
gpg:           読込み: 1  (RSA: 1)

今回はpgp.nic.ad.jpを使いましたが、他のキーサーバー(pgp.mit.edu)等にあることもあります。

公開鍵を入手したら、手元にあるはずの指紋(fingerprint)と、取得した公開鍵の指紋が一致するか確認しましょう。

$ gpg --fingerprint 9C0C1404
pub   4096R/9C0C1404 2009-09-11
                 指紋 = 9945 2B4D D28B EEAC 8AB5  C931 B066 62EC 9C0C 1404
uid                  NOKUBI Takatsugu <knok@daionet.gr.jp>
uid                  NOKUBI Takatsugu <knok@debian.org>
uid                  NOKUBI Takatsugu <knok@namazu.org>
uid                  NOKUBI Takatsugu <knok@fsij.org>
sub   4096R/07098680 2009-09-11
sub   2048R/861243E1 2012-08-23

これを、ID確認したユーザーの数だけ実施します。確認ができたら、ようやくcaffの出番です。

$HOME/.caffrc を作成します。caff –help等を実行すれば、現在の環境を見てとりえあずデフォルトの値を埋めたものが自動生成されます。作成されたものを自分の環境に合わせて修正してください。以下は私の設定例です。

# .caffrc -- vim:ft=perl:
# This file is in perl(1) format - see caff(1) for details.

$ENV{'MAILADDRESS'} = 'knok@daionet.gr.jp';
$CONFIG{'owner'} = 'NOKUBI Takatsugu';
$CONFIG{'email'} = 'knok@daionet.gr.jp';
#$CONFIG{'reply-to'} = 'foo@bla.org';
$CONFIG{'bcc'} = 'nokubi+caff@example.com';

# You can get your long keyid from
#   gpg --with-colons --list-key <yourkeyid|name|emailaddress..>
#
# If you have a v4 key, it will simply be the last 16 digits of
# your fingerprint.
#
# Example:
#   $CONFIG{'keyid'} = [ qw{FEDCBA9876543210} ];
#  or, if you have more than one key:
#   $CONFIG{'keyid'} = [ qw{0123456789ABCDEF 89ABCDEF76543210} ];
$CONFIG{'keyid'} = [ qw{B06662EC9C0C1404 ];
# Select this/these keys to sign with
#$CONFIG{'local-user'} = [ qw{2BA82602C2CE8099 ACCBC06B6A2171ED B06662EC9C0C1404} ];

# Additionally encrypt messages for these keyids
#$CONFIG{'also-encrypt-to'} = [ qw{2BA82602C2CE8099 ACCBC06B6A2171ED B06662EC9C0C1404} ];

# Mail template to use for the encrypted part
#$CONFIG{'mail-template'} = << 'EOM';
#Hi,
#
#please find attached the user id{(scalar @uids >= 2 ? 's' : '')}
#{foreach $uid (@uids) {
#    $OUT .= "\t".$uid."\n";
#};}of your key {$key} signed by me.
#
#If you have multiple user ids, I sent the signature for each user id
#separately to that user id's associated email address. You can import
#the signatures by running each through `gpg --import`.
#
#Note that I did not upload your key to any keyservers. If you want this
#new signature to be available to others, please upload it yourself.
#With GnuPG this can be done using
#       gpg --keyserver pool.sks-keyservers.net --send-key {$key}
#
#If you have any questions, don't hesitate to ask.
#
#Regards,
#{$owner}
#EOM
$CONFIG{'mailer-send'} =  [ 'smtp', Server => 'localhost', Port => 10025 ,
        Envelope => 'knok@daionet.gr.jp', Debug => 1 ];
</yourkeyid|name|emailaddress..>

自分はカスタマイズしたsmtp設定をしています。mailer-sendについてはcaff(1)に解説がありますが、PerlのMail::Mailerが受け付けるパラメータを記述します。man Mail::Mailerに詳細がありますが、smtpの代わりにtestfileを指定すれば、メールを送信する代わりにファイルに保存するので、活用して動作確認をするとよいでしょう。

準備ができたら、caffを起動します。私は以下のようなスクリプトを使っています。

#!/bin/sh
caff -m yes -u B06662EC9C0C1404 `cat $1`

B06662EC9C0C1404 は私のlong key idです。出力させるにはgpg –with-colons –fingerprint shortid 等とします。

caffを起動すると、作業ディレクトリを作成した上で指定した公開鍵に署名をしてゆきます。署名の作業にはパスフレーズが必要です。何度も入力することになるので、gpg-agentを使うことをお勧めします。

一通り署名が完了すると、実際のkeyringに結果をコピーした上で、公開鍵のメールアドレス(id)あてに1通づつメールを送信します。同じように、相手もこちらに署名した公開鍵を送ってくるのを待ちましょう

以上が相手の鍵に署名をしてメールで送信する方法です。その結果をキーサーバーに送ることもできますが、相手が常にキーサーバーに公開しているとは限らないので、その点注意しましょう(既知の公開鍵は誰でもキーサーバーに送信して公開できてしまう)。

逆に、相手から受け取った署名付き鍵の取り込みをする方法はまた別途記事として書く予定です。

2021-02-02 追記

誤字があったとの指摘があり訂正しました。

ところでこの記事を書いている現在は、OpenPGP short key idの衝突が容易となっており、公開キーサーバーに偽の(同じshort key idを持つ)鍵が大量に登録されていることがあります(サーバによる)。利用の際にはlong key idの確認をお勧めします。

By knok

I am a Debian Developer and a board member of Free Software Initiative (FSIJ).