目次

インターネットを流れるデータはデフォルトでは平文だ。HTTPはHyperText Transfer Protocolの略であり、設計当初はセキュリティよりも相互運用性が優先されていた。しかし現代のWebではパスワード、クレジットカード番号、個人情報といった機密データが常にやり取りされる。HTTPSは暗号化によってこれらの通信を保護する仕組みだが、その内部でどのような処理が行われているかを理解することは、セキュリティ上の判断を正確に行うために不可欠だ。

HTTP通信の危険性

HTTPは通信内容をそのまま送受信する。同一ネットワーク上(カフェのWi-Fiなど)に攻撃者がいる場合、パケットキャプチャツールを使えばHTTP通信のリクエスト・レスポンスを丸ごと読み取ることができる。これを**盗聴(Eavesdropping)**という。

さらに深刻なのが**中間者攻撃(Man-in-the-Middle Attack、MitM)**だ。攻撃者がクライアントとサーバーの通信経路に割り込み、送受信されるデータを改ざんする。悪意のあるスクリプトをHTMLに挿入したり、フォームの送信先を変更したりすることが可能になる。

HTTPSはこれらの攻撃に対して、暗号化(盗聴対策)、認証(相手の正当性確認)、整合性(改ざん検出)の3要素を提供する。

TLSとは何か

TLS(Transport Layer Security)はHTTPの下層で動作する暗号化プロトコルだ。HTTPSはHTTP over TLSの略であり、HTTPの通信をTLSが暗号化している。かつてはSSL(Secure Sockets Layer)と呼ばれていたが、現在の実装はほぼすべてTLS 1.2またはTLS 1.3だ。

TLSは対称暗号と**非対称暗号(公開鍵暗号)**の2種類を組み合わせて使う。それぞれの特性を理解することがTLSの仕組みを把握する鍵となる。

対称暗号

暗号化と復号に同じ鍵を使う方式だ。AES(Advanced Encryption Standard)が代表例で、計算コストが低く大量のデータを高速に処理できる。欠点は「同じ鍵を送受信者が事前に共有しておく必要がある」点だ。鍵の配送が問題になる。

非対称暗号(公開鍵暗号)

公開鍵と秘密鍵のペアを使う方式だ。RSAやECDHE(楕円曲線ディフィー・ヘルマン鍵交換)が代表例だ。公開鍵で暗号化したデータは対応する秘密鍵でのみ復号できる。計算コストが高いため、大量のデータ暗号化には向かない。

TLSはこの2種類を組み合わせる。非対称暗号で「対称暗号に使う共通鍵」を安全に交換し、以降の通信は対称暗号で処理するというアプローチだ。

TLSハンドシェイクの流れ

ブラウザがHTTPSサイトに接続する際、最初に「TLSハンドシェイク」と呼ばれるプロセスが実行される。TLS 1.3の場合、以下の手順で行われる。

1. Client Hello

クライアントがサーバーに対して接続要求を送る。このメッセージには以下の情報が含まれる。

  • クライアントが対応するTLSのバージョン
  • クライアントが利用できる暗号スイートの一覧
  • 乱数値(Client Random)
  • 鍵交換のための公開パラメータ

2. Server Hello

サーバーがクライアントへ応答する。

  • 選択したTLSバージョンと暗号スイート
  • 乱数値(Server Random)
  • サーバーの公開鍵

3. サーバー証明書の送信

サーバーはX.509形式のデジタル証明書を送る。この証明書にはサーバーの公開鍵と、認証局(CA)による署名が含まれる。

4. 鍵交換と共通鍵の生成

ECDHE(楕円曲線ディフィー・ヘルマン鍵交換)を使う場合、クライアントとサーバーはそれぞれの公開パラメータを交換し、数学的な計算によって同一の共通鍵(セッション鍵)を生成する。重要なのは、この鍵が通信路上を直接流れることなく、双方が独立して同じ値を計算できる点だ。

5. Finished / セッション開始

共通鍵が確立されると、以降の通信はAES-GCMなどの対称暗号で暗号化される。TLS 1.3ではハンドシェイクが1-RTT(1往復)で完了するよう最適化されている。

デジタル証明書と認証局

TLSハンドシェイクで重要な役割を果たすのがデジタル証明書だ。証明書は「このドメインの公開鍵は正当なものである」という事実を第三者機関が保証する仕組みだ。

証明書を発行するのが**認証局(Certificate Authority、CA)**だ。ブラウザやOSには、信頼できるCAのリスト(ルートCA証明書)が事前にインストールされている。

証明書の信頼性は**証明書チェーン(Chain of Trust)**によって確保される。

ルートCA証明書(ブラウザ/OSに組み込み済み)
    ↓ 署名
中間CA証明書
    ↓ 署名
サーバー証明書(ドメイン名と公開鍵を含む)

ブラウザはサーバー証明書を受け取ると、証明書チェーンを辿って最終的にルートCAの署名を検証する。この検証が成功すれば、証明書が改ざんされていないことと、信頼できる機関が発行したことが確認できる。

証明書には有効期限があり、通常は1〜2年だ。また証明書が漏洩した場合に無効化するための仕組みとして、CRL(Certificate Revocation List)やOCSP(Online Certificate Status Protocol)がある。

HSTSによる強制HTTPS化

HTTPSが正しく設定されていても、ユーザーが http:// でアクセスすることでHTTPリクエストが発生してしまう可能性がある。これを防ぐのが**HSTS(HTTP Strict Transport Security)**だ。

サーバーがHTTPSレスポンスに以下のヘッダーを付与すると、ブラウザはそのドメインへの通信を一定期間(max-ageで指定)強制的にHTTPSで行うようになる。

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

preload を指定し、HSTS Preloadリストに登録されたドメインは、ブラウザが出荷時点からHTTPS接続を強制するため、最初の接続からHTTPが使われることがなくなる。

混在コンテンツ問題

HTTPSページ内でHTTPのリソース(画像・スクリプト・スタイルシートなど)を読み込む「混在コンテンツ(Mixed Content)」は深刻なセキュリティ問題を引き起こす。ページ自体は暗号化されていても、HTTPで読み込まれるリソースは盗聴・改ざんのリスクにさらされる。

現代のブラウザはスクリプトやスタイルシートのような「アクティブな混在コンテンツ」をデフォルトでブロックし、画像などの「パッシブな混在コンテンツ」については警告を表示する。


まとめ

HTTPは通信内容が平文のため、盗聴・改ざん・中間者攻撃に対して無防備だ。HTTPSはTLSによってこれらの脅威に対応する。TLSハンドシェイクでは非対称暗号を使って共通鍵を安全に交換し、以降の通信は高速な対称暗号で処理する。デジタル証明書と認証局の仕組みによって、接続先の正当性が検証される。HSTSを設定することで最初のHTTPリクエストも排除できる。現代のWebでHTTPSは必須の前提であり、その仕組みを理解することはセキュリティ設計の基礎となる。

免責事項 — 掲載情報は執筆時点のものです。料金・機能は変更される場合があります。最新情報は各公式サイトをご確認ください。