## page was renamed from alstamber/MacGPG {{{ #!wiki caution この記事は非常に長いです. 読む際には心してください. }}} = なにこれ = * 暗号化ソフトウェアとしてUNIXでよく知られている実装が, GPG(GNU Privacy Guard)である. *PGPの別実装として, PGPが抱えていたライセンス問題をクリアしたものである. * MMA部員にもGPGを活用しているひとが多いようだ. * GPGを使うことでメールの電子署名とか暗号化ができるようだ. * ならうちのMacにもいれてみたい, ついでにThunderbirdをつかったメールの電子署名もしてみたいと思い試してみることにした. = 電子署名って何よ = == 電子署名 == * 電子署名は次のようなことを保証するためのいい方法である. メールに電子署名する場合で例えると…… * そのメールが本当に差出人から来たものかどうか * そのメールが途中で改ざんされていない === 電子署名の原理 === * まず秘密鍵と公開鍵という鍵を作る. 秘密鍵は暗号化だけができる暗号の鍵であり, 公開鍵は暗号をもとに戻すことだけができる暗号の鍵である. * メール本文を特殊な関数に通して, ハッシュ値という値を得る. (ハッシュ値から本文を復元することは極めて難しいような特殊な関数を使う) * ハッシュ値を秘密鍵を使って暗号化する. * ハッシュ値をメールに添えて送信する. * 受信者はメール本文からハッシュ値を計算する. * メールにくっついてきた暗号化されたハッシュ値を公開鍵で復号化する. * 暗号をもとに戻して出てきたハッシュ値とメール本文から計算したハッシュ値を比較する. * 一致していればこのメールは確かに差出人からやってきて、かつ内容が途中で改ざんされていないといえる. * この方法では公開鍵が改ざんされる可能性があるという問題がある. * そこで公開鍵を特殊な関数に通して「フィンガープリント」というものを作成する. (やはりフィンガープリントから公開鍵そのものを復元するのは極めて難しい) * フィンガープリントを受信者に伝える. * 受信者は公開鍵からフィンガープリントを同じようにして作り, 両方のフィンガープリントが一致していることを確かめる. 一致していれば公開鍵は改ざんされてないと言える. * MMAのMLを注意深く見ていると, この公開鍵とフィンガープリントについて署名で明記している人がいることに気づきます. この人達は自分の鍵をすでに持っていてその情報を署名に書いているのでしょう. = GPGToolsを使おう = * GPGToolsは, MacにおいてGPGを使う上で最も便利なパッケージである. * GPGToolsには, MacでGPGを使うために必要なツールがひと通り入っている. * 楽だし悪い話を聞かないのでこれを入れてみることにした. == GPGToolsのインストール == * 以下のサイトからダウンロードできるのでダウンロードする. [[http://www.gpgtools.org/installer/index.html|GPGTools (OpenPGP Tools for Apple OS X)]] * dmgファイルで落ちてくるので, 開いてインストーラを起動する. * 途中で出てくるダイアログの「カスタマイズ」をクリックすることでどのツールをインストールするかをきめられる. * MacGPG2……Mac版のGPGの基本プログラム. これはインストールしないと意味が無い. * GPGMail……GPGをMac付属の「メール」で使うためのツール. 「メール」を使ってないなら不要. * GPGKeychainAccess……GPGの鍵を管理するツール. * GPGService……難しく言うとシステムのサービスとして提供される物. Linux畑の人向けに説明すればデーモン. 必ず必要. * GPGPreferences……GPGの詳細設定をできるツール. * Enigmail……Thunderbird用のGPGツール. * インストールが終わったら, 一旦再起動する. == Thunderbirdとの統合 == * Thunderbirdに統合することでメールの電子署名や暗号化が可能となる. * Enigmailというアドオンを使う. === Enigmailのインストール === * GPGToolsを使うとEnigmailが自動的にインストールされるはずだが, うまくいかなかったので個別にインストールする. * 以下のサイトから拾ってくる. [[https://addons.mozilla.org/ja/thunderbird/addon/71]] * Thunderbirdを立ち上げて, 「ツール」→「アドオン」→「インストール」からダウンロードしたEnigmailをインストール. * 再起動後「OpenPGP」→「設定」を開く. * 「次の設定で上書き」にチェックし, 「usr/local/bin/gpg」と入力する. * 警告が出てくるかもしれないが, 無視して良い. == 鍵の管理 == === 鍵をつくろう === * Thunderbird上でGUI的に作れる方法と, 端末を用いてCUI的に作れる方法がある. * MMA的にはFreeBSDを使用する機会が多いので, CUIを用いて鍵を作成することとする. * 端末を立ち上げる. 次のように操作. {{{ % gpg --gen-key }}} * 指示に従って操作する. {{{ ご希望の鍵の種類を選択してください: (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) /* 何も押さずにエンター */ 鍵の有効期限を指定してください。 0 = 鍵は無期限 = 鍵は n 日間で満了 w = 鍵は n 週間で満了 m = 鍵は n か月間で満了 y = 鍵は n 年間で満了 鍵の有効期間は? (0) /* 好きなのを選べば良い */ Key does not expire **** これで正しいですか? (y/N) y あなたの鍵を同定するためにユーザーIDが必要です。 このソフトは本名、コメント、電子メール・アドレスから 次の書式でユーザーIDを構成します: "Heinrich Heine (Der Dichter) " 本名: Naben Erst メールアドレス: naben@erst.com コメント: 次のユーザーIDを選択しました: “Naben Erst ” 名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O /* 大文字のオー */ パスフレーズを入力: /* パスフレーズなのでスペースなどが入っていてもいい. つまり文章でもよい */ パスフレーズを再入力: /* もう一度 */ 今から長い乱数を生成します。キーボードを打つとか、マウスを動かす とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 /* 鍵の生成はすぐ終わってしまうがこの間にキーボードを叩いたりするとよりいい鍵を作れる */ gpg: 鍵********を絶対的に信用するよう記録しました 公開鍵と秘密鍵を作成し、署名しました。 gpg: 信用データベースの検査 gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル gpg: 深さ: 0 有効性: 2 署名: 2 信用: 0-, 0q, 0n, 0m, 0f, 2u gpg: 深さ: 1 有効性: 2 署名: 0 信用: 0-, 0q, 0n, 0m, 2f, 0u pub 2048R/******** 20xx-xx-xx 指紋 = **** **** **** **** **** **** **** **** **** **** uid Naben Erst sub 2048R/******** 20xx-xx-xx }}} {{{ #!wiki caution 「本名」は鍵サーバに鍵を公開すると世界中に公開される. それをよく思わない場合はaliasなどにしておくべきだろう. }}} * この時pub 2048Rの横にある8文字の記号が「ID」と呼ばれるものである. メモしておくと良い. * 指紋とかかれているところの横にある記号の羅列は, FingerPrintと呼ばれるものである. === 公開鍵をインターネット上のサーバにアップロードする === * 公開鍵は広く公開して初めて意味を持つ. なぜなら受信者が公開鍵を持っていることが電子署名の前提だからだ. * 公開鍵を公開するための専用のサーバがいくつか存在する. →鍵サーバという * 鍵サーバに自分の公開鍵をアップロードするには次のようなコマンドを端末で入力する. {{{ % gpg --key-server サーバー名 --send-keys 鍵のID }}} * 鍵サーバとしてはpgp.nic.ad.jpなどが有名である. [[http://www.keyserver.net/|Keyserver.net]]なども利用出来る. {{{ #!wiki caution 公開鍵はたくさんの場所に公開するのが良い. たくさんの場所に公開すればそれだけぜんぶが書き換えられて偽造される可能性が低くなる. }}} === 公開鍵をインターネット上のサーバにアップロードする2 === * 先程は端末を使う方法を説明したが, サーバはインターネット上にあるのでWebブラウザを使ってもアップロードできる. * Webブラウザにアップロード出来る形にするために端末を立ち上げて次のコマンドを打ち込む. {{{ % gpg -a --export ID }}} * 上のコマンドを実行するとずらずらと文字列が出てくる. これが公開鍵である. リダイレクションなどを使ってファイルに出力してもいいと思う. * 公開鍵をコピーして, pgp.nic.ad.jpなどの鍵サーバにブラウザでアクセスする. * ページの指示に従って公開鍵を貼りつけ送信する. {{{ #!wiki caution 公開鍵はたくさんの場所に公開するのが良い. たくさんの場所に公開すればそれだけぜんぶが書き換えられて偽造される可能性が低くなる. }}} === Thunderbirdから他人の公開鍵を手に入れる方法 === * 電子署名のついたメールを受け取ったら公開鍵を何らかの方法で手に入れなければ電子署名の確認ができない. * 電子署名されたメールをひらくと, 一番上にOpenPGPのメッセージが表示されている部分があることに気づく. * この一番右にある「詳細」をクリックし「公開鍵を読み込む」をクリックすれば, 公開鍵を自動的に鍵サーバから拾ってくることができる. === 端末を使って他人の公開鍵を手に入れる方法 === * 相手の公開鍵IDか本名の一部が分かっていれば次の方法で公開鍵を手に入れられる. {{{ % gpg --key-server 鍵のあるサーバ --recv-keys IDor名前 }}} * 他のところからとってきた鍵は, 自分が署名し, かつ信用度を設定しないと使えない. * 次のコマンドを実行する. {{{ % gpg --lsign-key ID /* こうすると一応署名はできるが, 他の人にコピーして渡すと署名が消えてしまう中途半端な署名に出来る */ % gpg --edit-key ID > trust (1~4の間で信用度を指定する. 実際にあったことがあり鍵が本人のものだと分かっているのなら4でいいと思われる) }}} * わざわざ中途半端な署名にするのは, その鍵は完全に正当なものだと保証はできないけどとりあえず使う為には署名をしなければならない, という苦肉の策である. * 念のため指紋が手に入るのなら, 指紋の照合もしておくと良い. {{{ % gpg --fingerprint ID }}} === ブラウザを使って他人の公開鍵を手に入れる方法 === * ブラウザを使って鍵サーバにアクセスすることで, 公開鍵を検索できる. そこで見つけた公開鍵を自分のところに取り込む方法である. * まず, 公開鍵をコピーしてファイルに保存する. * 次のコマンドを実行. {{{ % gpg --import ファイル名 }}} * 他のところからとってきた鍵は, 自分が署名し, かつ信用度を設定しないと使えない. * 次のコマンドを実行する. {{{ % gpg --lsign-key ID /* こうすると一応署名はできるが, 他の人にコピーして渡すと署名が消えてしまう中途半端な署名に出来る */ % gpg --edit-key ID > trust (1~4の間で信用度を指定する. 実際にあったことがあり鍵が本人のものだと分かっているのなら4でいいと思われる) }}} * わざわざ中途半端な署名にするのは, その鍵は完全に正当なものだと保証はできないけどとりあえず使う為には署名をしなければならない, という苦肉の策である. * 指紋が分かっているのなら, 指紋照合を行っておくと良い. {{{ % gpg --fingerprint ID }}} === GPG Keychain Accessを使う === * GPGToolsをインストールするとGPG Keychain Accessというツールがインストールされる. * これを使うと, 上に書いたような鍵の管理がGUIでできる. * 英語だが割と便利なので使うと良い. === GPG Keychain Accessを使うと出来ること === * 鍵の作成, 削除 * 鍵への署名, 信用度変更 * 鍵の有効期限, パスフレーズ変更 * 鍵の取り込み, 書き出し * 鍵サーバへの送信, 鍵サーバからの取り込み = 信用の輪と相互署名 = * 公開鍵が本当にその人のもので, かつ改ざんされていないかどうかというのは電子署名において重要である. * どうやってそれを証明するかが問題になる. == 信用の輪とは == * 鍵を持っている人が他の人の鍵に対して, 自分の鍵を使って署名を行い信用度をランクづけする. * →鍵を持っている人たち全員がお互いを証明しあう. * →信用の輪という. * →個人に鍵の正当性の証明という重大な責任がある. == 他人の鍵に署名する方法 == * 実は他人の鍵を使えるようにするときに行う署名と信用度の設定とほとんど変わらない. * 違うのは署名の時に --lsign-key オプションではなくて --sign-key オプションを使うこと. {{{ % gpg --sign-key ID % gpg --edit-key ID > trust (1~4で信用度を設定) }}} * --sign-key オプションを使うと, その公開鍵をコピーして他の人に渡してもその署名が維持される. * →未来永劫その鍵はその人のものであるという自分の証明がつきまとう * →慎重に署名は行わなければならない. {{{ #!wiki caution その人にその鍵が本物かどうか信用できる方法で確認してから, 署名すること. たとえば直接あって確認すること. 平文のメールなどは改ざんされてる可能性があるので信用できない. }}} {{{ #!wiki caution 指紋が一致しているかどうかもきちんと確かめるべきである. 大抵の人は指紋をどこかに公開している(サイト, 鍵サーバ, MMAのメーリングリストでのメールの署名). }}} ------ {{{#!wiki red/solid 以下の情報は古い情報です. 特別な理由がない限り参照する必要はありません. }}} = MacPortsからGPGをインストールする方法 = == Xcodeをインストールする == * XcodeはMacでgccなどの開発用ツールを使えるようにするパッケージ. 下から拾ってくる. * ダウンロードにはAppleIDが必要. [[http://developer.apple.com/mac/]] * dmgファイルでダウンロードできるので, ダブルクリックし, インストーラを起動する. * 途中何をインストールするか選択できる. iOS SDKは容量を食う割に今回の目的には必要ないので外しておく. 「UNIX〜」はgccコンパイラなどを含んだパッケージなのでチェックを必ず入れておく. == MacPortsをインストールする == * MacPortsはMac上でFreeBSDのportsに相当するものを利用出来るようになるプログラムである. [[http://www.macports.org/install.php]] * Xcodeと同様にインストール. == パスを通す == * このままだと端末からMacPortsを利用できないので, portsの実体があるディレクトリにパスを通す. * ターミナルを起動. * vimなどのエディタを使って.zshrc(←は適宜自分が使っているシェルに読み替えて)に次のスクリプトを追加する. {{{ export PATH=/opt/local/bin:/opt/local/sbin:$PATH }}} * ターミナルに戻って, source .zshrc を実行し.zshrcの内容を適用する. == GPGのインストール == * 以下のとおり操作. {{{ % sudo port selfupdate % sudo port sync % sudo port install gnupg }}} * sudoではパスワードを聞かれるので入力する.