E-mailに署名したり暗号化したりしてみた

昨日、E-mailのこととやかく書いてて思いだしたのだが、StartSSLでS/MIMEの証明書出せるよねって。

StartSSLはLibserverでHTTPSなどSSLでセキュアな通信を行うために必要な証明書を取得しているサービス。

(参考 : オレオレじゃないSSL証明書を作りにいった)

ここでS/MIMEの証明書を作ったら署名や暗号化ができそうだ。というわけでやってみた。


というわけでログイン。ここに書いているとおり個人用証明書を使ってログインするのでインポートしてと、

あれ? ログインできん。有効期限切れらしい。どうすりゃいいのかFAQを見てみたが、どうももう一度登録し直せみたいなことが出てきた。

そんなんでいいのかと思いつつ同じ手順で登録したら問題なく使えそうだ。

さて、ここで本題のS/MIME証明書を出そう、と思ったらあれ? 出ない。

ちょっと調べてみて気付いたのだが、実は最初に発行された個人用証明書がS/MIME用の証明書だったらしい。そりゃ気付かんかった。

他のメールアドレスの証明書が欲しければ、E-mail Validationしてから作ればよい。

ちなみにこの証明書は1年で有効期限が切れる。なのでS/MIMEにこの証明書を使ってる人も使ってない人も1年経つまでには改めて証明書を作り直す必要がある。

もっともここで書いた通り登録の手順を改めて行えばあまり問題は無いのだけどね。

ここで作られた証明書はWebブラウザに登録されているが、エクスポートしてThunderbirdに追加した。


ところでS/MIMEとは何かという話だが、E-mailの暗号化・署名を行う仕組みである。

ここで秘密鍵と公開鍵という言葉が出てくるが、これはSSLやSSHなどで使われているRSA暗号で使われる鍵のことだ。

RSA暗号では公開鍵で暗号化したものは秘密鍵で、秘密鍵で暗号化したものは公開鍵で復号できる。

秘密鍵と公開鍵は違うもので、公開鍵から秘密鍵は作るのは多分無理なので、公開鍵は公開できる。

よって、公開鍵で復号できれば本人が暗号化したものなのは間違えないし、公開鍵で暗号化すれば本人以外には読めない。

ただ、違う人の公開鍵をその人のものだと思って使ってしまうと全く信用できないものになってしまう。

そこで確かにその人の公開鍵だよと認証局に署名してもらえれば安心して使ってもらえる。この署名にもRSA暗号を使っている。

StartSSLはそのための署名を無料で行ってくれる機関なわけだ。そして、これは確かにhdmr.orgの公開鍵だよとか示してもらっている。

これをブラウザなどで認証局証明書を使って確かめて安心して通信できるよとブラウザは示しているわけだ。

こうして得られた秘密鍵と鍵を作った人の情報と署名でできているのが証明書ですね。

証明書のレベルもいろいろで単にドメインとかE-mailアドレスだけ証明する低級なものから、その個人や法人が実在することまで証明するものまでいろいろ。

StartSSLで無料で作れる証明書は単にドメインとかE-mailアドレスを証明するだけ。けどそれだけあれば最低限信用できる。


S/MIMEの署名とは差出人が出してから改ざんされていないことを示すこと、暗号化とは受信者以外には読めないようにすることだ。

署名はE-mailの内容についてハッシュ値を取ってこれを秘密鍵で暗号化して送る。ついでに証明書もつけて送る。

そうしたら受信者はまずその証明書が信用できるか認証局証明書を使って検証して、E-mailアドレスが証明書と一致してるか確かめる。

よければそれで暗号化されたハッシュ値を公開鍵で復号して、実際に届いた内容のハッシュ値と比較して、確かめるわけだ。

これにより確かにそのE-mailアドレスの人が出したE-mailであることを確認できるわけだ。

こちらは署名を確かめられなくても内容を読むことはできる。なのでとりあえず署名して送れば役に立つこともあるかもしれない。

そんなわけで署名についてはぼちぼち使ってる人もいそう。実際、住信SBIネット銀行からのE-mailは署名されてる。

ただ、内容については途中で読まれてしまう可能性もある。そこは一般のE-mailと何ら違いはない。


一方で暗号化だが、E-mailの送信先の証明書を使って行う。

相手の証明書は署名されたメールを受け取ればついてくるし、必要ならエクスポートして渡しておけばいい。

Thunderbirdでは証明書を表示で自分の証明書を選んで、表示からエクスポートでPEM形式とかで証明書だけエクスポートできる。

相手の秘密鍵さえあれば自分は暗号鍵を持ってなくても送信できそうだが、実際には自分の証明書も必要になる。

単に自分宛のメールを暗号化してもらうだけでも送信者の証明書も必要なのは敷居が高いですね。

まぁそれはともかくこれで暗号化して送れば受信した人は自分の秘密鍵で復号できる。

誰かが傍受しても暗号化されてるから読むことはできないはず。こうして通常のE-mailにはない通信の秘密が保たれる。

あと少なくともThunderbirdでは送信者も読むことができますね。平然と送信済みトレイの中身が読めるし。当たり前といえばそうだが。

多分、送信者の公開鍵でも暗号化して送信者の秘密鍵でも復号できるようにしてるんだと。


まぁこんな風に署名と暗号化ができるわけですが、実際のところは暗号化にS/MIMEはあまり使われていないようです。

そんな需要があまりないのかどうかは知らないけれど、実際には別の仕組みがよく使われているという事情もあるようだ。

それがPGPですね。これも署名と暗号化の機能を備えている。

PGPではこの公開鍵の取扱が違いまして、認証局によらずに個人間でやりとりして信頼しようという仕組みになってる。

いい加減な気もするが限られた間で暗号化したメールをやりとりする分にはこちらの方が証明書が入らない分むしろ便利とも言えそうだ。

先にも書いたとおりS/MIMEではいちいち暗号化するにも送信者の証明書が必要だとあたりからもずいぶん暗号化の面では不便が多い。

まぁそんなわけでS/MIMEは署名向きでPGPは暗号化向きだと言われることが多い。全くその通りだと。

なお、PGPはThunderbirdでは標準では使えないもののEnigMailってアドオンを入れれば使えるので参考までに。

PGPに対応してるクライアントは少ないけど、Thunderbirdで使えればいろいろなところで使えて便利と思うのでどうぞ。