HTTPS

HTTPS

  • 暗号化

  • 認証

  • 完全性保護

  • 公開鍵暗号方式

  • SSLでは、公開鍵暗号方式が採用されている

  • 公開鍵暗号では2つの鍵(公開鍵、秘密鍵)を用いる

  • 公開鍵は暗号化するための鍵

  • 秘密鍵は暗号化を解くための鍵

  • 秘密鍵と公開鍵はどちらか一方を手に入れても、もう一方の鍵を求めることはできない

  • クライアントは、公開鍵を使ってデータを暗号化する

  • サーバーは、秘密鍵を使ってデータを復号化する

  • 認証機関

  • 公開鍵暗号方式の問題点:公開鍵が本物かどうかを証明できないということ

  • 公開鍵の発行元の信頼を保証するために、認証機関(CA : Certificate Authority)が利用される

  • 認証機関は、クライアント、サーバーが双方ともに信頼する第三者機関が行う(Verisign社など)


  • 認証機関の利用
  • 1.サーバーの運営者が認証機関に公開鍵を提出する

  • 2.認証機関はその提出された公開鍵に対してデジタル署名を施して、署名済み公開鍵を作る

  • 3.署名済み公開鍵はデジタル証明書に収められる

  • 4.サーバーは、この証明機関によって作成されたデジタル証明書をクライアント送って、公開鍵暗号化方式で通信を行う

  • デジタル証明書を受け取ったクライアントは、その認証機関の公開鍵を知っているので、サーバーの公開鍵を認証したのが本物の認証機関であることと、サーバーの公開鍵が信頼できるものだと知ることができる

  • 認証機関の公開鍵は安全にクライアントに渡されていなければならないので、多くのブラウザでは主要な認証機関の公開鍵をあらかじめ組み込んだ状態で製品出荷されている

  • HTTPSの仕組み

    [Client]                                 [Server]
    1. ――――― Handshake: ClientHello ――――――>
    2. <――――  Handshake: ServerHello ―――――
    3. <――――  Handshake: Certificate ―――――
    4. <――――  Handshake: ServerHelloDone ―――
    5. ――――― Handshake: ClientKeyExchange―――>
    6. ――――― Handshake; ChangeCipherSpec ―――>
    7. ――――― Handshake: Finished ―――――――>
    8  <――――  ChangeCipherSpec ―――――――――
    9. <――――  Handshake: Finished ―――――――
    10.――――― Application Data(HTTP)――――――>
    11.<――――  Application Data(HTTP) ――――――
    12.――――― Alert: warning, close notify ―――>

  • 1.クライアントがClientHelloメッセージを送信しSSL通信開始。メッセージには、クライアントがサーポートするSSLのバージョンを指定し、暗号スイート(使用する暗号化アルゴリズム、鍵の長さ)などが含まれる

  • 2.サーバーがSSL通信可能なら、ServerHelloメッセージで応答。SSLのバージョンと暗号スイートを含む。サーバーの暗号スイートの内容はクライアントから受けた暗号スイートの内容から選ばれたもの

  • 3.サーバーがCertificateメッセージを送信。メッセージに公開鍵証明書が含まれる

  • 4.サーバーがHelloDoneメッセージを送信することで、最初のSSLネゴシエーション部分が終わったことを通知する

  • 5.クライアントがClientKeyExchangeメッセージを送る。メッセージには通信を暗号化するために使うプリマスターシークレットと呼ばれる暗号化の種が含まれる。このメッセージは、公開鍵証明書から取り出した公開鍵で暗号化されている

  • 6.クライアントはChangeCipherSpecメッセージを送信する。これ以後の通信は暗号鍵を使って行うことを示す

  • 7.クライアントはFinishedメッセージを送信。このメッセージは、接続全体のチェック値を含んでいる。ネゴシエーションが成功したかどうかは、サーバーがこのメッセージを正しく復号化できたかどうかで決まる

  • 8.サーバーからChangeCipherSpecメッセージを送信する

  • 9.サーバーからFinishedメッセージを送信する

  • 10.サーバーとクライアントのFinishedメッセージの交換が完了したらSSLによる接続は確立できた。ここから先は、アプリケーション層のプロトコルによる通信をする。HTTPリクエスト。

  • 11.アプリケーション層プロトコル通信。HTTPレスポンス

  • 12.最後にクライアントが接続を閉じる。接続を閉じる際には、close_notifyメッセージを送信する