[Mew-dist 16571] Re: b107

Ryutaroh Matsumoto ryutaroh at example.com
2001年 2月 22日 (木) 13:47:08 JST


> - unless/when の影響で、S/MIME のパッチが当たらなくなりそうなので当て
>   ておきました。不要な変数、インデント間違い、コメントの間違いなど、た
>   くさん直しましたが、まだまだやるべきことは多いです。暗号化のコードに
>   は仕様上の問題があるので、抜いています。試していませんが、署名と検証
>   はできるかもしれません。PGP の共存など、考えるべきことは多いです。

コードのクォリティが低くてすみません。

電子署名の付加、検証、受け取った暗号文の解読は試した範囲でおかしな動作
はしませんでした。

contrib/00readme-smime.jis は最小限のことしか書いてなくて不親切だと思
うので、公開鍵暗号やS/MIMEの知識が無い人にも話がわかるように説明を書き
直したので、もし不都合がなければ00readme-smime.jisを添付したtexinfoで
差し替えてください。

--
松本  隆太郎
-------------- next part --------------
\input texinfo  @c -*-texinfo-*-
@c %**start of header
@setfilename mew-smime-ja
@settitle S/MIME support in Mew
@c @afourpaper
@c %**end of header

@dircategory Message User Agent
@direntry
* Mew S/MIME: (mew-smime-ja).     S/MIME support in Mew.
@end direntry

@setchapternewpage off

@ifinfo
Mew 1.95b107から導入される予定のS/MIMEサポート機能の説明です。

Copyright (C) 2000
松本 隆太郎 <ryutaroh@@rmatsumoto.org>
@end ifinfo

@titlepage
@title S/MIME support in Mew

@author 松本 隆太郎 @email{ryutaroh@@rmatsumoto.org}
@end titlepage

@contents

@node Top, 公開鍵暗号とは何か, (dir), (dir)
@top S/MIME support in Mew

Mew 1.95b107から導入されたS/MIMEサポート機能の説明です。
そのうちmewのinfoの本体にS/MIMEの説明が入る(またはS/MIMEがmewから
削られる)と思いますが、この文書はそのときまでの暫定的なものです。

