基本概念

HTTP(HyperText Transfer Protocol:ハイパーテキスト転送プロトコル)は、分散型、協調型、およびハイパーメディア情報システムのためのアプリケーション層プロトコルです。簡単に言うと、HTMLページを公開および受信するための方法であり、WebブラウザとWebサイトサーバーの間で情報を転送するために使用されます。

HTTPはデフォルトでTCPプロトコルの80番ポートで動作し、ユーザーがアクセスするウェブサイトはhttp://http:// で始まるものはすべて標準のHTTPサービスです。

HTTPプロトコルは平文でコンテンツを送信し、データ暗号化の手段を一切提供しません。攻撃者がWebブラウザとWebサイトサーバー間の転送メッセージを傍受すると、その中の情報を直接読み取ることができます。そのため、HTTPプロトコルは、クレジットカード番号、パスワードなどの支払い情報のような機密情報の転送には適していません。

HTTPS(Hypertext Transfer Protocol Secure:ハイパーテキスト転送セキュリティプロトコル)は、コンピュータネットワークを介して安全な通信を行うための転送プロトコルです。HTTPSはHTTPを介して通信しますが、SSL/TLSを使用してデータパケットを暗号化します。HTTPS開発の主な目的は、Webサイトサーバーの身元認証を提供し、交換されるデータのプライバシーと完全性を保護することです。

HTTPSはデフォルトでTCPプロトコルの443番ポートで動作し、その処理フローは一般的に以下の通りです:

  • 1. TCP 3ウェイハンドシェイク
  • 2. クライアントがサーバーのデジタル証明書を検証する
  • 3. DHアルゴリズムが対称暗号化アルゴリズムの鍵とハッシュアルゴリズムの鍵をネゴシエートする
  • 4. SSL安全暗号化トンネルのネゴシエーションが完了する
  • 5. ウェブページは暗号化方式で転送され、ネゴシエートされた対称暗号化アルゴリズムと鍵で暗号化してデータの機密性を保証します。また、ネゴシエートされたハッシュアルゴリズムでデータの整合性を保護し、データの改ざんを防ぎます。

2018年6月時点で、Alexaランキング上位100万のウェブサイトの34.6%がHTTPSをデフォルトとして使用しており、インターネット上の最も人気のある141,387サイトの43.1%が安全に実装されたHTTPSを有し、ページロードの45%(Firefoxの記録による)がHTTPSを使用しています。2017年3月時点で、中国の登録ドメイン総数の0.11%がHTTPSを使用していました。

Mozillaの統計によると、2017年1月以降、ウェブサイトのトラフィックの半分以上が暗号化されています。

HTTPとHTTPSの違い

  • HTTPは平文で転送されるため、データはすべて暗号化されておらず、安全性は低いです。HTTPS(SSL+HTTP)はデータ転送プロセスが暗号化されており、安全性は高いです。
  • HTTPSプロトコルを使用するには、CA(Certificate Authority、デジタル証明書認証機関)に証明書を申請する必要があります。一般的に無料の証明書は少ないため、一定の費用が必要です。証明書発行機関には、Symantec、Comodo、GoDaddy、GlobalSignなどがあります。
  • HTTPのページ応答速度はHTTPSよりも速いです。主な理由は、HTTPがTCP 3ウェイハンドシェイクを使用して接続を確立するため、クライアントとサーバーが3つのパケットを交換する必要があるのに対し、HTTPSはTCPの3つのパケットに加えてSSLハンドシェイクに必要な9つのパケットも必要とするため、合計12個のパケットになるからです。
  • httpとhttpsは完全に異なる接続方式を使用しており、使用するポートも異なります。前者は80、後者は443です。
  • HTTPSは実際にはSSL/TLSの上に構築されたHTTPプロトコルです。そのため、HTTPSはHTTPよりもサーバーリソースを多く消費します。

TCP 3ウェイハンドシェイク

