BIND GnuPGを使ったPGP署名の確認方法
BINDを提供するISCでは、OpenPGPを使って各ファイルのデジタル署名を行っている
デジタル署名によって、ファイルの改ざんの有無と、署名確認の時に使用した公開鍵で作成されたことを証明することができる
ここでは、OpenPGPを実装したGnuPGソフトウェアを使って、BINDのソースファイルの署名確認を行う流れを説明する
GnuPGの鍵の管理方法や暗号化等についての説明は行わない
用語の説明
PGP    ・・・・ Pretty Good Privacy  フィル・ジマーマンが開発、公開した暗号ソフトウェア
OpenPGP ・・・・ PGPをベースにRFC化された仕様のこと  またはその技術のこと
GnuPG  ・・・・ OpenPGPに従って開発されたフリーの暗号ソフトウェア
GnuPGを使った署名確認の流れ
署名によるファイルの改ざんの有無だけをチェックしたい場合は、以下の2と4は不要
ただし、5を実行したときに、「この鍵は信用できる署名で証明されていません!」と警告が出力される
1. CentOSにGnuPGパッケージをインストールする
2. 自分自身の鍵のペア(秘密鍵と公開鍵)を作成する
3. ISCのPGP公開鍵をダウンロードし、インポートする
4. 自分の鍵を使って、ISCのPGP公開鍵を署名する(=信頼する)
5. BINDのソースファイルと署名ファイルをダウンロードし、ISCのPGP公開鍵を使ってデータの改ざんがないことを確認する
1.GnuPGのインストール
CentOS5.4では、デフォルトでGnuPGのパッケージがインストールされている
[ 確認方法 ]
# yum list installed | grep gnupg
gnupg.i386 1.4.5-14 installed
インストールされていない場合は、yumコマンドでインストールを行う
[ 設定例 ]
# yum install gnupg
コマンド一覧
PGP署名でよく使われるコマンド
鍵の作成
gpg --gen-key 公開鍵と秘密鍵を作成する
公開鍵のインポート
gpg --import 公開鍵 ファイル形式で提供されている場合
gpg --search-keys 相手メールアドレス [ --keyserver 鍵サーバ ] 鍵サーバから検索してダウンロードする場合
鍵の確認
gpg --list-keys インポート済み公開鍵の表示
gpg --list-secret-key インポート済み秘密鍵の表示
gpg --list-sigs 署名された鍵の表示
署名ファイルの検証
gpg --verify 署名ファイル クリア署名(対象ファイル内に署名内容が含まれる)の検証
gpg --verify 分離署名ファイル 署名対象のファイル 分離署名(署名が別ファイルで保存)の検証  BINDはこちら
ローカル署名
gpg --lsign-key (署名対象公開鍵の)ユーザID 自分の秘密鍵を使って相手の公開鍵をローカル署名
インポート済鍵の削除
gpg --delete-secret-key 鍵ID インポート済み秘密鍵の削除(公開鍵よりも先に実施する)
gpg --delete-key 鍵ID インポート済み公開鍵の削除
gpg --delete-secret-and-public-key 鍵ID 秘密鍵と公開鍵の両方を同時に削除
2.自分自身のPGP鍵を作成する
署名確認だけしたいのであれば、自分の鍵は使わないので作成する必要がない
ここでは、4でISCの公開鍵を署名(=信頼)するために作成することにしている
[ 設定例 ]
# gpg --gen-key 自分自身の鍵を作成する
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
gpg: ディレクトリー「/root/.gnupg」ができました 鍵や設定ファイル等を保存するディレクトリとして、
gpg: 新しい構成ファイル「/root/.gnupg/gpg.conf」ができました $HOME/.gnupgが作られる
gpg: 警告: 「/root/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/root/.gnupg/secring.gpg」ができました
gpg: 鍵輪「/root/.gnupg/pubring.gpg」ができました
ご希望の鍵の種類を選択してください:
(1) DSAとElgamal (既定)
(2) DSA (署名のみ)
(5) RSA (署名のみ)
選択は? 1 この検証では特に決めることもないのでデフォルトの1にする
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) デフォルトの2048で良いのでenter
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で満了
<n>w = 鍵は n 週間で満了
<n>m = 鍵は n か月間で満了
<n>y = 鍵は n 年間で満了
鍵の有効期間は? (0)0 特に有効期限を設けないので0を選択
Key does not expire at all
これで正しいですか? (y/N) y
あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
本名: test1000 本名は5文字以上
電子メール・アドレス: test1000@example.co.jp メールアドレス入力
コメント: my gpg-key コメントはなくてもよい
次のユーザーIDを選択しました:
“test1000 (my gpg-key) <test1000@example.co.jp>”
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O 問題なければo(英文字のオー)
秘密鍵を保護するためにパスフレーズがいります。
パスフレーズを入力: xxxxxx パスワード設定
パスフレーズを再入力: xxxxxx
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++.+++++++++++++++++++++++++++++++++++++++++++++..
++++++++++..++++++++++>++++++++++..........>+++++.................................+++++
十分な長さの乱数が得られません。OSがもっと乱雑さを収集 何もしなくても数分たてば完了する
できるよう、何かしてください! (あと277バイトいります) もしキーボードをたたくのであれば無難な文字列にすること
gpg: /root/.gnupg/trustdb.gpg: 信用データベースができました 公開鍵と秘密鍵が作成された
gpg: 鍵7A286F08を絶対的に信用するよう記録しました 自分の鍵は絶対的に信用する
公開鍵と秘密鍵を作成し、署名しました。 自分の鍵を自分の鍵で署名(=信頼)する
gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
pub 1024D/7A286F08 2011-09-23
指紋 = B399 EF0B F095 59BB BE36 B250 99FC A88D 7A28 6F08
uid test1000 (my gpg-key) <test1000@example.co.jp>
sub 2048g/9903E9D4 2011-09-23
# gpg --list-keys インポート済み公開鍵の確認
/root/.gnupg/pubring.gpg
------------------------
pub 1024D/7A286F08 2011-09-23 今回作成した自分の公開鍵
uid test1000 (my gpg-key) <test1000@example.co.jp>
sub 2048g/9903E9D4 2011-09-23
# gpg --list-secret-keys インポート済み秘密鍵の確認
/root/.gnupg/secring.gpg
------------------------
sec 1024D/7A286F08 2011-09-23 今回作成した自分の秘密鍵
uid test1000 (my gpg-key) <test1000@example.co.jp>
ssb 2048g/9903E9D4 2011-09-23
# gpg --list-sigs 署名した鍵の確認
/root/.gnupg/pubring.gpg
------------------------
pub 1024D/7A286F08 2011-09-23 自分の鍵で自分の公開鍵を署名している
uid test1000 (my gpg-key) <test1000@example.co.jp>
sig 3 7A286F08 2011-09-23 test1000 (my gpg-key) <test1000@example.co.jp>
sub 2048g/9903E9D4 2011-09-23
sig 7A286F08 2011-09-23 test1000 (my gpg-key) <test1000@example.co.jp>
3.ISCのPGP公開鍵のインポート
署名確認をするためには、ファイルの署名で使われている公開鍵(ここではISCのPGP公開鍵)をインポートしなければならない
[ 設定例 ]
# cd /tmp 適当なディレクトリへ移動
# wget http://149.20.64.42/files/pgpkey2009.txt ISCのPGPの公開鍵のダウンロード
# ls 確認
pgpkey2009.txt
# gpg --import pgpkey2009.txt ISCの公開鍵をインポート
gpg: 鍵0B7BAE00: 公開鍵“Internet Systems Consortium, Inc. (Signing key, 2009)
<pgpkey2009@isc.org>”を読み込みました
gpg: 処理数の合計: 1
gpg: 読込み: 1 (RSA: 1)
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
# gpg --list-keys インポートした公開鍵の確認
/root/.gnupg/pubring.gpg
------------------------
pub 1024D/7A286F08 2011-09-23 自分の公開鍵
uid test1000 (my gpg-key) lt;test1000@example.co.jp>
sub 2048g/9903E9D4 2011-09-23
pub 2048R/0B7BAE00 2009-05-19 [満了: 2012-05-18] 今回インポートしたISCの公開鍵の情報
uid Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org> 2048bit RSA鍵 鍵ID:0B7BAE00
sub 2048R/321216F8 2009-05-19 [満了: 2012-05-18] 有効期限:2012/5/18
↑ http://www.isc.org/about/openpgp で公開されている
   鍵IDと一致しているかぐらいは確認する
