PS:堅持就是最大的超越。
最近、HTTPS に関連する知識について質問がありました。使い方はわかるけど、詳細はよくわからないので、今日は HTTPS に関連する知識をまとめてみました。この記事では主に理論的な知識についてまとめます。次の記事では実際のケースを紹介します。以下に主な内容を示します:
- HTTPS とは何か
- HTTP の欠点
- 公開鍵暗号技術
- HTTPS の暗号化転送
- 公開鍵証明書
- SSL と TLS
- なぜ HTTPS を使用しないのか
HTTPS とは#
簡単に言えば、HTTPS(HTTP Secure)は、HTTP プロトコルに暗号化と認証メカニズムを追加したものです。
HTTPS は新しいプロトコルではなく、HTTP 通信インターフェースの一部に SSL(Secure Socket Layer)と TLS(Transport Layer Security)プロトコルを使用しています。つまり、HTTP はまず SSL と通信し、次に SSL と TCP で通信するのです。HTTP と HTTPS の関係は以下の図のようになります:
HTTP の欠点#
HTTP の欠点は以下の通りです:
- 通信が平文で行われるため、転送内容が盗聴される可能性があります。
- 通信相手の身元を検証しないため、なりすまし攻撃が容易です。
- メッセージの完全性を保証できず、改ざんの可能性があります。
公開鍵暗号技術#
共通鍵暗号化と非対称鍵暗号化の暗号アルゴリズムでは、暗号化アルゴリズムは公開されていますが、鍵は秘密です。暗号化と復号には鍵が必要であり、鍵がなければ復号できません。逆に、鍵が傍受されると、暗号化された内容が解読される可能性があります。
- 共通鍵暗号化
この暗号方式は共有鍵暗号化とも呼ばれます。暗号化と復号に同じ鍵を使用します。通信時には、相手に復号するための鍵を送信する必要がありますが、この鍵の送信中にも傍受される可能性があるため、通信の安全性は鍵の安全な送信方法に依存します。以下に図を示します:
- 非対称鍵暗号化
この方式は公開鍵暗号化とも呼ばれ、非対称な鍵のペアを使用します。一方は公開鍵(public key)と呼ばれ、もう一方は秘密鍵(private key)と呼ばれます。公開鍵は自由に送信できますが、秘密鍵は秘密にする必要があります。
暗号文を送信する側は、相手の公開鍵を使用して暗号化し、相手は受け取った情報を自分の秘密鍵で復号します。この方式では、復号に使用するための秘密鍵を送信する必要がないため、秘密鍵が傍受される心配はありません。以下に図を示します:
HTTPS の暗号化転送#
元の HTTP は TCP と直接通信しますが、TCP/IP プロトコルスタックの動作メカニズムにより、通信内容は転送経路上で傍受される可能性があります。インターネットは世界中に接続されたネットワークで構成されており、通信経路上の通信機器はすべてがプライベートではありません。そのため、通信の安全性が保証されません。そのため、HTTPS が登場しました。では、HTTPS はどのように暗号化されるのでしょうか?
HTTPS はハイブリッド暗号化方式を採用しています。鍵の安全な交換が保証される場合、通信全体で共通鍵暗号化のみを使用して通信できます。鍵の安全な交換が保証されない場合は、鍵交換の段階で非対称暗号化方式を使用し、その後は共通鍵暗号化方式を使用します。これは、共通鍵暗号化が非対称鍵暗号化よりも処理速度が速いためです。
しかし、暗号化されているから安全というわけではありません。実際、通信が暗号化されていても、技術的な手段により通信内容は傍受される可能性がありますが、通信が暗号化されているため、具体的なメッセージ情報を理解することは困難になります。つまり、暗号化の目的は達成されます。
HTTPS の暗号化転送では、公開鍵を送信する必要がありますが、その公開鍵の正当性をどのように保証するのでしょうか。それは、デジタル証明書機関(CA、Certificate Authority)によって発行される公開鍵証明書です。
公開鍵証明書#
ここで言及するのは、デジタル証明書機関(CA)とその関連機関が発行する公開鍵証明書です。デジタル証明書機関は、クライアントとサーバーの両方が信頼できる第三者機関としての立場にあります。具体的な業務フローは次のとおりです:
- サーバーの運営者はデジタル証明書機関に公開鍵の申請を行います。
- デジタル証明書機関は身元を確認した後、申請された公開鍵にデジタル署名を行い、公開鍵証明書にバインドします。サーバーは、デジタル証明書機関から発行されたこの公開鍵証明書をクライアントに送信します。
- クライアントはデジタル証明書機関から発行された公開鍵証明書を取得し、デジタル署名の検証を行います。これにより、公開鍵証明書がデジタル証明書機関によって発行されたものであり、信頼できる公開鍵であることが確認されます。
- 正しいことが確認されたら、その公開鍵を使用してメッセージを暗号化します。
- サーバーは秘密鍵を使用してメッセージを復号します。
具体的な業務フローは以下の図のようになります:
第 3 ステップでは、デジタル証明書機関の公開鍵がクライアントに安全に送信されるようにするため、ほとんどのブラウザ開発者はブラウザのバージョンリリース時に一般的な証明機関の公開鍵を組み込んでいます。
SSL と TLS#
HTTPS は SSL(Secure Socket Layer)と TLS(Transport Layer Security)という 2 つのプロトコルを使用しています。SSL 技術は、ブラウザ開発者の Netscape Communications Corporation が最初に提唱し、SSL3.0 以前のバージョンを開発しました。現在、主導権は IETF(Internet Engineering Task Force、インターネットエンジニアリングタスクフォース)に移っています。
IETF は SSL3.0 を基準にし、その後、TLS1.0、TLS1.1、TLS1.2 を制定しました。TLS は SSL をベースにしたプロトコルであり、時々このプロトコルを SSL と呼ぶこともあります。現在の主流バージョンは SSL3.0 と TLS1.0 です。
SSL と TLS は実質的には TLS が SSL のアップグレードバージョンであると理解できますが、詳細な違いについては専門家にお任せします。ここでは、SSL と TLS の関連背景を紹介します。
なぜ HTTPS を使用しないのか#
HTTPS は SSL(および TLS)を使用するため、安全性と信頼性が向上しますが、暗号化処理のために通信全体が遅くなります。頻繁な暗号化と復号は、サーバーとクライアントのハードウェアリソースを消費します。
SSL は通信を遅くするだけでなく、CPU やメモリなどのリソースを大量に消費するため、処理速度が遅くなります。HTTP と比較して、ネットワーク負荷は 2 倍から 100 倍遅くなる可能性があります。以下に図を示します:
HTTPS を使用すると、ハードウェアコストが増えることを意味し、また、デジタル証明書を認証局から購入するためにも費用がかかります。
以上が HTTPS が安全で信頼性が高いにもかかわらず、多くのウェブサイトがなぜ HTTP を使用しているのかの理由です。