SSLハンドシェイクの仕組み

前回(デジタル証明書の中身について)に引き続き、今回はSSLハンドシェイクについて書いていく。まず、SSLハンドシェイクのポイントは以下の2点。

  • 1.クライアントはサーバ証明書によってサーバを認証する。
  • 2.安全度の高い非対称鍵暗号方式を使っているが、それはハンドシェイク時だけ。その後は負荷の低い共有鍵を使用する。共通鍵を非対称鍵暗号方式で交換するため、安全性を維持しながら負荷を低減している。

クライアント認証

SSLでは、サーバがクライアントを認証する「クライアント認証」も可能。この場合、クライアントは自分の証明書である「クライアント証明書」をサーバに提示し、サーバとクライアントが相互に認証手続きを実施する。機密性の高い社内システムやメンバ専用サイト、リモーとアクセスなどで利用されている。実利用例としては、クライアント証明書をUSBキーやICカードに格納し、これをPCに接続しているときだけ通信可能となるシステムなどが普及している。

ハンドシェイクの手続き

  • 1.クライアントからのリクエス
    • ブラウザで、https://******にアクセス。サーバのTCP 443番ポートにリクエストが送られる。
  • 2.サーバ認証
    • TCPポート443番でリクエストを受けたSSL対応Webサーバは、べリサインなどの認証機関が署名した自分のサーバ証明書をクライアントにレスポンスする。一方クライアント側では、ブラウザが自分が持っている認証機関のルート証明書の公開鍵を使い送られたサーバ証明書の署名を復号化し、証明書を検証する。
  • 3.共通鍵の交換
    • クライアント側では、このセッションで使用する共通鍵を作り、サーバ証明書の中のサーバの公開鍵を使い暗号化し、サーバに送る。これを受けて、サーバ側では自分が持っている秘密鍵でクライアントから送られてきた共通鍵を復号化する。ここでポイントとなるのは、「クライアントが暗号化した共通鍵を復号化できるのは秘密鍵を持っているサーバのみである」ということ。そして、この処理が非常に重い処理となっている。
  • 4.コンテンツ交換
    • 交換できた共通鍵を使い、サーバはクライアントからリクエストされたデータを送信する。クライアントは、受け取ったレスポンスを共通鍵を使い復号化する。さらにリクエストがあれば、共通鍵を再利用しリクエストを行う。

SSLの負荷

前述の手順1.〜3.はSSLのセッションを確立する作業だが、これを特にSSLのハンドシェイクと呼ぶ。SSLハンドシェイクは非対称鍵暗号処理を含むため、CPUに非常大きな負荷がかかる。手順4.の共通鍵による暗号化/復号化はハンドシェイクに比べると負荷は小さく済むのが特徴。とはいえ、平文(HTTP)に比べればはるかに大きな負荷がかかる。それなりの規模のシステムであれば、一般的にはSSLの処理はWebサーバではなく、その前段のSSLアクセラレータ(通常はロードバランサ)で行う場合が多い。