HTTPSとTLSの仕組みを徹底解説:ハンドシェイクの全貌
URLを入力してEnterキーを押すと、鍵アイコンが表示されます。しかし、ブラウザとサーバーの間でその接続を安全にするために実際に何が起こっているのでしょうか?多くの開発者はHTTPSをブラックボックスとして扱います—証明書エラーやパフォーマンス問題など、何かが壊れるまでは。この記事では、HTTPSの背後にあるプロトコルであるTLSのベールを剥がし、ハンドシェイクを平易な言葉で説明します。
HTTPSの正体
HTTPSは単にTLS(Transport Layer Security)の上にHTTPを重ねたものです。TLSは3つの保証を提供します:
- 機密性 – データは暗号化され、盗聴者は読めません。
- 完全性 – データは転送中に検出されずに変更されることはありません。
- 認証 – 本物のサーバーと通信しており、偽者ではありません。
TLSがなければ、HTTPはすべてを平文で送信します:パスワード、Cookie、フォームデータはネットワーク経路上の誰にでも見えます。
TLSハンドシェイクを平易な英語で
ハンドシェイクは、アプリケーションデータが送信される前に行われるネゴシエーションです。その目標は、暗号化アルゴリズムに合意し、サーバーの身元を検証し、共有秘密鍵を確立することです。以下は現代の標準であるTLS 1.3のフローです:
- Client Hello – ブラウザはサポートする暗号スイートのリスト、ランダム値、および鍵共有(鍵交換用)を送信します。
- Server Hello – サーバーは暗号スイートを選択し、自身のランダム値と鍵共有を送信し、証明書チェーンを提供します。
- 証明書の検証 – ブラウザは信頼されたルートCAに対して証明書をチェックし、ドメイン名を検証し、有効期限を確認します。
- 鍵の導出 – 双方が鍵交換(通常はECDHE)を使用して同じ共有秘密を計算します。セッション鍵が導出されます。
- Finished – 双方がハンドシェイクトランスクリプトに対するMACを送信し、何も改ざんされていないことを確認します。
その後、暗号化されたアプリケーションデータが流れます。TLS 1.3では、ハンドシェイクは1往復(1-RTT)で完了し、再開時は0-RTTを達成できます。
TLS 1.2 vs TLS 1.3
TLS 1.2は2往復を必要とし、弱いアルゴリズムをサポートしていました。TLS 1.3は古い暗号を削除し、ハンドシェイクを簡素化し、ハンドシェイク自体のより多くの部分を暗号化します。常にTLS 1.3を優先してください。最近のサーバーとブラウザのほとんどがサポートしています。
証明書:信頼のアンカー
証明書は公開鍵をドメイン名にバインドし、認証局(CA)によって署名されます。ブラウザには信頼されたルートCAのストアが同梱されています。検証中、ブラウザはサーバーの証明書から信頼されたルートまでのチェーンを構築します。
一般的な証明書の種類:
- DV(ドメイン検証) – ドメインの制御を証明します。迅速で無料(例:Let's Encrypt)。
- OV(組織検証) – 検証済みの会社詳細を含みます。
- EV(拡張検証) – より厳格な身元確認。ほとんどのブラウザでは緑色のバーは表示されなくなりました。
証明書は期限切れになります。CertbotのようなACMEクライアントで更新を自動化し、停止を避けてください。
鍵交換とPerfect Forward Secrecy
現代のTLSは一時的な鍵交換(ECDHE)を使用します。各セッションは新しい鍵ペアを生成するため、サーバーの秘密鍵が後で漏洩しても、過去のセッションは復号できません。この特性はforward secrecyと呼ばれます。この保護がない静的RSA鍵交換は避けてください。
よくあるHTTPSの落とし穴と回避方法
- 混合コンテンツ – HTTPSページでHTTPリソースを読み込むとブラウザの警告が発生します。相対URLを使用するか、HTTPSに更新してください。
- 期限切れの証明書 – 監視と自動更新を設定してください。
- 弱い暗号スイート – TLS 1.0/1.1とRC4/3DESを無効にしてください。SSL Labsのようなツールでテストしてください。
- HSTSの欠如 –
Strict-Transport-Securityヘッダーを追加してHTTPSを強制してください。
TLSの問題のデバッグ
ハンドシェイクが失敗した場合、openssl s_clientを使用して接続を検査します:
openssl s_client -connect example.com:443 -servername example.com
これにより、証明書チェーン、ネゴシエートされたプロトコル、および暗号が表示されます。ブラウザ固有のエラーについては、DevToolsのセキュリティパネルを確認してください。
FAQ
HTTPSはTLSと同じですか?
HTTPSはTLS上のHTTPです。TLSは暗号化プロトコルであり、HTTPSはHTTPアプリケーションプロトコルの安全なバージョンです。
サブドメインごとに個別の証明書が必要ですか?
必ずしも必要ではありません。ワイルドカード証明書はすべての第1レベルサブドメインをカバーし、マルチドメイン(SAN)証明書は複数の名前をリストできます。
TLS 1.3はどのようにパフォーマンスを向上させますか?
TLS 1.3はハンドシェイクを1往復(再開時はゼロ)に減らし、暗号ネゴシエーションを簡素化してレイテンシを低減します。
自分のサイトのセキュリティを検査する準備はできましたか?Nginxログアナライザーを使用して、ログ内の疑わしいTLSエラーとハンドシェイクの失敗を特定してください。