GnuPGを使ってみる

Using GnuPG

Last updated: 03/12/10 OpenPKSD.ORGで公開されている公開鍵サーバーの使い方へのリンクを追加。

The GNU Privacy Guardとは、 GNUの情報セキュリティのためのツールで、 データを暗号化したりデータに署名したりすることができます。

受け取り人の公開鍵を使って暗号化したデータは、 受取人の私有鍵以外では復号できません。 これによって、メールが盗聴されるのを防ぐことができます。

バージョン1.0.4にはセキュリティ上のバグがありました。 とても遅いですが、1.0.6にバージョンアップしました。 (2003年12月9日現在の最新版は、1.2.3です。)

インストール準備メールのやりとりメールソフトを使う署名と検証


インストール

rootじゃない人が自分用に~/local/以下にインストールする。

  1. ダウンロード
    gnupg-1.0.6.tar.gz gnupg-1.0.4.tar.gz gnupg-1.0.4.security-patch1.diff を、 ここでは、~/local/packages にダウンロード。
  2. 解凍
    cd ~/local/src
    gunzip -c ../packages/gnupg-1.0.6.tar.gz | tar xvf -
    cd gnupg-1.0.6
    patch -p1 < ../../packages/gnupg-1.0.4.security-patch1.diff
    
    GNU patchが目的のマシンに無い場合は、Linuxマシンでパッチを当てて、 tarballにしてから目的のマシンに持ってくるとか。
  3. 設定、コンパイル
    ./configure --prefix=${HOME}/local --enable-static-rnd=unix
    make
    make check
    
    make checkでFAILしても進めるみたい。Solarisでは、 gpg: ../cipher/tiger: error loading extension: ld.so.1: ../g10/gpg: fatal: relocation error: file ../cipher/tiger: symbol __muldi3: referenced symbol not foundと出たぞ。
  4. インストール
    自分のホームディレクトリに入れれば、suしなくていいのだ。以下、csh系。
    make install |& tee `date +%y%m%d`.install.log
    
    .cshrc等に、setenv MANPATH ${MANPATH}:${HOME}/local/man などを追加しておくと、manページも見えてしあわせ。

準備

鍵を作る

http://www.lab3.kuis.kyoto-u.ac.jp/misc/doc/pgp/GnuPG Mini Howto と、 GnuPGの使い方 を参照。

  1. gpgする。~/.gnupg/以下ができる。
  2. gpg --gen-keyしていろいろ答える。
  3. 鍵を作ってくれる。いろいろキーボードを叩くと乱数性が増すそうな。ほんと? HP-UXは速いみたい。
  4. gpg --list-keysで確認する。

鍵にユーザーIDを追加する

メールアドレスが変更になった場合に、同じ鍵を使い続けたい場合。

  1. gpg --edit-key 元のメールアドレスする。
  2. adduidしていろいろ答える。
  3. gpg --list-keys 新しいメールアドレスして確認。

公開鍵を公開する

公開鍵サーバーを使う方法はまだ勉強中。 OpenPKSD.ORGのUNIX環境におけるOpenPGP準拠ソフト「GnuPG」での公開鍵サーバ使用法 が参考になりそう。

  1. ASCII化した公開鍵を作る。
    gpg --export -a -o pubring.asc ID
    
    IDはフルネームとかメールアドレスとか。だろうか?
  2. pubring.ascをwww等で公開する。メールで送ってもいい。

相手の公開鍵を受け取る

  1. 相手の公開鍵を見つける。 適当なファイル(ここではhoge.asc)に保存。
  2. 相手の公開鍵をインポートする。
    gpg --import hoge.asc
    
  3. 指紋を確認する。 相手が指紋を公開していれば、同じであることを確認できます。
    gpg --fingerprint ID
    
  4. 署名する。
    gpg --lsign-key ID
    
  5. 信用データベースを変更する。
    gpg --edit-key ID
    Command> trust
    …質問に答える。
    Command> quit
    
  6. 信用データベースを更新する。
    gpg --update-trustdb
  7. 信用データベースを確認する。
    gpg --check-trustdb

相手の公開鍵を廃棄する

gpg --delete-key ID

メールのやりとり

もっともプリミティブな方法。 メールソフトによっては、そのソフトの上からできるみたいです。 詳細は、以下

メールを書く

  1. メール本文を作る。 適当なファイル(ここではhoge.txt)に保存。
  2. 暗号化してサインする。
    gpg -e -a -r 受取人 -s hoge.txt
    
    パスフレーズを答えてサインし、相手の鍵を本当に使うか答える。
  3. 暗号化したファイルができあがる。今の例では、hoge.txt.asc
  4. 普通に送る。 cat hoge.txt.asc | mail 送り先 でもいい?

PGPを使っている人に署名・暗号化したメールを送ると、 先方で復号化する際に、文字化けが起こりました。 GNU Privacy Guard Plug-in for Becky! 2の作者、Yasuhiro ARAKAWAさんによると、 署名アルゴリズムの違いによるもののようです。 今回は、署名せずに暗号化だけすることで、回避しました。 署名時に--force-v3-sigsオプションをつけることで回避できそうです。 詳しくは、http://hp.vector.co.jp/authors/VA023900/gpg-pin/manual/tips.html をごらんください。

メールを受けとる

  1. 受けとったメールをファイル(ここではfuga.txt)にコピーする。
  2. 復号化する。
    gpg -d fuga.txt
    
    パスフレーズを答える。 送り主の公開鍵がインポートされていれば、サインも確認できる。

メールソフトを使う

mutt

