【図解で解説】HTTP、HTTPS、SSL、TLSについて詳しく解説します
HTTPとは
HTTP (Hypertext Transfer Protocol)は、ブラウザとサーバーの間で通信を行うためのルールのことです。
ブラウザでhttp://amazon.co.jpにアクセスするリクエストをWEBサーバーに送信した場合に、WEBサーバーはAmazonサイトのHTMLを含めたレスポンスを返します。
このようにブラウザとサーバーの間で通信を行うためのルールがHTTPになります。

引用:HTTPの仕組み|GET・POSTリクエスト/ステータスコード/サーバー通信/ユーザエージェントなどの基礎を解説
HTTPSとは
HTTPS (Hypertext Transfer Protocol Secure) は、クライアント (ブラウザなど) とサーバー間のデータ送信を保護するために設計された HTTP の拡張機能です。
下記画像の通り、HTTPでクレジットカード番号をサーバーに送信する場合はその番号を平文で送信してしまうのに対して、HTTPSではクレジットカード番号を暗号化してサーバーに送信することができます。
クレジットカード番号を暗号化していますが、SSL/TLSプロトコルを使用して暗号化しています。
SSL(Secure Sockets Layer) と TLS(Transport Layer Security)は、インターネット通信にセキュリティを提供するために使用される暗号化プロトコルです。
SSLとは
SSL(Secure Sockets Layer)は、インターネット通信にセキュリティを提供するために使用される暗号化プロトコルです。
1995年にNetscapeによって最初に開発されました。
ただSSLは何回か更新されていましたが、1999年にSSLはTLSに更新されました。
TLSとは
TLS(Transport Layer Security)もSSLと同様でインターネット通信にセキュリティを提供するために使用される暗号化プロトコルです。
いわばSSLの進化系と言っていいでしょう。
TLSは、Webアプリケーションとサーバーの間の通信を暗号化します。
TLSは、国際標準の策定機関であるインターネット技術タスクフォース(IETF)が考案したもので、プロトコルの最新のバージョンは1999年に発表されました。
参考:TLS(Transport Layer Security)とは?
HTTPS通信の手順
下記画像はHTTPS通信の手順を示したものです。
「1. TCP HandShake」と「2. Certificate Check」、「3. Key Exchange」、「4. Data Transmission」の4つに分けて解説します。
1. TCP HandShake (クライアントとサーバー間の接続を確立)

TCPのハンドシェイク(Three-Way Handshake)は、クライアントとサーバーが信頼性のある通信を確立するために行う手順です。
このプロセスでは、以下の3つのステップが行われます。
① TCP SYN(Synchronization)
クライアントはサーバーに対して接続要求を送ります。
このリクエストは、SYNフラグをセットしたパケットで構成されます。
SYNフラグは要するに接続動作を表します。
この時、クライアントは初期シーケンス番号も送信します。
② TCP SYN + ACK(Acknowledgment)
サーバーはクライアントからSYNパケットを受け取ると、それを受領したことを示すACKフラグをセットした応答を返します。ACKフラグは通信することを了承するフラグだと思ってください。今回の場合はクライアント側が通信したいという要求に対してサーバーが了承したと思ってください。
同時に、サーバー自身の接続要求としてSYNフラグもセットされ、サーバーの初期シーケンス番号が送信されます。
③ TCP ACK
クライアントはサーバーのSYN + ACKパケットを受け取ると、それを確認するACKフラグをセットしたパケットをサーバーに送ります。ここではクライアントがサーバー側の通信したいという要求に対して了承したと思ってください。
この応答を持ってクライアントとサーバー間の接続が確立されます。
2. Certificate Check (証明書のチェック)

クライアントとサーバーが暗号化された安全な通信を行うために、サーバー証明書を検証します。
TLSの確立において非常に重要なステップです。
① Client Hello
クライアントは、サーバーにTLS通信を開始するリクエストを送ります。
このリクエストには以下の情報が含まれます。
クライアントがサポートするTLSバージョン
暗号スイート(使用可能な暗号アルゴリズムのリスト)
ランダム値(乱数)
拡張情報(例えば、サーバー名やプロトコルの設定)
② Server Hello
サーバーはクライアントのリクエストに応答し、以下の情報を送ります。
サーバーが選択したTLSバージョン
使用する暗号スイート
サーバー側のランダム値
必要に応じた拡張情報
③ Certificate
サーバーは自分のデジタル証明書をクライアントに送ります。
この証明書には以下が含まれますl。
サーバーの公開鍵(上記画像の水色の鍵アイコン)
サーバーの識別情報(ドメイン名、会社情報など)
認証局(CA)による署名
④ Certificate Check(証明書の検証)
クライアントは受け取った証明書の検証を行います。
具体的には以下の手順で検証します。
署名の検証
証明書が信頼された認証局(CA)によって署名されているかを確認します。これにより、証明書が改ざんされていないことを確認します。
証明書チェーンの確認
サーバー証明書が中間証明書を経由して、信頼できるルートCAに連なるかどうかをチェックします。
有効期限の確認
証明書の有効期限が切れていないかを確認します。
ドメイン名の一致確認
証明書の対象ドメイン名が、実際にアクセスしているサーバーのドメイン名と一致するかを確認します。
⑤ Server Hello Done
サーバーはHelloメッセージと証明書の送信が完了したことをクライアントに伝えます。
3. Key Exchange (鍵交換)
① Client Key Exchange
クライアントはセッションキーを生成します。このセッションキーは対象暗号(AESなど)で使用されるキーです。
生成されたセッションキーをサーバーに送信するために、サーバーの公開鍵を使って暗号化します。
暗号化されたセッションキーがサーバーに送信されます。
② Change Cipher Spec(暗号仕様の変更)
クライアントとサーバーの双方で暗号仕様を更新することを通知します。
この更新は、今後の通信で新しく共有したセッションキーを使用することを意味します。
これにより、鍵交換後の通信は新しいセッションキーによって暗号化されます。
③ Finished
クライアントとサーバーの双方がハンドシェイクプロセス全体が正常に完了したことを確認するために「Finished」メッセージを送信します。
このメッセージは、暗号化された通信を使用して送られる最初のメッセージです。
4. Data Transmission (データ送信)

クライアントはセッションキーを使用してデータを暗号化し、サーバーに送信します。
サーバーは受け取った暗号化データをセッションキーで複合し、データを解釈します。
同様に、応答データをセッションキーで暗号化してクライアントに送信します。


Discussion