[ 参考 ]
# gpg --search-keys pgpkey2009@isc.org 公開鍵を鍵サーバからダウンロードした場合
gpg: “pgpkey2009@isc.org”をhkpサーバーsubkeys.pgp.netから検索 電子メールで検索したが、このアドレスで間違いないか不安
(1) Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.
2048 bit RSA key 0B7BAE00, 作成: 2009-05-19
Keys 1-1 of 1 for "pgpkey2009@isc.org". 番号(s)、N)次、またはQ)中止を入力してください >1
gpg: 鍵0B7BAE00をhkpからサーバーsubkeys.pgp.netに要求
gpg: 鍵0B7BAE00: 公開鍵“Internet Systems Consortium, Inc. (Signing key, 2009)
<pgpkey2009@isc.org>”を読み込みました
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 処理数の合計: 1
gpg: 読込み: 1 (RSA: 1)
4.自分の鍵を使って、ISCのPGP公開鍵を署名する
インポートしたISCのPGP公開鍵を署名(=信頼)する
ただし、その署名の範囲が外部に影響しないようにローカルだけにする
なぜなら、本当にISCのPGP公開鍵だという証拠もないのに署名(=信頼)するからである
[ 設定例 ]
# gpg --lsign-key \ 公開鍵をローカル署名する
  "Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org>" " "内は、ローカル署名する対象のユーザID
