HTTPSのお勉強

どうも用語が散乱してて、分かりにくかった。
公開鍵、秘密鍵、共通鍵、サーバー証明書認証局、その他もろもろ。
1つにつなげてみたい。

HTTPSとは

HTTPSとは、SSLという公開鍵暗号方式PKI)でサーバー/クライアント間の通信内容を暗号化する通信方式のこと。
または、SSLという公開鍵暗号方式PKIと共通鍵でサーバー/クライアント間の通信内容を暗号化する通信方式のこと。
後者だと思うけど、はっきりそうだと言っている文章が見つからない。

SSLによる暗号化通信

  1. サーバー側にSSLの公開鍵と秘密鍵を置く
  2. サーバーはクライアントに公開鍵を送る
  3. クライアントは送信内容を公開鍵で暗号化する
  4. サーバーはクライアントからの送信内容を秘密鍵で復号化する

これで片方向、つまりクライアントからサーバーへの送信内容を暗号化できる。
サーバーからクライアントへの送信内容は暗号化できない。
なぜなら、公開鍵は誰でも手に入れられるから、いくらサーバーが秘密鍵で暗号化したところで誰でも復号できてしまうし、サーバーが公開鍵で暗号化したって、サーバー以外に誰も復号できなくて、意味がない。

双方向、つまりサーバーからクライアントへの送信内容暗号化するには、共通鍵も使う必要がある。(クライアントも公開鍵と秘密鍵を作って、公開鍵を送ったらいいようなもんだけど、そういうことはあまりしない様子)
それは次のように行なわれる。

  1. サーバー側にSSLの公開鍵と秘密鍵を置く
  2. サーバーはクライアントに公開鍵を送る
  3. クライアントは共通鍵を作る
  4. クライアントは共通鍵を公開鍵で暗号化する
  5. サーバーはクライアントから送られた共通鍵秘密鍵で復号化する
  6. これ以降、サーバーとクライアントは送信内容を共通鍵で暗号化し、受信内容を共通鍵で復号化する

共通鍵を使う理由として、よく「秘密鍵での復号化は負荷が高いので、負荷の低い共通鍵で通信する」と言われているが、共通鍵はなにもそれだけのために使うわけじゃなくて、共通鍵によって初めて双方向の送信内容を暗号化できるようになる。それが書いていない文章があって、とても混乱した。だって、それじゃあ、僕の口座を表示した瞬間残高がダダ漏れってことになる。

実在証明のためにSSLを利用する

ここから、暗号の話というよりは、社会的な信頼関係の話になる。

通信内容を内緒にするには、あれでよかった。
でも、通信先のサーバーが信用できるとは限らない。よく似せられたフィッシングサイトかもしれない。
そこで、SSLを使って、そのサーバーが信用できる主体に運営されているか確かめるための仕組みができた。これが実在証明といわれている。

実在証明にはサーバー証明書を使う。
サーバー証明書は、サーバーの公開鍵のメッセージダイジェストとサーバー運営者の情報に認証局が署名したものといわれているが、認証局とは?署名とは?

認証局は、要するになんだか知らないけど、とてつもなく信用できるすっごい主体のこと。ベリサインとか、そういうの。国営もありえる。
署名は、要するに暗号化のこと。いきなり署名とか言われても困る。

認証局は自分用のSSL公開鍵/秘密鍵を持っていて、我々を信用するにふさわしい人物/組織なのか審査したうえで問題なければ、我々のサーバーの公開鍵のメッセージダイジェスト我々の情報をまとめて認証局秘密鍵で暗号化してくれる。この暗号化でできたファイルがサーバー証明書だ。
三者サーバー証明書が渡らない限り、すっごく信用できる認証局の公開鍵で復号したメッセージダイジェストと同じメッセージダイジェストの公開鍵を持っているサーバーは信用していいことにするという仮定が実在証明ということみたい。
ちまたのブラウザには認証局の公開鍵(よく認証局証明書とか言われる)が初めから組み込まれていて、いちいち探さなくていい。

本当は誰でも認証局になれるし、その認証局の公開鍵をあとからブラウザにインストールすることもできるけど、おれが認証局だ!と言ったところで、信用してもらえるかどうかはまた別の話。

実在証明の手続きをまとめると、次のようになる。

  1. サーバー運営者は、SSLの公開鍵と秘密鍵を用意する
  2. サーバー運営者は認証局公開鍵のメッセージダイジェストとサーバー運営者の情報(個人情報とか会社情報)を預けて、自分を審査するように頼む
  3. 認証局はサーバー運営者が信用するにふさわしい人物/組織なのか審査して、問題なければ次に進む
  4. 認証局サーバーの運営者から預かった公開鍵のメッセージダイジェストとサーバー運営者の情報をまとめて認証局秘密鍵で暗号化して、サーバー証明書にする。
  5. 認証局は、サーバー証明書すっごく厳重な郵便かなにかでサーバー運営者に渡す
  6. サーバー運営者は、サーバーにサーバー証明書と公開鍵と秘密鍵を置く
  7. クライアントがサーバーにアクセスする
  8. サーバーはクライアントにサーバー証明書と公開鍵を送る
  9. クライアントはサーバーの公開鍵のメッセージダイジェストを作る
  10. クライアントはあらかじめ持っていた認証局の公開鍵サーバー証明書を復号する
  11. サーバー証明書を復号して得たメッセージダイジェストが、サーバーから送られてきた公開鍵で作ったメッセージダイジェストと一致すれば、クライアントはそのサーバーを信用していいと判断する

あとはSSLによる暗号化通信だ。

  1. クライアントは共通鍵を作る
  2. クライアントはサーバーの公開鍵で共通鍵を暗号化して、サーバーに送る
  3. サーバーは共通鍵を秘密鍵で復号する
  4. 以降、共通鍵で双方向の暗号化通信をする

というわけで、HTTPSというか、むしろSSLのお勉強をした。
SSLは通信の暗号化と、実在証明に使われているのだった。