TCP/IPプロトコルでは、TCPプロトコルは3ウェイハンドシェイクによって信頼性の高い接続を確立します。

  • 1回目のハンドシェイク:クライアントはサーバーへの接続を試み、サーバーにSYNパケット(同期シーケンス番号 Synchronize Sequence Numbers)を送信します。syn=j で、クライアントはSYN_SEND状態に入り、サーバーの確認を待ちます。
  • 2回目のハンドシェイク:サーバーはクライアントのSYNパケットを受信して確認し(ack=j+1)、同時にクライアントにSYNパケット(syn=k)、すなわちSYN+ACKパケットを送信します。このとき、サーバーはSYN_RECV状態に入ります。
  • 3回目のハンドシェイク:クライアントはサーバーのSYN+ACKパケットを受信し、サーバーに確認パケットACK(ack=k+1)を送信します。このパケットの送信が完了すると、クライアントとサーバーはESTABLISHED状態に入り、3ウェイハンドシェイクが完了します。

簡略化:

HTTPSの動作原理

HTTPSが情報を暗号化し、機密情報が第三者に取得されるのを防ぐことはよく知られています。そのため、多くの銀行のウェブサイトや電子メールなど、セキュリティレベルの高いサービスではHTTPSプロトコルが採用されています。

1. クライアントがHTTPSリクエストを開始する

これは特に説明することはありません。ユーザーがブラウザにhttpsのURLを入力し、サーバーの443番ポートに接続するだけです。

2. サーバー側の設定

HTTPSプロトコルを採用するサーバーには、デジタル証明書が必須です。自分で作成することも、組織に申請することもできます。違いは、自分で発行した証明書の場合は、クライアントが検証を通過しないとアクセスを継続できません。一方、信頼された会社から取得した証明書を使用する場合は、警告ページは表示されません(StartSSLは良い選択肢で、1年間の無料サービスがあります)。

この証明書は実際には公開鍵と秘密鍵のペアです。公開鍵と秘密鍵をあまり理解していない場合は、1本の鍵と1つの錠前に例えることができます。世界中でこの鍵を持っているのはあなただけであり、あなたは錠前を他の人に渡すことができます。他の人はその錠前で重要なものを施錠してあなたに送ることができます。鍵を持っているのはあなただけなので、その錠前で施錠されたものを見ることができるのはあなただけです。

3. 証明書の送信

この証明書は実際には公開鍵ですが、証明書の発行機関や有効期限など、多くの情報が含まれています。

4. クライアントが証明書を解析する

この作業はクライアントのTLSによって行われます。まず公開鍵が有効かどうか、例えば発行機関や有効期限などを検証します。異常が見つかった場合は、証明書に問題があることを示す警告ボックスが表示されます。

証明書に問題がなければ、ランダム値を生成し、そのランダム値を証明書で暗号化します。前述のように、ランダム値を錠前で施錠するようなもので、鍵がなければ施錠された内容を見ることはできません。

5. 暗号化された情報の送信

ここで送信されるのは、証明書で暗号化されたランダム値です。目的はサーバー側にこのランダム値を取得させることです。以降、クライアント側とサーバー側の通信はこのランダム値を使用して暗号化・復号化することができます。

6. サーバー側が情報を復号化する

サーバー側は秘密鍵で復号化した後、クライアントから送信されたランダム値(対称鍵)を取得し、その値を使用してコンテンツを対称暗号化します。いわゆる対称暗号化とは、情報と秘密鍵を何らかのアルゴリズムで混ぜ合わせることであり、秘密鍵を知らなければ内容を取得できません。そして、ちょうどクライアントとサーバー側の両方がこの秘密鍵を知っているため、暗号化アルゴリズムが十分に強力で、秘密鍵が十分に複雑であれば、データは十分に安全です。

7. 暗号化された情報の転送

この情報はサーバー側が秘密鍵で暗号化したものであり、クライアント側で復元できます。

8. クライアント側が情報を復号化する

クライアントは先ほど生成した秘密鍵を使用してサーバー側から送信された情報を復号化し、復号化された内容を取得します。このプロセス全体で、第三者がデータを傍受したとしても、どうすることもできません。