インターネットを介した通信では特別な暗号化手段を取らない限り通常は平文のデータがやりとりされます。こういった平文のデータは通信経路の途中で簡単に覗き見出来、悪意を持って内容を改竄する事も可能です。このページでは debian lenny で、安全なメールのやりとりの為に GnuPG を使って暗号化したり署名したりする方法をメモしておきます。
debian では通常 gnupgパッケージは最小構成でも既にインストール済みなので、改めてインストールする必要はありません。
GnuPG は公開鍵暗号方式を利用しているので、自分用の公開鍵と秘密鍵のペアが必要です。
$ gpg --gen-key
gpg (GnuPG) 1.4.10; Copyright (C) 2008 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/koro/.gnupg」ができました
gpg: 新しい構成ファイル「/home/koro/.gnupg/gpg.conf」ができました
gpg: 警告: 「/home/koro/.gnupg/gpg.conf」のオプションは起動している間、有効になりません
gpg: 鍵輪「/home/koro/.gnupg/secring.gpg」ができました
gpg: 鍵輪「/home/koro/.gnupg/pubring.gpg」ができました
ご希望の鍵の種類を選択してください:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
選択は? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
要求された鍵長は4096ビット
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で満了
<n>w = 鍵は n 週間で満了
<n>m = 鍵は n か月間で満了
<n>y = 鍵は n 年間で満了
鍵の有効期間は? (0) 0
Key does not expire at all
これで正しいですか? (y/N) y
あなたの鍵を同定するためにユーザーIDが必要です。
このソフトは本名、コメント、電子メール・アドレスから
次の書式でユーザーIDを構成します:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
本名: Koro Inukai
電子メール・アドレス: koro@example.jp
コメント: the puppy # コメントは空欄でも可
次のユーザーIDを選択しました:
“Koro Inukai (the puppy) <koro@example.jp>”
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
秘密鍵を保護するためにパスフレーズがいります。
パスフレーズを入力:
パスフレーズを再入力:
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。
gpg: /home/koro/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵7CBE566Bを絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。
gpg: 信用データベースの検査
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
pub 4096R/7CBE566B 2011-03-27
指紋 = B776 8A69 4471 F035 3AFD 38AE 408E 3636 7CBE 566B
uid Koro Inukai (the puppy) <koro@example.jp>
sub 4096R/38B1F5AE 2011-03-27
そして、~/.gnupg/gpg.conf に、
personal-digest-preferences SHA256
cert-digest-algo SHA256
default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed
を追記すると準備完了です。
公開鍵暗号方式にも書いてありますけども、送り先用に暗号化する為の鍵である公開鍵は文字通り公開し配布しないと意味がありません。
それでは上で作った公開鍵を koro.key というファイル名で取り出しましょう。例の 7CBE566B は上で作った鍵の Key ID です。
$ gpg --export -a 7CBE566B > koro.key
ファイルとして取り出した公開鍵は直接相手に渡したり、適当な Webサーバに置いて公開したり出来ます。
公開鍵を公開するには、既存の公開鍵サーバに登録するのが簡単で便利です。以下の例では公開鍵サーバ pgp.nic.ad.jp へ登録しています。
$ gpg --keyserver pgp.nic.ad.jp --send-keys 7CBE566B
pochi.key というファイル名のぽちの公開鍵を貰ったとすると、
$ gpg --import pochi.key
で自分の鍵束に取り込んで、ぽちへ送るものを暗号化する鍵として使えるようにします。
公開鍵サーバに登録してある鍵なら直接自分の鍵束に取り込む事が出来ます。以下の例では公開鍵サーバ pgp.nic.ad.jp から、Key ID 4A1B5E85 の実際のぽちの公開鍵を取り込んでいます。
$ gpg --keyserver pgp.nic.ad.jp --recv-keys 4A1B5E85
こうして公開鍵を取り込んだ自分の鍵束を見てみましょう。
$ gpg --list-keys
/home/koro/.gnupg/pubring.gpg ------------------------------ pub 4096R/7CBE566B 2011-03-27 uid Koro Inukai (the puppy) <koro@example.jp> sub 4096R/38B1F5AE 2011-03-27 pub 4096R/4A1B5E85 2010-06-30 uid Pochimaru Inuyama (pochi) <inuyamapochimaru@yahoo.co.jp> sub 4096R/B53B7567 2010-06-30
自分用の鍵ペアを作った時からあった自分自身の公開鍵に加えて、後から取り込んだぽちの公開鍵が鍵束に入っている事が分かります。
その公開鍵が本当にその人の公開鍵かどうかは、自分の鍵束の中にある公開鍵の鍵指紋と、それとは別経路で手に入れた本当にその人だと確認済みの鍵指紋が一致するかどうかでチェック出来ます。ぽちの公開鍵を例にすると、公開鍵サーバから入手したぽちの公開鍵の鍵指紋と、ぽち*ぷ〜ちの各ページの最下段に書いてあるぽちの公開鍵の鍵指紋が一致するかどうかを確かめます。(本当はぽち本人から手渡しで貰った鍵指紋と照合するのが一番良い方法です。)
それでは自分の鍵束の中にあるぽちの公開鍵(と思われるもの)の鍵指紋をチェックしてみましょう。
$ gpg --fingerprint 4A1B5E85
pub 4096R/4A1B5E85 2010-06-30
指紋 = 4605 4D40 6154 20C1 5592 3E54 5A37 FEE9 4A1B 5E85
uid Pochimaru Inuyama (pochi) <inuyamapochimaru@yahoo.co.jp>
sub 4096R/B53B7567 2010-06-30
一致しましたか?
誰か特定の人にしか復合出来ない暗号化したファイルを送りたい場合には、その人の公開鍵を使って暗号化します。ぽちだけに文章を復号して欲しくて to_pochi.txt を暗号化するにはこういう感じになります。
$ gpg -e -a -r 4A1B5E85 to_pochi.txt
こうして出来た to_pochi.txt.asc は、ぽちしか持っていないぽちの秘密鍵を使ってしか復号出来ません。つまり暗号化した自分自身でも復号出来ません。GnuPG の使い途から考えると普通はこれで充分なのですが、それじゃちょっと不便だなあ、自分自身でも復号したいなあという時には、以下のように -r の受取人の指定に自分の Key ID も追加して暗号化してみましょう。
$ gpg -e -a -r 4A1B5E85 -r 7CBE566B from_koro_to_pochi.txt
こうして出来た暗号化済みのファイルはそのままメールの内容にコピペして発信出来ます。使っているメールクライアントの機能が GnuPG や PGP に対応していると、こうしたコマンドライン操作無しで暗号化出来たりもします。
暗号化されたものを復号してみましょう。素材にはすぐ上の例で作成した from_koro_to_pochi.txt.asc を使います。自分自身の公開鍵とぽちの公開鍵で暗号化されているので、自分自身の秘密鍵とぽちの秘密鍵で復号する事が出来ます。(自分で暗号化したものを自分で復号出来ます。)
$ gpg from_koro_to_pochi.txt.asc
通信経路の途中で改竄されていないかどうか検証可能なように署名を付ける事も出来ます。メールなどではクリア署名を使う事が多いようです。
sample.txt の内容をそのまま含みアスキー形式の署名を結合した sample.txt.asc を作成します。
$ gpg --clearsign -s -a sample.txt
sample2.txt はそのままで、それとは別にアスキー形式の署名ファイル sample2.txt.asc を作成します。
$ gpg -b -a sample2.txt
クリア署名を検証します。
$ gpg --verify sample.txt.asc
分離署名を検証します。
$ gpg --verify sample2.txt.asc sample2.txt
自分の秘密鍵を失してしまったり、盗まれたり、安全上の問題から変更したくなったりした時には、鍵を失効させましょう。
まず鍵の失効証明書を作ります。自分用の鍵ペアを作成した時には必ず失効証明書作って、紙にプリントアウトするなり CD-ROM などの書き換え不可なリムーバブルメディアへ保存するなりして、必要とされる時まで絶対にオンラインにはならない場所に厳重に保管しておきましょう。
$ gpg --gen-revoke 7CBE566B > shikkousyoumeisyo.asc
ここで出来た鍵の失効証明書を読み込みます。
$ gpg --import shikkousyoumeisyo.asc
これで鍵が失効しました。公開鍵を公開鍵サーバに登録している場合には、公開鍵サーバへ自分の公開鍵が失効した事を知らせなければなりません。それにはこの失効済みの公開鍵を公開鍵サーバに登録します。
$ gpg --keyserver pgp.nic.ad.jp --send-keys 7CBE566B
最後に、失効済みの鍵自体を削除してしまいましょう。
$ gpg --delete-secret-and-public-key 7CBE566B
動作確認環境 : Debian GNU/Linux 6.0 squeeze