http://bugs.guug.de/db/45/452-b.htmlを参照。 .mutt/muttrcに以下を追加する。

以下の内容は、muttと一緒に配布されている、…/doc/mutt/samples/gpg.rc にもありました。 太字はzundaによる変更。 サイン・検証する前に、日本語の漢字コードを直しとかないきゃいけませんでした。 [Mutt 1.2.5i-jp0 (2000-07-28)] kccじゃなくてnkfでもいいはず。 サインの検証の際には、最後のrm %f.jisがいつも成功するので、 muttはいつも検証がうまく行ったと思ってしまいます。 メッセージウインドウに現れるgpgからの出力をお見逃しなく。

pgp_encrypt_only_commandとpgp_encrypt_sign_commandにも、 漢字コード変換が必要なようです。 EUCに解読されちゃったら読めないメールソフトもあるんだよね。 (2001.9.18.追加)

さらに、 RFC2015によって、 署名の前に改行コードがCR-LFになっている必要があるそうです。 kcc -jで変換していたものを、 nkf -j -LwでCR-LFになるように変換するようにしました。 送信時には、 入力の漢字コードをEUCと仮定して-Eオプションも付けてあります。 (2003.7.10.追加)

set pgp_decode_command="gpg %?p?--passphrase-fd 0? --no-verbose --batch --output - %f"
set pgp_verify_command="nkf -j -Lw %f > %f.jis; gpg --no-verbose --batch --output - --verify %s %f.jis; rm %f.jis"
set pgp_decrypt_command="gpg --passphrase-fd 0 --no-verbose --batch --output - %f"
set pgp_sign_command="nkf -E -j -Lw %f > %f.jis; gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --detach-sign --textmode %?a?-u %a? %f.jis; rm %f.jis"
set pgp_clearsign_command="nkf -E -j -Lw %f > %f.jis; gpg --no-verbose --batch --output - --passphrase-fd 0 --armor --textmode --clearsign %?a?-u %a? %f.jis; rm %f.jis"
set pgp_encrypt_only_command="nkf -E -j -Lw %f > %f.jis; pgpewrap gpg -v --batch --output - --encrypt --textmode --armor --always-trust -- -r %r -- %f.jis; rm %f.jis"
set pgp_encrypt_sign_command="nkf -E -j -Lw %f > %f.jis;pgpewrap gpg --passphrase-fd 0 -v --batch --output - --encrypt --sign %?a?-u %a? --armor --always-trust -- -r %r -- %f.jis; rm %f.jis"
set pgp_import_command="gpg --no-verbose --import -v %f"
set pgp_export_command="gpg --no-verbose --export --armor %r"
set pgp_verify_key_command="gpg --no-verbose --batch --fingerprint --check-sigs %r"
set pgp_list_pubring_command="gpg --no-verbose --batch --with-colons --list-keys %r" 
set pgp_list_secring_command="gpg --no-verbose --batch --with-colons --list-secret-keys %r" 
set pgp_getkeys_command=""

メールを送るときは、メール本文を作った後、y:Sendの前に、pを押すと、 gpgのメニューが出る。(b)othで、サイン、暗号化して、y:Sendすると、 パスフレーズと相手の公開鍵IDを聞かれる。 Esc-kで公開鍵を添付できる。

暗号化されたメールが届くと、パスフレーズを聞かれる。 Mime-typeが、Application/Pgpじゃないといかんが。 相手の公開鍵がインポートされていて、サインされている場合には、 サインの確認結果も見せてくれる。

サインされたメールの場合は、設定ファイルで set pgp_verify_sig=yesされてる場合は自動的に検証してくれます。

Mew

http://www1.ringoya.nu/usr/9616/diary.htmlを参照。 でもまだ成功していない。

以下を作成し、gpg-lang.shとしてパスの通ったところに置き、 chmod +xしておく。

#!/bin/sh
LANG=C gpg $@

.emacsに以下を追加。Mew用も書いておこう。

;; mew
(setq mew-from "Hoge Fuga ")
(setq mew-cc "fuga@hoge.hoge")
(autoload 'mew "mew" nil t)
(autoload 'new-send "mew" nil t)
(setq exec-path (cons "/~zunda/opt/share/bin" exec-path))
(add-hook
 'mew-init-hook
 (function
  (lambda ()
        (setq mew-prog-w32 nil)
        (setq mew-mime-content-type
                  (append
                   '(
                         ("application/msword" "\\.doc$"
                          mew-b64 mew-prog-w32 mew-icon-text)
                         ("application/vnd.ms-excel" "\\.xls$"
                          mew-b64 mew-prog-w32 mew-icon-text)
                         )
                   mew-mime-content-type))
        )))
(setq mew-prog-pgp "gpg-lang.sh")
(setq mew-prog-gpg "gpg-lang.sh")
(setq exec-path (cons "~/local/bin" exec-path))

Mewを立ち上げいろいろやってみる。 むー。PGP is not foundとか言われてしまうな。 mew-1.94b39以降じゃないとだめなのかな? ( http://www.kyo-ko.org/knowhow/kondara/memo1.htmlより)

mewでは、wでドラフトモードになり、C-cC-aでマルチパートを作って、 pで自分の公開鍵を添付できます。まだできてへんが。

署名と検証

http://www.math.s.chiba-u.ac.jp/~matsu/gpg/gpg-3.htmlを参照。

これで、受取人がファイルが改変されてないことを確かめるのですね。 署名の際のパスフレーズで本人確認されます。


Back to zunda.

[zunda]
zunda <zunda at freeshell.org>