SSL


SSL

インターネット上で買物をするときに、クレジットカード の番号などを入力する場合に、ブラウザの下の方に 「鍵のしまった錠前」の絵が表示されることがあります。 これは「通信が暗号化されている」ので盗聴されても内容は洩れない、 ということを表しています。

ブラウザ暗号化なしの場合暗号化ありの場合
IE http IE https IE
netscape http netscape https netscape

この『暗号化』で使われているのが SSL (Secure Socket Layer)です。 SSLは Netscape Communications社によって開発されたもので、 TCP/IP上の通信を暗号化できます。

SSL Ver 3.0 までは Netscape Communications社で開発されましたが、 現在ではSSLの開発・管理はIETF (Internet Engineering Task Force) に移管されています。 SSLの後継となる TLS 1.0 (Transport Layer Security) は RFC2246 として標準化されています。

ちなみに、WebブラウザがSSLによる暗号通信を行う場合は 「https:」という表記でプロトコルを指定します。

SSLが実現する機能は3つあります。

公開暗号鍵には、鍵の長さを長くして暗号強度を強くすると 「データ量が増える」「計算量が増える」という特徴があります。 そこで、データの暗号化そのものは共通鍵方式で行い、 共通鍵を送るのに公開鍵暗号を使う、という方式を使っています。 また、認証は公開鍵暗号化方式で行います。 データの改竄の検出には、MAC (データをMD5, SHA1などの ハッシュ関数に通して得られる数値) を使います。

SSL2.0 SSL3.0
鍵の交換 公開鍵暗号 (RSA) 公開鍵暗号(RSA,DH,Fortezza)
認証 公開鍵暗号 (RSA) 公開鍵暗号(RSA,DSS/DSA)
データの暗号化 共通鍵暗号 (RC4, RC2, DES, Triple-DES, IDEA) 共通鍵暗号 (RC4, RC2, DES, Triple-DES)
メッセージ認証 ハッシュ関数 (MD5) ハッシュ関数 (SHA1, MD5)

ポート番号

アプリケーション プロトコル名
(サービス名)
ポート番号
WWW http 80
https 443
POP pop3 110
pop3s 995

SSLの仕組み

SSLにおける通信の手順は以下のようになります。

  1. クライアントは、自分の理解できる 「共通鍵方式の暗号化アルゴリズムの一覧」をサーバに送ります。
  2. サーバは、クライアントから送られてきた暗号化アルゴリズムの うちで「自分が理解できる最も強度の強い暗号化アルゴリズム」 を探して、クライアントに伝えます。
  3. 使用する暗号化アルゴリズムが決まったので、クライアントは共通鍵を自動生成します。
  4. クライアントは生成した共通鍵をサーバの公開鍵で暗号化し、サーバに送ります。
  5. サーバは送られてきた暗号化された共通鍵を、自分だけが知っている秘密鍵で復号化します。
  6. サーバは「サーバ証明書」をクライアントに送付します。
  7. これはオプションです→クライアントは「クライアント証明書」をサーバに通知します。
  8. これ以後、サーバとクライアントは、全てのデータを共通鍵で暗号化して相手に送ります。

デジタル署名とデータ認証

「デジタル署名」は「情報の同一性」を保証します。 すなわち、「偽造された情報ではない」ことを示すことが できます。

デジタル署名

  1. 送信者は、ハッシュ関数を使ってデータから『ダイジェスト』 と呼ばれる「適度な大きさのデータ」を生成します。 『ダイジェスト』は『ハッシュ値』や『フィンガープリント』 と呼ばれることがあります。 元のデータが1ビットでも変化すると、『ダイジェスト』も全く 異なる値となるようにハッシュ関数が選ばれています。
  2. 送信者は『ダイジェスト』を自分の秘密鍵で暗号化し、 もとのデータに付加して送ります。
  3. 受信者はハッシュ関数を使って「受信したデータ」の ダイジェストを計算します。
  4. 受信者は送信者の公開鍵を使って「データに付加されている ダイジェスト」を復号化します。
  5. 「データに付加されていたダイジェスト」と 「自分で計算したダイジェスト」を比較して、 もし同じであればデータは改竄されていないと判断します。

上記ではデータが改竄されていないことはわかりますが、本人である ことの証明はどうやればいいのでしょうか? たとえば 「インターネット上の存在であるwww.tsuda.ac.jp が、 現実世界の『津田塾大学』と関係がある」ことをどうやって 示せばいいのでしょうか。 そのためには認証局(CA, Certificate Authority)を使います。

たとえば、 インターネット上で商取り引きを行うサーバを運用する場合、 そのサーバがいい加減なものではないことをクライアントに 納得してもらう必要があります。 信用できない WWW サーバにクレジットカードの番号を打ち込んで もらえるわけがありませんから。 したがって、そのような信用が必要なサーバを運用する組織は、 認証局に『サーバ証明書』を発行してもらいます。 認証局は、以下の手順で『証明書 (certificates)』を発行します。

  1. 申請のあった組織を調べて、
  2. その組織の公開鍵と関連情報を一定のフォーマット(たとえば X.509形式) で表し、
  3. 認証局のディジタル署名を付加して証明書とします。 すなわち、
    1. ハッシュ関数を使って証明書の内容の『ダイジェスト』を生成し、
    2. その『ダイジェスト』を認証局の秘密鍵で暗号化して
    3. 証明書に付加します。
証明書を改竄すると『ダイジェスト』の値が狂いますし、 新たに計算した『ダイジェスト』を証明書に付加しようとしても 暗号化には認証局の秘密鍵が必要です。 したがって、認証局が発行した証明書を改竄することは不可能です。

X.509証明書に含まれる情報には以下のものがあります。

インターネット上には認証局がいくつもあります。 「認証局」はさらに上位の「認証局」によって認証される 階層構造を取っています。 階層構造の下部にある認証局の証明書の正当性を 調べるためには、階層構造のトップまで認証の 依存関係をたどる必要があります。 階層構造のトップにある認証局が正しいものである ことを証明する 『ルート証明書』は、大手の認証局に関しては 一般的なWEBブラウザには既に組み込まれています。 WEBブラウザに組み込まれていない認証局からの 証明書には警告がでることがあります。

WWW閲覧中にIEが出す警告
セキュリティの警告:
このサイトと取り交わす情報は、ほかの人から読み取られたり変更されたり
することはありません。しかし、このサイトのセキュリティ証明書には問題が
あります。
このセキュリティ証明書は、信頼する会社から発行されていません。
証明書を表示して、この証明機関を信頼するかどうか決定して下さい。
続行しますか?
        はい(Y)        いいえ(N)        証明書の表示(V)

安全性について

WWWサイトとの通信にSSLを使っているからといって 油断してはいけません。 確かにSSLを使えばネットワーク上は暗号化してデータが 流れますが、WWWサーバ上ではデータは復号化され、 おそらくデータは平文としてファイルに保存されることでしょう。 そのWWWサーバが侵入されると、クレジットカード番号などの 個人情報が洩れる危険性があります。

セキュリティはシステム全体で考えることが大切です。 システムの一部だけのセキュリティ・レベルを上げても、 必ず一番弱い部分を攻撃されることになります。


自分のWWWサーバをhttps化する

Let's Encrypt: Free, Automatic, Open Certificate 無料のSSL証明書

詳細はこちら