GnuPG の利用
オープンソースなどを公開する際に、改ざんされていないことを証明するために MD5, PGP 等によって署名するようになっています。MD5 によるハッシュのチェックでも良いのですが、より信頼のおける署名を利用することが当たり前となってきています。そのながで、ライセンス上問題のない OpenPGP を採用します。その OpenPGP の実装として GNU Privacy Guard (GnuPG) を利用します。
パッケージの入手とインストール
GnuPG をコンパイルする際に、gettext の問題が生じた場合 --with-included-gettext
を使用し、アセンブル時に問題が生じたら --disable-asm
を使用してください。 再度、configure を実行するには、Makefile
がきちんと作成されていれば make distclean
そうでなければ、まず config.cache
を削除して ./config.status --recheck
を実行してください。また、GNU make (gmake)
を使用するようにしてください。ここでは、Solaris 8 Intel 版をもとに説明します。
必要なモジュール
gnupg-1.2.3.tar.gz
(http://www.gnupg.org/)
インストール手順 (スーパーユーザーで作業)
# md5 gnupg-1.2.3.tar.gz MD5 (gnupg-1.2.3.tar.gz) = 46b990908019422535a08ce91b370ae7 # gzip -dc gnupg-1.2.3.tar.gz | tar xf - # cd gnupg-1.2.3 # MAKE=gmake ./configure --disable-asm # gmake # gmake check # gmake install # chmod 4755 /usr/local/bin/gpg
これらのインストールで /usr/local ディレクトリーにインストールされます。
PGPキーの作成と管理
インストールが終わったら、一般ユーザーになり自分の PGP キーを作成します。国際化に対応しているので、日本語で設定しましょう。
【キーの作成】
shin$ LANG=ja shin$ export LANG shin$ gpg --gen-key gpg (GnuPG) 1.2.3; Copyright (C) 2003 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: /home/shin/.gnupg: ディレクトリーができました gpg: 新しい構成ファイル`/home/shin/.gnupg/gpg.conf'ができました gpg: 警告: 「/home/shin/.gnupg/gpg.conf」のオプションは起動している間、有効になりません gpg: 鍵輪「/home/shin/.gnupg/secring.gpg」ができました gpg: 鍵輪「/home/shin/.gnupg/pubring.gpg」ができました すきな鍵の種類を選択してください: (1) DSAとElGamal (既定) (2) DSA (署名のみ) (5) RSA (署名のみ) どれにしますか? 1 DSA鍵対は1024ビットになります。 新しいELG-E鍵対を生成します。 最小の鍵長は 768 ビット 既定の鍵長は 1024 ビット 最大の推奨鍵長は 2048 ビット どの鍵長にしますか? (1024) 1024 要求された鍵長は1024ビット 鍵の有効期限を決めてください。 0 = 無期限 <n> = 有効期限 n 日間 <n>w = 有効期限 n 週間 <n>m = 有効期限 n か月間 <n>y = 有効期限 n 年間 鍵の有効期間は? (0)0 Keyは無期限です これでいいですか (y/n)? y あなたの鍵を同定するためにユーザーIDが必要です。 このソフトは本名、コメント、電子メール・アドレスから 次の書式でユーザーIDを構成します: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" 本名: Shin Motomiya 電子メール・アドレス: shin@example.com コメント: <Return> 次のユーザーIDを選択しました: "Shin Motomiya <shin@example.com>" 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O 秘密鍵を保護するためにパスフレーズがいります。 パスフレーズを入力: (パスフレーズ) パスフレーズを再入力: (パスフレーズ) 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。 +++++++++++++++.+++++++++++++++++++++++++++++++++++.++++++++++..++++++++++.+++++ +++++.++++++++++++++++++++..+++++++++++++++.+++++++++++++++.+++++........+++++ 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。 +++++++++++++++++++++++++++++++++++.++++++++++.+++++.++++++++++.++++++++++..++ ++++++++++++++++++...+++++++++++++++++++++++++.++++++++++..+++++.............>.. +++++.........................................................+++++^^^ gpg: /home/shin/.gnupg/trustdb.gpg: 信用データベースができました 公開鍵と秘密鍵を作り、署名しました。 絶対的に信用した鍵として記録しました。 pub 1024D/08721322 2003-09-17 Shin Motomiya <shin@example.com> 指紋 = A401 9652 0237 8BCA 9903 1DA8 E1A3 F7DC 0872 1322 sub 1024g/8798C56D 2003-09-17 shin$
【公開キー】
自分宛のファイルなどを暗号化してもらったり、自分の署名を相手に認識してもらうために、公開キーが必要になります。
shin$ gpg -a --export shin > public_ket.txt shin$ more public_key.txt -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.2.3 (SunOS) mQGiBD9oHbURBAD/3b68iBkL9eOy/40yNeMeHh1pIilIro0JmQat+bktCBCCBHjd ICFNkQZDzWZZ1N35st7lGkqluSdjP+Ou8PoF6YNxxYwiPtRe3IXAXUcbK4UWMGaF OScAnrAnglqi5RDYOTyfMSLFbe5qhy5S0NXw4SR6NIyFRLEDGkZNuGbuQwCg6guK UpVYayJbXArRclsF1KEAVL0EAJjtKLmd1Pqdk+9VpjY3C1rVDaM0Ad2NFYPIN8ki fMbQUhO01kR9KjrpyFRhn8JHmLW4JO3+jQHlWtNyZNZTiEnt7Sz7LJ0dQ32FhFsy JitZbkHxjWxFCfnX6+6n4kihUdfiwfzcVFYcE0KIpFOi3SYhGC0AJI6B0P4kxefk LZfHA/sGji2ghRSyjcX/w7qTcffqF9m/zZrVqSZyNI6AGR+63QTQvgv6pKYS7kb3 PQw39AJjFUztmQgLsqdcb5HnptHE77/6dFHOBgWWb07KkqxwOZM0kWPv4JmhwQtS LEz3p/o4nxaBFc1GR+8Jkux8nblWWhQOKVQZB/Ukp0aIsj1O8LQhU2hpbiBNb3Rv bWl5YSA8c2hpbkBmb29iYXIuY28uanA+iF4EExECAB4FAj9oHbUCGwMGCwkIBwMC AxUCAwMWAgECHgECF4AACgkQ4aP33AhyEyIpKACg0Xlkwmnj+g+f93RvCyxb5las JhQAn0OBpFAHNZO+ce1+4aJpYs8qMk02uQENBD9oHb8QBADo51Qt8odbhJ5fLkab E3Yb1Y5fhTho5ofWTEIa5Oycmr/+sq9lxTp06BLwND40jgX6ykYoMCMZY/5nyPf0 O3UBjyCJ6JkcufIro46l9MapPex01CisU5jpXF1/5pXh41FFss0ggGj38Hr6iGJh 4KJ7/jGMNG75MB0UGW5GTzbrzwADBQP/ZjH052E4Rqmn4m7tY/UqP+LP+B2nbbtN wI37HVXG6HqxFdY6AIEBtzVrihWbqxRdes9wuSaC5+6WJLXOGA3XouzolPv/+CTn XfsSigcs/9VdRp2L9g9C0GPhy41JVU01/Kj4H0qWMlkGSvES/qKPjcpBsz3eT9DT 5wfUA3IvECaISQQYEQIACQUCP2gdvwIbDAAKCRDho/fcCHITIu0wAJwOq4NJGWCk 4wxdH7wma5oeNAj+HgCeKkyxBTB51tb62P1Mqpe78B9ws2g= =SwCy -----END PGP PUBLIC KEY BLOCK----- shin$
できあがった公開キーを、メールや Web サイトなどで公開してください。
【フィンガープリント】
公開キーが本当に本人のものだと確認できるように、普段からメールに自分の公開キーのフィンガープリント(指紋)を添付しておくようにしましょう。
shin$ gpg --fingerprint shin pub 1024D/08721322 2003-09-17 Shin Motomiya <shin@example.com> 指紋 = A401 9652 0237 8BCA 9903 1DA8 E1A3 F7DC 0872 1322 sub 1024g/8798C56D 2003-09-17 shin$
【キーの破棄するために失効証明を生成】
パスフレーズを忘れた、パスフレーズが知られたなどの場合、他の人に現在の公開鍵が使用できないことを通知するために証明を発行します。
shin$ gpg --output revoke.asc --gen-revoke shin sec 1024D/08721322 2003-09-17 Shin Motomiya <shin@example.com> この署名にたいする失効証明書を作りますか? y 失効の理由を選択してください: 0 = 理由は指定されていません 1 = 鍵がパクられました 2 = 鍵がとりかわっています 3 = 鍵はもう使われていません Q = キャンセル (ここではきっと1を選びます) あなたの決定は? 1 予備の説明を入力。空行で終了: > <Return> 失効理由: 鍵がパクられました (説明はありません) よろしいですか? y 次のユーザーの秘密鍵のロックを解除するには パスフレーズがいります: "Shin Motomiya <shin@example.com>" 1024ビットDSA鍵, ID 08721322作成日付は2003-09-17 パスフレーズを入力: (パスフレーズ) ASCII包装出力を強制します。 失効証明書を作成しました。 見つからないような媒体に移動してください。もしワルがこの証明書へのア クセスを得ると、そいつがあなたの証明書を使えなくすることができます。 媒体が読出し不能になった場合に備えて、この証明書を印刷して保管するの が賢明です。しかし、注意してください。あなたのマシンの印字システムは、 だれでも見える場所にデータをおくことがあります! shin$ cat revoke.asc -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.2.3 (SunOS) Comment: A revocation certificate should follow iEkEIBECAAkFAj9pkAgCHQIACgkQ4aP33AhyEyLdqgCgl87oaIQrjUyVJ0cfhE+f avO6ZE8AnAm7l5p6M96I5auNCqFKdztrARzd =Sute -----END PGP PUBLIC KEY BLOCK----- shin$
【その他のキー管理】
その他、キーを管理するためのコマンドの一覧をあげておきます。
コマンドライン | 説明 |
gpg --list-keys |
登録されている公開鍵の一覧を表示 |
gpg --delete-secret-key <自分のID> |
秘密鍵を削除 |
gpg --delete-key <ID> |
指定した ID の公開鍵を削除 |
gpg --import < revcert.txt |
破棄証明を取り込む |
相手の公開キーの登録と署名
せっかくなので、gnupg-1.2.3.tar.gz
が正しいファイルかどうか確かめてみます。まず、公開キーを入手して自分のキーリングに登録します。日本語のメッセージはどうも見にくいので、ここから英語のメッセージに変えます。(メッセージは自分の好みのものに設定してください。)
shin$ LANG=C shin$ export LANG shin$ gpg --import gnupg-1.2.3/doc/samplekeys.asc gpg: key 57548DCD: public key "Werner Koch (gnupg sig) <dd9jn@gnu.org>" imported gpg: key 621CC013: public key "Werner Koch <wk@gnupg.org>" imported gpg: key 5B0358A2: public key "Werner Koch <wk@gnupg.org>" imported gpg: key B2D7795E: public key "Philip R. Zimmermann <prz@mit.edu>" imported gpg: key 99242560: public key "David M. Shaw <dshaw@jabberwocky.com>" imported gpg: Total number processed: 5 gpg: imported: 5 (RSA: 1) shin$
登録は終わりました。次に、この公開キーが信頼できるものとして署名しなくてはなりません。その際に、出力されるフィンガープリントを確認して正しければ署名します。
shin$ gpg --lsign-key "Werner Koch (gnupg sig) <dd9jn@gnu.org>" pub 1024D/57548DCD created: 1998-07-07 expires: 2003-12-30 trust: -/- (1). Werner Koch (gnupg sig) <dd9jn@gnu.org> pub 1024D/57548DCD created: 1998-07-07 expires: 2003-12-30 trust: -/- Primary key fingerprint: 6BD9 050F D8FC 941B 4341 2DCC 68B7 AB89 5754 8DCD Werner Koch (gnupg sig) <dd9jn@gnu.org> This key is due to expire on 2003-12-30. Do you want your signature to expire at the same time? (Y/n) Y How carefully have you verified the key you are about to sign actually belongs to the person named above? If you don't know what to answer, enter "0". (0) I will not answer. (default) (1) I have not checked at all. (2) I have done casual checking. (3) I have done very careful checking. Your selection? (enter '?' for more information): 0 Are you really sure that you want to sign this key with your key: "Shin Motomiya <shin@example.com>" (08721322) The signature will be marked as non-exportable. Really sign? You need a passphrase to unlock the secret key for user: "Shin Motomiya <shin@example.com>" 1024-bit DSA key, ID 08721322, created 2003-09-17 Enter passphrase: (パスフレーズ) shin$
公開キーの署名が終わったら、実際に gnupg-1.2.3.tar.gz
が正しいか確かめます。このほかに、署名ファイルである gnupg-1.2.3.tar.gz.sig
を入手しなくてはなりません(gnupg-1.2.3.tar.gz
をダウンロードできるところにおいてあります)。これらのファイルを、同一のディレクトリーにおいてチェックします。
shin$ gpg --verify gnupg-1.2.3.tar.gz.sig gpg: Signature made Fri Aug 22 05:24:33 2003 JST using DSA key ID 57548DCD gpg: Good signature from "Werner Koch (gnupg sig) <dd9jn@gnu.org>" gpg: checking the trustdb gpg: checking at depth 0 signed=2 ot(-/q/n/m/f/u)=0/0/0/0/0/1 gpg: checking at depth 1 signed=1 ot(-/q/n/m/f/u)=2/0/0/0/0/0 gpg: next trustdb check due at 2003-12-30 shin$
メッセージから、正しいファイルであることが確認できます。
このほかに、gpg コマンドでは キーの一覧を表示する --list-keys
、キーを削除する --delete-key
等があります。詳細は
gpg コマンドのマニュアルを参照してください。
ファイルの暗号化・復号化
今度は、誰かに秘密のファイルを送る際に暗号化して送る手順を記述します。本来は、キーリングに登録されている送信相手の公開キーを使用して暗号化し、暗号化された内容を送信します。受け取った相手は、自分の秘密キーを使ってファイルを復号化します。
【オリジナルのファイル】
shin$ cat secret.txt ここだけの話なんだけど、 ○×って、□なんだって (>_<)
【送信相手の公開キーを呼び出して暗号化】
-e 暗号化 -a ASCII形式 -r メールアドレスの公開キー shin$ gpg -ea -r hana@hogehoge.com secret.txt shin$ more secret.txt.asc -----BEGIN PGP MESSAGE----- Version: GnuPG v1.2.3 (SunOS) hQEOA/CS/8CHmMVtEAP+OnYkwOXYnOcLQIFJex060lUJPTy+ZCbG+EEorpux/ekD Jxz3HKE8DTwLcn7IjRW95yqVZtWachKGw2nuh/uyobtWH+UJwlW9VlGpu0X+YT+0 OIWBx4OeJVFzfkghPHDEYBSMGIfdi6pNWf5kl/sBO//AIaJxkAF3M1B+poe/2CsE AMMr38pwHJQH7camzluqudjmdcI3bDWY1pbi5zGxKA+AkBcaPao0x0WbuF56kY0x wNFmUqy7So1yFxcpHYxIAQX+X6E/zLWB5+JcsemNu93NIvilUyKfLx6vy/RYaLUx DEbElnMKknsFe9hhzf/7fp1VPfgZ/kZ8ZHW+L3t7lQF10nMBy2OapKGA2uq+dAWv i3ODwoH2D1G39ORa2h5PWOfNgxix6Lm3rZEz7p6zK+XQUK3UAAdafjNaGNWtO1Cc dupkBpOrRacdoTmBU57dEMbgmmTj3bdvoFy3jqSy1q69SX5F1QiVX69PLJ6R1k+j qfuBF9p/ =Irf9 -----END PGP MESSAGE----- shin$
【暗号化されたファイルをもらった相手は、自分の秘密キーで復号化】
hana$ gpg -d secret.txt.asc You need a passphrase to unlock the secret key for user: "Hana Koeda <hana@hogehoge.com>" 1024-bit ELG-E key, ID 3D8576F6, created 2003-09-17 (main key ID 17CEE1C3) Enter passphrase: (パスフレーズ) gpg: encrypted with 1024-bit ELG-E key, ID 3D8576F6, created 2003-09-17 "Hana Koeda <hana@hogehoge.com>" ここだけの話なんだけど、 ○×って、□なんだって (>_<) hana$
署名と検証
ファイルの署名、署名の検証を行う方法を記述します。
【署名】
shin$ gpg -s secret.txt You need a passphrase to unlock the secret key for user: "Shin Motomiya <shin@example.com>" 1024-bit DSA key, ID 08721322, created 2003-09-17 Enter passphrase: (パスフレーズ) shin$ gpg -d secret.txt.gpg ここだけの話なんだけど、 ○×って、□なんだって (>_<) gpg: Signature made Thu Sep 18 19:59:21 2003 JST using DSA key ID 08721322 gpg: Good signature from "Shin Motomiya <shin@example.com>" shin$
【検証】
shin$ gpg --verify secret.txt.gpg gpg: Signature made Thu Sep 18 19:59:31 2003 JST using DSA key ID 08721322 gpg: Good signature from "Shin Motomiya <shin@example.com>" shin$
【テキストファイルへの署名】
shin$ gpg --clearsign secret.txt You need a passphrase to unlock the secret key for user: "Shin Motomiya <shin@example.com>" 1024-bit DSA key, ID 08721322, created 2003-09-17 Enter passphrase: (パスフレーズ) shin$ cat secret.txt.asc -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 ここだけの話なんだけど、 ○×って、□なんだって (>_<) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (SunOS) iD8DBQE/aZAK4aP33AhyEyIRAuzcAKDZe2TaM0iGFjoQmkmx4GZH4EeM4gCfS95e nIyI3ejSeuJW7WURIynfXW4= =We1l -----END PGP SIGNATURE----- shin$
【署名ファイルを別途生成】
shin$ gpg -b project.tar.gz You need a passphrase to unlock the secret key for user: "Shin Motomiya <shin@example.com>" 1024-bit DSA key, ID 08721322, created 2003-09-17 Enter passphrase: (パスフレーズ) shin$ ls project.tar.gz project.tar.gz.sig shin$
これまではここの説明のため、署名と暗号化を別々に行っていましたが、署名と暗号化のオプションを一度に指定することで同時に行うことができます。