S/MIMEはNetscape付属のメールリーダーやMicrosoftのOutlookシリーズ
で使われている暗号と電子署名の規格です。S/MIMEに対応したメールリーダー
の一覧は @uref{https://digitalid.verisign.co.jp/client/index.html} 
にあります。

@strong{Mew 1.95b107では暗号化はできません。それ以外の署名の付加・検証、
暗号文の解読はできます。}

@menu
* 公開鍵暗号とは何か::          
* メールに於ける電子署名の仕組み::  
* S/MIME機能の使い方::          
* 今後の課題::                  
* 索引::                        

@detailmenu
 --- The Detailed Node Listing ---

S/MIME機能の使い方

* 使う為の準備::                
* 操作方法::                    

使う為の準備

* 署名の検証と暗号化メールの送信の準備::  
* 署名の付加と受信した暗号文の解読の準備::  

操作方法

* 署名付きメールおよび暗号化メールの送り方::  
* 電子署名の検証と暗号文の解読のやり方::  

@end detailmenu
@end menu

@node 公開鍵暗号とは何か, メールに於ける電子署名の仕組み, Top, Top
@chapter 公開鍵暗号とは何か
@cindex 公開鍵暗号
@cindex 対称鍵暗号
@cindex 公開鍵
@cindex 電子署名

公開鍵暗号を知らないとS/MIME(およびPGP)が何をやっているのか訳がわからないので、
ここでは公開鍵暗号について説明します。知っている人はここは読み飛ばして
構いません。

まず@dfn{対称鍵暗号}(または@dfn{秘密鍵暗号})について説明します。
これはいわゆる普通の暗号で、メッセージの送信者と受信者が共通の鍵を予め持ち、
送信者は鍵を使ってメッセージから暗号文を作って受信者に送り、
受信者は鍵を使って暗号文を解読します。
対称鍵暗号の特徴として暗号化するメッセージが長くなっても暗号化および
解読にかかる手間がそれほど増えないという長所があります。
また予め鍵の共有を行わないと通信できないので、
どうやって鍵の共有を行うのかということが問題になります。

これに対し@dfn{公開鍵暗号}とは暗号化に使う鍵と解読につかう鍵が違う暗号方式です。
送信者は予め受信者の@dfn{公開鍵}と呼ばれるデータを用意してメッセージを公開鍵を
使って暗号化します。受信者は公開鍵に対応する@dfn{秘密鍵}というデータを使って
受け取った暗号文を解読します。このとき公開鍵は名前が示す通り公開しても
構いませんが、秘密鍵は受信者以外の人に知られないようにする必要が
あります。また対称鍵暗号と違いメッセージが長くなると暗号化および
解読にかかる時間がどんどん長くなるので、実用上長いメッセージを
公開鍵暗号で暗号化することはできません。実際には送りたいメッセージを
対称鍵暗号で暗号化して暗号化に使った鍵を公開鍵暗号で暗号化して一緒に
送ります。

狭い意味での暗号ではないが重要な暗号的手法として電子署名と呼ばれる概念
があります。これはメッセージを送ったときに

@itemize @bullet
@item そのメッセージが途中で書き換えられたかどうか
@item そのメッセージの送信者は本当にその人か
@end itemize

@noindent
ということを間違いなく調べる手段です。
これは以下のような方法で行います。

@c XXX @enumerateを使うとエラーになる
@itemize
@item 送信者の公開鍵と秘密鍵と呼ばれるデータを用意する。

@item なんらかの方法で送信者の公開鍵を受信者に渡す。
@anchor{どうやって信頼するのか}
ここで送信者の公開鍵を何も考えずに受信者に電子メールで送ると
そのメールは本当に送信者が送ったものかどうかよくわからないので、
堂々巡りになります。この問題のPGPとS/MIMEに於ける
解決法は@ref{メールに於ける電子署名の仕組み}で説明します。

@item 送信者は送信するデータと秘密鍵から特定の手順に従って
@dfn{電子署名}と呼ばれるデータを計算し、メッセージと電子署名を送る。

@item 受信者は受け取ったメッセージと電子署名と公開鍵からある計算を行って
「OK」または「NG」という結果を出す。OKが出た場合非常に高い確率で
電子署名は公開鍵に対応する秘密鍵とメッセージから計算されたことが
保障される。このことからメッセージが途中で改変されておらず、
送信者が受信者の公開鍵に対応する秘密鍵の所有者であることがわかる。
@end itemize

RSAやElGamalなどの良く使われる手法はここでいう公開鍵暗号と電子署名の
両方の機能を含んだものですが、公開鍵暗号と電子署名は独立した概念で、
電子署名できない公開鍵暗号やその逆も存在します。

@node メールに於ける電子署名の仕組み, S/MIME機能の使い方, 公開鍵暗号とは何か, Top
@chapter メールに於ける電子署名の目的と仕組み
@cindex ルート証明機関
@cindex 中間証明機関

@ref{どうやって信頼するのか}で述べたように、電子署名では結局
秘密鍵の持ち主と公開鍵の対応をどうやって信じるかということが問題になります。
PGPとS/MIMEではこの問題に対する解決方法が違います。

@itemize @bullet
@item PGPでは既に信用している人から電子署名付でまだ公開鍵を持っていない
人の公開鍵を受け取った場合、受け取った公開鍵とその持ち主の対応関係を
信じていいと判断します。
@item S/MIMEでは最初に信用できる@dfn{ルート証明機関}と呼ばれるものの公開鍵
をメールリーダーに組み込んで出荷します。ある人または組織が公開鍵を
他の人に送ってその公開鍵を使って欲しい場合、公開鍵とその人の識別情報
(名前やメールアドレス)の組をルート証明機関の秘密鍵で電子署名してもらいます。
このときルート証明機関は「公開鍵、識別情報、ルート証明機関の電子署名」の組を
識別情報で識別される個人または組織に確実に届けるようにします。

「公開鍵、識別情報、ルート証明機関の電子署名」の組を受け取った場合、
そのルート証明機関がちゃんと仕事していると信じられるなら、
公開鍵に対応する秘密鍵は識別情報で示される個人だけが知っていると信じられます。
@end itemize

このように信用のモデルが違うので、PGPとS/MIMEでは電子署名の送り方も違います。
PGPでは@ref{公開鍵暗号とは何か}で述べたように普通に電子署名をして送るだけです。
ただし、自分の公開鍵を持っていない人に電子署名付のメッセージを送る場合、
受信者がどうやって自分の公開鍵と自分自身の対応関係を信じるのか、
という問題が残ります。

S/MIMEでは狭い意味での電子署名の他に「公開鍵、識別情報、ルート証明機関の電子署名」もメッセージと一緒に送ります。
このためルート証明機関を受信者が信頼していれば今までメールのやりとりを
したことが無い人に電子署名付きのメッセージを送ってもその受信者は
電子署名の検証ができます。

@anchor{中間証明機関}
実際には自分の公開鍵を直接ルート証明機関の秘密鍵
で署名するわけではなく、ルート証明機関が@dfn{中間証明機関}と呼ばれる組織の
公開鍵を証明し、自分の公開鍵は中間証明機関の秘密鍵で証明される、
という形で運用が行われることがよくあります。
大手のルート証明機関のVeriSignが発行する2ヵ月使えるお試し用の無料の
公開鍵(と秘密鍵の組)はこのように署名されています。
このように発行された秘密鍵で署名するときには電子署名に中間証明機関の
公開鍵も含めないと署名の鎖を辿れません。

@node S/MIME機能の使い方, 今後の課題, メールに於ける電子署名の仕組み, Top
@chapter S/MIME機能の使い方

@menu
* 使う為の準備::                
* 操作方法::                    
@end menu

@node 使う為の準備, 操作方法, S/MIME機能の使い方, S/MIME機能の使い方
@section 使う為の準備
@pindex openssl
@pindex /dev/urandom
@pindex rndcontrol

S/MIMEの電子署名や暗号化の実際の作業はOpenSSL 0.96を使って行っています。
OpenSSLをインストールして下さい。OpenSSLは
@uref{http://www.openssl.org/} から入手できます。
@command{openssl}コマンドがEmacsから実行できる必要がありますが、
デフォルトで@file{/usr/local/ssl}にインストールされて実行できないので、
なんとかしてください。

また@file{/dev/urandom}が利用できるOSでは乱数生成に
@file{/dev/urandom}を利用しますが、FreeBSDの場合
@command{rndcontrol}で適当な設定をしないと乱数の質が悪くなることが
あります。

@menu
* 署名の検証と暗号化メールの送信の準備::  
* 署名の付加と受信した暗号文の解読の準備::  
@end menu

@node 署名の検証と暗号化メールの送信の準備, 署名の付加と受信した暗号文の解読の準備, 使う為の準備, 使う為の準備
@subsection 署名の検証と暗号化メールの送信の準備
@pindex certbundle
@vindex mew-smime-CA-file
@vindex mew-smime-pubkey-dir

@ref{メールに於ける電子署名の仕組み}で書いたようにS/MIMEの電子署名の
検証ではルート証明機関の公開鍵が必要になります。送信者の公開鍵は
そのメールにいつも含まれているので自分で用意する必要はありません。

ルート証明機関の公開鍵は

@noindent
@uref{ftp://ftp.jp.freebsd.org/pub/FreeBSD/FreeBSD-current/ports/security/ca-roots/files/ca-root.crt}

@noindent
から得られます。この公開鍵はNetscape 4.7の@file{~/.netscape/cert7.db}を
@uref{ftp://ftp.modssl.org/contrib/} にある certbundle というツールで
OpenSSL が扱える形式に変換して、いくつかの公開鍵を追加したもののようです。
このルート証明機関の公開鍵の絶対パス名を
Emacsの変数@samp{mew-smime-CA-file}に設定して下さい。

@strong{VeriSign などの大手のルート証明機関は公開鍵を公開していないようです。}

暗号化してメールを誰かに送る場合受信者の公開鍵が必要になります。
MewのS/MIMEサポート機能では、
電子署名に含まれる送信者の公開鍵を信用できる場合
@samp{mew-smime-pubkey-dir}で指定されるディレクトリに保存します。
電子署名の検証を行う場合かならず@samp{mew-smime-pubkey-dir}に
ディレクトリ名を設定してください。

@node 署名の付加と受信した暗号文の解読の準備,  , 署名の検証と暗号化メールの送信の準備, 使う為の準備
@subsection 署名の付加と受信した暗号文の解読の準備
@cindex ディジタルID
@pindex openssl
@vindex mew-smime-digital-id
@vindex mew-smime-additional-certificates

この節の作業を行わなくても電子署名の検証はできます。
@ref{メールに於ける電子署名の仕組み}で書いたようにS/MIMEの電子署名の付加では
自分の秘密鍵とルート証明機関または中間証明機関(@pxref{中間証明機関})に署名
された公開鍵が必要です。秘密鍵と署名された公開鍵の組を@dfn{ディジタルID}と
Internet ExplorerやNetscapeでは呼んでいますが、ディジタルIDを発行してくれる
機関は以下のホームページから辿れます。

@itemize @bullet
@item @uref{https://certs.netscape.com/client.html}

@item @uref{http://www.microsoft.com/windows/ie_intl/ja/oe/certpage.asp}

@end itemize

いつも使っているWebブラウザーでディジタルIDを使用できる状態にしてください。
その状態で
@uref{http://digitalid.verisign.co.jp/client/help/brw_operation.html#name1}
に書いてある手順に従って、ディジタルIDをファイルに書き出して下さい。
Internet Explorer 5.5などでは「証明のパスにある証明書を可能であれば
すべて含む」というチェックボックスがありますが、ONにしてください。
このときできたファイルを@file{id.p12}とします。

@file{id.p12}はそのままではOpenSSLで扱えるPEM形式ではないので、
変換します。

@example
openssl pkcs12 -clcerts -in id.p12 -out id.pem
@end example

@noindent
とするとディジタルIDの中の自分の秘密鍵と署名された自分の公開鍵が
@file{id.pem}に書き出されます。このファイルの絶対パス名を
Emacsの変数@samp{mew-smime-digital-id}に設定して下さい。

また@ref{中間証明機関}で述べたように自分の公開鍵がルート証明機関でなく
中間証明機関によって署名されている場合、送信するメールの電子署名に
中間証明機関の公開鍵も含めないと受信者が電子署名の検証をできません。

@example
openssl pkcs12 -nokeys -cacerts -in id.p12 -out issuing-CA.pem
@end example

とすると@file{id.p12}の中の証明機関の公開鍵を@file{issuing-CA.pem}にPEM
形式で書き出します。@file{issuing-CA.pem}の絶対パス名を
Emacsの変数@samp{mew-smime-additional-certificates}に設定して下さい。
これで電子署名を付加するための準備は終りです。

暗号化したメールを誰かに送信するときは、受信者の公開鍵が必要です。
その人から既に電子署名された
メールを受け取ったことがあれば、そのときに@samp{mew-smime-pubkey-dir}
で示されるディレクトリに公開鍵を保存しています。
受信者の公開鍵を持っていれば自動的にそれを使って暗号化をします。
公開鍵には有効期限がありますが、有効期限が切れたあと新しい公開鍵を受け取った
場合は@samp{mew-smime-pubkey-dir}にある古い公開鍵のファイルを削除して、
その後最新の公開鍵を含むメールの電子署名を検証してください。
電子署名の検証を行うときに、@samp{mew-smime-pubkey-dir}にすでに検証した
メールの送信者の公開鍵がある場合何もしませんが、まだ送信者の公開鍵が
@samp{mew-smime-pubkey-dir}に保存されていない場合保存しようとします。

@node 操作方法,  , 使う為の準備, S/MIME機能の使い方
@section 操作方法

S/MIMEの操作方法はPGPになるべく似せて作ってあります。
しかし今のところメール全体への署名暗号化しかサポートしておらず、
マルチパートの一部分に署名したりすることはできません(と思う。やったらできるかも?)。

秘密鍵が必要になるときには必ずパスワードを聞かれますが、一々パスワードを
入力するのが面倒な場合Mew本体のinfoの中の
@c 次の行の@refの終りの}の次にあるカンマが無いとInfoがノード名の終りを認識しない
@ref{folder, フォルダの更新と移動, フォルダの更新と移動, mew.jis.info, Mew},
に書いてある方法でパスワードをしばらく保存できます。

@menu
* 署名付きメールおよび暗号化メールの送り方::  
* 電子署名の検証と暗号文の解読のやり方::  
@end menu

@node 署名付きメールおよび暗号化メールの送り方, 電子署名の検証と暗号文の解読のやり方, 操作方法, 操作方法
@subsection 署名付きメールおよび暗号化メールの送り方
@findex mew-smime-sign-message
@findex mew-smime-encrypt-message
@findex mew-smime-sign-encrypt-message
@findex mew-smime-encrypt-sign-message
@vindex mew-smime-encryption-algorithm
@vindex mew-protect-privacy-always
@vindex mew-protect-privacy-always-type

PGPと同様にドラフトモードでメッセージを書いた後
(またはマルチパートのメッセージを書いた後)

@itemize
@item mew-smime-sign-message
@item mew-smime-encrypt-message
@item mew-smime-sign-encrypt-message
@item mew-smime-encrypt-sign-message
@end itemize

@noindent
というコマンドを実行すると署名したり暗号化したりできます。

暗号化に使うアルゴリズムは変数@samp{mew-smime-encryption-algorithm}で設定でき
ます。どのようなアルゴリズムが使えるかはopensslのマニュアルページを見
て下さい。


メッセージに常に電子署名を施したい場合PGPのときと同じように

@example
(setq mew-protect-privacy-always t)
(setq mew-protect-privacy-always-type 'smime-signature)
@end example

@noindent
とします。

@node 電子署名の検証と暗号文の解読のやり方,  , 署名付きメールおよび暗号化メールの送り方, 操作方法
@subsection 電子署名の検証と暗号文の解読のやり方

電子署名の検証と暗号文の解読は自動的に行われますが、
秘密鍵のパスワードを聞かれるので入力して下さい。
電子署名検証の結果と暗号文が解読されたことは
PGPと同様に@code{X-Mew}欄に表示されます。

@node 今後の課題, 索引, S/MIME機能の使い方, Top
@chapter 今後の課題
@cindex CRL
@cindex certificate revocation list
@cindex ディジタルID取り消しリスト

秘密鍵と証明機関に署名された公開鍵の組(ディジタルID)は何らかの理由で無効に
されることがあります(例えば使用者が秘密鍵を漏らしたとか)。
このような場合に対応するために証明機関は@dfn{CRL} (certificate revocation list,
ディジタルID取り消しリスト)を定期的に発行しています。

S/MIMEの電子署名の中に含まれる送信者の公開鍵の中には
その公開鍵に対応するCRLをどこから取り寄せればいいか書いてあります。
電子署名の検証の際CRLを取り寄せてそこに送信者の公開鍵が載っていないか
確認するのが望ましいですが、現在はCRLの確認は実装できていません。

また電子署名の中に、その人に暗号文などを送る時に使う暗号方式でどれが望ましいか
書いてあることがあります。そのような情報を現在無視しています。

この文書の英語版を作る必要があると思います。

この文書をもう少しわかりやすくする必要があります。

@node 索引,  , 今後の課題, Top
@chapter 索引

@printindex cp

@printindex vr

@printindex fn

@printindex pg

@bye


Mew-dist メーリングリストの案内