ユーザIDの代わりに鍵IDの0B7BAE00を指定してもよい
pub 2048R/0B7BAE00 作成: 2009-05-19 満了: 2012-05-18 利用法: SC
信用: 未知の 有効性: 未知の
sub 2048R/321216F8 作成: 2009-05-19 満了: 2012-05-18 利用法: E
[ unknown] (1). Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org>
pub 2048R/0B7BAE00 作成: 2009-05-19 満了: 2012-05-18 利用法: SC
信用: 未知の 有効性: 未知の
主鍵の指紋: FA76 7A86 A371 E359 22F6 A5C8 D811 B53F 0B7B AE00
Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org>
この鍵は2012-05-18で満了します。
本当にこの鍵にあなたの鍵“test1000 (my gpg-key) <test1000@example.co.jp>”で署名してよいですか
(7A286F08)
署名は、書出し不可に設定されます。
本当に署名しますか? (y/N) y
次のユーザーの秘密鍵のロックを解除するには
パスフレーズがいります:“test1000 (my gpg-key) <test1000@example.co.jp>”
1024ビットDSA鍵, ID 7A286F08作成日付は2011-09-23
パスフレーズを入力:xxxxx 自分の鍵のパスワードを入力
# gpg --list-sigs 署名した鍵の確認
/root/.gnupg/pubring.gpg
------------------------
pub 1024D/7A286F08 2011-09-23
uid test1000 (my gpg-key) <test1000@example.co.jp>
sig 3 7A286F08 2011-09-23 test1000 (my gpg-key) <test1000@example.co.jp>
sub 2048g/9903E9D4 2011-09-23
sig 7A286F08 2011-09-23 test1000 (my gpg-key) <test1000@example.co.jp>
pub 2048R/0B7BAE00 2009-05-19 [満了: 2012-05-18] 今回自分の鍵で署名をしたISCの鍵の情報
uid Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org>
sig 3 0B7BAE00 2009-05-19 Internet Systems Consortium, Inc. (Signing key, 2009)
<pgpkey2009@isc.org>
sig 2DC6FF82 2009-05-19 [ユーザーIDが見つかりません]
sig 1BC91E6C 2009-05-19 [ユーザーIDが見つかりません]
sig CF9890F8 2009-05-20 [ユーザーIDが見つかりません]
sig 6BB6BE6A 2009-05-21 [ユーザーIDが見つかりません]
sig D297AB8E 2009-05-20 [ユーザーIDが見つかりません]
sig L 7A286F08 2011-09-23 test1000 (my gpg-key) <test1000@example.co.jp> 自分の鍵でローカル署名(sig L)していることを示す
sub 2048R/321216F8 2009-05-19 [満了: 2012-05-18]
sig 0B7BAE00 2009-05-19 Internet Systems Consortium, Inc. (Signing key, 2009)
<pgpkey2009@isc.org>
5.PGP署名の確認
BINDのソースファイルと署名ファイルをダウンロードし、ISCのPGP公開鍵を使ってデータの改ざんがないことを確認する
ISCでは、分離署名(署名内容が別のファイルで保存される)方式を採用している
[ 設定例 ]
# wget http://ftp.isc.org/isc/bind9/9.6-ESV-R3/bind-9.6-ESV-R3.tar.gz BIND本体のダウンロード
# wget http://ftp.isc.org/isc/bind9/9.6-ESV-R3/bind-9.6-ESV-R3.tar.gz.asc 署名ファイルのダウンロード (拡張子は.asc)
# ls 確認
bind-9.6-ESV-R3.tar.gz pgpkey2009.txt bind-9.6-ESV-R3.tar.gz.asc (同じディレクトリ内に保存しないといけないわけではない)
# gpg --verify bind-9.6-ESV-R3.tar.gz.asc bind-9.6-ESV-R3.tar.gz 署名の確認
gpg: 2010年12月01日 11時24分15秒 JSTにRSA鍵ID 0B7BAE00で施された署名 ISCの公開鍵(鍵ID:0B7BAE00)で署名されていることを示す
gpg: “Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org>”からの 正しい署名
[ 参考 ] ISCのPGP公開鍵を署名しなかった場合
警告が出るだけ
ローカル署名した場合と比べて何か問題となっているわけではない
# gpg --verify bind-9.6-ESV-R3.tar.gz.asc bind-9.6-ESV-R3.tar.gz
gpg: 2010年12月01日 11時24分15秒 JSTにRSA鍵ID 0B7BAE00で施された署名
gpg: “Internet Systems Consortium, Inc. (Signing key, 2009) <pgpkey2009@isc.org>”
からの正しい署名
gpg: 警告: この鍵は信用できる署名で証明されていません! ISCの公開鍵が本当にISCのものかどうか証明されていない
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: FA76 7A86 A371 E359 22F6 A5C8 D811 B53F 0B7B AE00