2008年1月27日日曜日

今更ながらSSL(1.概要)

今更ですがSSLについて勉強します。
外向けECサイトを構築するエンジニアにとっては当たり前の知識かもしれませんが、イントラ向けシステムを構築する人にとってはあまり縁がない機能です。かく言う私もあまりSSLを理解しているとは言えません。
CMでSSLを利用しているということもあり、今回はSSLについて、学んでみます。

※勉強に際しては、主にWikipediaの公開鍵暗号を参考にしました。非常に優れた説明です。

1 SSLとは?
通信を暗号化し、当事者以外には通信内容を分からなくする仕組みです。

1.1 暗号化って具体的にはどんな感じ?
双方で内容を暗号化/復号化する鍵を持ちます。
(i) データを送るときは暗号化して送ります。
(ii)受け取った内容は暗号化されているので、鍵で復号化して読みます。
(i)と(ii)の繰り返しです。

1.2 なあんだ。簡単じゃないか。
限られた友人やチーム内でやり取りするのならば、暗号化も簡単な話でしょう。例えばZIPファイルの暗号化を使えば、普段使いレベルの秘密は保てます。
しかしインターネットは違います。不特定多数の人とやり取りすることになりますから、最初に鍵をいかにして安全に配るかが課題となります。

1.3 どういうこと?
不特定多数のユーザーと、共通鍵暗号(お互いに共通の鍵を持ってやり取りする方法)で通信する実装を考えてみましょう。仮にサーバをXとして、ブラウザをAとします。
最初にAからリクエストが飛んできます。サーバXはランダムに鍵を生成して、Aに送付します。以降、Xは生成された鍵をA用の共通鍵として使い、AはXから貰った鍵をX用の共通鍵として使います。

1.3.1 問題なさそうだけど?
インターネットは基本的には平文が飛び交う世界です。そしてお互いのもとにたどり着くまでは、さまざまな見知らぬサーバ/ネットワーク機器を経由します。要するに全ての通信は途中のサーバ管理者から丸見えです。当然Xが生成した最初の鍵も簡単に見られてしまいます。

1.3.2 本当?
本当です。サーバ上でネットワークトラフィックをダンプすれば、全部見えます。

1.3.2.1 杞憂じゃないの?
杞憂ではありません。

1.3.2.2 そんなの割り切っちゃえば?
あなたのパスワードやらクレジットカード番号が丸見えでもいいんですか?

1.3.2.3 それはいやだな。
でしょう。

1.3.3 じゃあどうやって最初の鍵を配るの?
公開鍵というものを使います。

1.4 公開鍵って?
暗号化する手順を公開します。復号化出来るのは、その暗号化手順を作った人だけです。
Aさんは公開されている暗号化手順で通信を暗号化します。それを復号化できるのはその暗号化手順を作った人だけです。つまり、公開鍵を使って最初の通信メッセージを暗号化すれば、そのメッセージは、Xにしか復号化できません。だから最初のメッセージから安全にやりとりできるわけです。

1.5 暗号化する手順が分かれば、復号できるんじゃないの?
それが非常に難しいんだそうです。

1.5.1 どうなってるの?
詳しい話は私にも分かりません。素因数分解とか、そういう話のようです。詳しくはWikipediaなどを調べてください。

1.5.2 よく分からない。面倒くさい。
同感です。まあ、その辺は隠蔽されているので、知らなくてもSSLは設定できます。

1.5.3 それはよかった。
はい。

1.6 じゃあ秘密鍵と公開鍵を持てばSSL通信できるわけね。
いえ。まだ足りません。公開鍵が本当に通信したい相手のものかどうかを、知るすべが必要です。

1.6.1 どうして。
Aさんがインターネット書店サイト'ほんもの書店.com'から本を買うとします。'ほんもの書店.com'はネット通販のためにSSLに対応しています。Aさんはある日通販リンク集サイトの'あやしいリンク集'(実はイカサマサイト)を辿って'ほんもの書店.com'へのリンクをクリックしました。
実は、この'あやしいリンク集'経由で訪れたページは、すべてこの'リンク集'が設置されたサーバ(Yとしましょう)経由で通信されるように仕組まれていたのです。するとYはAさんに対して偽の公開鍵を発行することが可能になってしまいます。
Aさんは暗号化が行われていると信じて、クレジットカード番号と住所を打ち込むのですが、その情報は全てYに筒抜けとなるのです。
その流れを表すと、以下の流れになります。
i.   'ほんもの書店.com' → 公開鍵X →  'Y' (公開鍵XをYと差替え) → 公開鍵Y → 'Aさん'
ii. 'Aさん'(公開鍵Yで情報[共通鍵Z]を暗号化) → Y暗号 → 
   → 'Y'(Y暗号を解読。公開鍵Xで再度暗号化) → X暗号 → 'ほんもの書店.com'
iii. 'ほんもの書店.com'(クライアントから送られた共通鍵Zで暗号化) → Z暗号 →
   → 'Y'(Z暗号は既に知っているので読み取り可能) → Z暗号 → 'Aさん'

1.6.1.1 何となく分かった。でもこんな面倒くさいこと誰がするの?
面倒臭くありません。優れたプログラマなら下手をすれば数日で作っちゃいますよ。

1.6.1.2 ハッカーってやつね。
クラッカーです。ハッカーは意味が違います。(という主張も最近は聞かなくなったな)

1.6.1.3 何を言ってる?
もういいです。

1.7 どうやってある公開鍵が目的のサイトのものだと分かる?
Verisign Inc.などの第三者機関が公開鍵の証明書を発行します。
ある公開鍵がどのサイトに対して有効なものか、信頼できる第三者機関が保証してくれるわけです。

1.8 証明書?
公開鍵とあわせて証明書をクライアント(ブラウザ)に提示します。証明書には第三者機関による電子署名が入っていて、証明書の偽造を防ぎます。
ブラウザは証明書とサイトのアドレスをチェックして、目的のサイトの公開鍵かどうかをチェックすることができます。

1.8.1 SSLを使えば絶対安全なの?
そうとも言えません。
SSLで暗号化できても、その向こうにいるのはやはり人間だ、ということです。
技術的な安全性については、詳しくはWikipediaのSecure Sockets Layerを見て下さい。

1.8.2 ネットショッピングが怖くなってきた
普通に有名なサイトを利用している分には大丈夫でしょう。多分・・・

1.8.3 何かつかれてきた
私もです。

1.8.4 もう終わりにしたい
私もです。

1.8.5 まとめて
結論です。SSLを構成するのに必要なのは以下の2つです。
-公開鍵/暗号鍵
-公開鍵証明書
※外部に公開したサーバであれば、証明書は第三者機関に依頼することになります。
以上がまとめです。

1.9 (1/31追記)ちょっと待った。1.6.1の例では第三者の証明書は役に立たないじゃないか
どうしてですか。

1.9.1 中間サーバのYが正規の証明書を取ってしまえばいい
あ。

1.9.2 どうだ
くやしい。

1.9.3 ということは、証明書があるからと言って安心してはだめだ、というのが結論だな
ま、そういうことですね。

0 件のコメント: