やりたいこと
プログラム本体が正当なものかどうかを、sig署名ファイルとgpgコマンドを使って検証する。
sig署名ファイルの公開鍵を「–keyserver, –recv-key」で取得し、「–verify」で検証する。
検証したいファイル
プログラム本体:TrueCrypt Setup 7.1a.exe
sig署名ファイル:TrueCrypt Setup 7.1a.exe.sig
やり方
GnuPGをインストールする
1 2 3 4 |
$ cat /etc/redhat-release CentOS release 6.5 (Final) # yum install gnupg |
とりあえず検証してみる
1 2 3 |
$ gpg --verify TrueCrypt\ Setup\ 7.1a.exe.sig gpg: 2012年02月08日 05時56分28秒 JSTにDSA鍵ID F0D6B1E0で施された署名 gpg: 署名を検査できません: No public key |
「F0D6B1E0」の公開鍵を持っていないため検証できない。(正常な動作)
なお、gpgコマンドを始めて実行した場合は、↓のようなメッセージが表示される。
1 2 3 4 |
gpg: ディレクトリー「/home/foo/.gnupg」ができました gpg: 新しい構成ファイル「/home/foo/.gnupg/gpg.conf」ができました gpg: 警告: 「/home/foo/.gnupg/gpg.conf」のオプションは起動している間、有効になりません gpg: 鍵輪「/home/foo/.gnupg/pubring.gpg」ができました |
「F0D6B1E0」の公開鍵を取得する
1 2 3 4 5 6 7 8 |
$ gpg --keyserver pgp.nic.ad.jp --recv-key F0D6B1E0 gpg: 鍵輪「/home/foo/.gnupg/secring.gpg」ができました gpg: 鍵F0D6B1E0をhkpからサーバーpgp.nic.ad.jpに要求 gpg: /home/foo/.gnupg/trustdb.gpg: 信用データベースができました gpg: 鍵F0D6B1E0: 公開鍵“TrueCrypt Foundation ”を読み込みました gpg: 絶対的に信用する鍵が見つかりません gpg: 処理数の合計: 1 gpg: 読込み: 1 |
pgp.nic.ad.jp(PGP公開鍵サーバ)から「F0D6B1E0」の公開鍵を取得する。(pgp.mit.edu とかでもOK)
「hkp」はおそらく「HTTP Keyserver Protocol」の意味。
gpgの鍵を作成していないので「絶対的に信用する鍵が見つかりません」でOK
再度検証してみる
1 2 3 4 5 6 7 |
$ gpg --verify TrueCrypt\ Setup\ 7.1a.exe.sig gpg: 2012年02月08日 05時56分28秒 JSTにDSA鍵ID F0D6B1E0で施された署名 gpg: “TrueCrypt Foundation ”からの正しい署名 gpg: 別名“TrueCrypt Foundation ” gpg: 警告: この鍵は信用できる署名で証明されていません! gpg: この署名が所有者のものかどうかの検証手段がありません。 主鍵の指紋: C5F4 BAC4 A7B2 2DB8 B8F8 5538 E3BA 73CA F0D6 B1E0 |
「“TrueCrypt Foundation ”からの正しい署名」となっているのでOK(ということにする)
補足
「$ gpg –gen-key」してから検証した場合は↓のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
$ gpg --gen-key gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: ディレクトリー「/home/foo/.gnupg」ができました gpg: 新しい構成ファイル「/home/foo/.gnupg/gpg.conf」ができました gpg: 警告: 「/home/foo/.gnupg/gpg.conf」のオプションは起動している間、有効になりません gpg: 鍵輪「/home/foo/.gnupg/secring.gpg」ができました gpg: 鍵輪「/home/foo/.gnupg/pubring.gpg」ができました ご希望の鍵の種類を選択してください: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (署名のみ) (4) RSA (署名のみ) 選択は? RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 要求された鍵長は2048ビット 鍵の有効期限を指定してください。 0 = 鍵は無期限 = 鍵は n 日間で満了 w = 鍵は n 週間で満了 m = 鍵は n か月間で満了 y = 鍵は n 年間で満了 鍵の有効期間は? (0) Key does not expire at all これで正しいですか? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) " 本名: hoge 名前は5文字以上でなければなりません 本名: HogeFugaPiyo 電子メール・アドレス: hogefugapiyo@example.net コメント: hogefugapiyo 次のユーザーIDを選択しました: “HogeFugaPiyo (hogefugapiyo) ” 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O 秘密鍵を保護するためにパスフレーズがいります。 can't connect to `/home/foo/.gnupg/S.gpg-agent': そのようなファイルやディレクトリはありません gpg-agent[6835]: ディレクトリー「/home/foo/.gnupg/private-keys-v1.d」ができました 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 asd今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 gpg: /home/foo/.gnupg/trustdb.gpg: 信用データベースができました gpg: 鍵42E73A66を絶対的に信用するよう記録しました 公開鍵と秘密鍵を作成し、署名しました。 gpg: 信用データベースの検査 gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/42E73A66 2014-07-05 指紋 = 9114 BFB7 CC96 1A67 E2E0 6360 1784 807F 42E7 3A66 uid HogeFugaPiyo (hogefugapiyo) sub 2048R/18528AB0 2014-07-05 $ gpg --edit-key hogefugapiyo gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 秘密鍵が使用できます。 pub 2048R/42E73A66 作成: 2014-07-05 満了: 無期限 利用法: SC 信用: 絶対的 有効性: 絶対的 sub 2048R/18528AB0 作成: 2014-07-05 満了: 無期限 利用法: E [ultimate] (1). HogeFugaPiyo (hogefugapiyo) コマンド> trust pub 2048R/42E73A66 作成: 2014-07-05 満了: 無期限 利用法: SC 信用: 絶対的 有効性: 絶対的 sub 2048R/18528AB0 作成: 2014-07-05 満了: 無期限 利用法: E [ultimate] (1). HogeFugaPiyo (hogefugapiyo) 他のユーザーの鍵を正しく検証するために、このユーザーの信用度を決めてください (パスポートを見せてもらったり、他から得た指紋を検査したり、などなど) 1 = 知らない、または何とも言えない 2 = 信用し ない 3 = ある程度信用する 4 = 完全に信用する 5 = 絶対的に信用する m = メーン・メニューに戻る あなたの決定は? 5 本当にこの鍵を絶対的に信用しますか? (y/N) y pub 2048R/42E73A66 作成: 2014-07-05 満了: 無期限 利用法: SC 信用: 絶対的 有効性: 絶対的 sub 2048R/18528AB0 作成: 2014-07-05 満了: 無期限 利用法: E [ultimate] (1). HogeFugaPiyo (hogefugapiyo) コマンド> quit $ gpg --verify TrueCrypt\ Setup\ 7.1a.exe.sig gpg: 2012年02月08日 05時56分28秒 JSTにDSA鍵ID F0D6B1E0で施された署名 gpg: 署名を検査できません: No public key $ gpg --keyserver pgp.nic.ad.jp --recv-key F0D6B1E0 gpg: 鍵F0D6B1E0をhkpからサーバーpgp.nic.ad.jpに要求 gpg: 鍵F0D6B1E0: 公開鍵“TrueCrypt Foundation ”を読み込みました gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u gpg: 処理数の合計: 1 gpg: 読込み: 1 |