TLS 1.3ハンドシェイクと0-RTT再開
TLS 1.3のハンドシェイクを手順ごとに追い、デフォルトで前方秘匿性を実現する仕組みを理解し、0-RTTセッション再開のセキュリティ上のトレードオフを評価します。
「TLS 1.3ハンドシェイクと0-RTT再開」はCoddyKit上の無料Security+ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSecurity+ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Security+ Academyコースには全4レッスンが含まれています。
TLS 1.3が必要とされた理由
TLS 1.3は、2018年(RFC 8446)にリリースされ、10年以上にわたる実環境での攻撃によってTLS 1.2に蓄積した弱点を解消するために設計されました。以前のバージョンでは、弱い暗号スイートのネゴシエーションや、輸出用暗号強度の暗号方式が許可されており、データを送信する前に複数回のラウンドトリップが必要でした。TLS 1.3では、非推奨のアルゴリズムをすべて削除し、通常の場合のハンドシェイクを1回のラウンドトリップに簡素化することで、セキュリティとパフォーマンスの両方を大幅に向上させています。
ハンドシェイクの概要:1回のラウンドトリップ
TLS 1.3では、クライアントとサーバーが1-RTT(1回のラウンドトリップ)でハンドシェイクを完了します。クライアントは、サポートする暗号スイートと鍵共有(Diffie-Hellmanを使用)を含むClientHelloを送信します。サーバーは、ServerHello、独自の鍵共有、証明書、最初の暗号化されたアプリケーションデータを、すべて1回の送信で返します。その後、クライアントは証明書を検証し、アプリケーションデータを交換する前にFinishedメッセージを送信します。
# Trace TLS 1.3 handshake with openssl
openssl s_client -connect example.com:443 -tls1_3 -msg 2>&1 | grep -E 'ClientHello|ServerHello|Finished'鍵交換:一時的なDiffie-Hellmanのみ
TLS 1.3では、一時鍵交換が必須であり、RSA鍵交換は完全に削除されました。すべての鍵交換で、ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)またはDHE(Diffie-Hellman Ephemeral)を使用する必要があります。「ephemeral(一時的)」とは、セッションごとに新しい鍵ペアが生成されることを意味します。これはPerfect Forward Secrecyの基盤です。サーバーの長期秘密鍵が漏えいしても、各セッションで固有の一時鍵が使われるため、過去のセッションを復号できません。
Perfect Forward Secrecyの説明
Perfect Forward Secrecy(PFS)により、攻撃者が今日すべての暗号化トラフィックを記録し、将来サーバーの秘密鍵を入手したとしても、過去のセッションを復号できないことが保証されます。RSA鍵交換を使用するTLS 1.2では、サーバーの秘密鍵によって、過去の任意のセッションのプレマスターシークレットを復号できました。これは壊滅的な問題です。TLS 1.3では一時DH鍵を使用するため、各セッションが独自の鍵を導出し、その一時鍵は使用後に破棄されます。
暗号スイートの簡素化
TLS 1.2では300を超える暗号スイートがサポートされており、その多くは脆弱または破られていました。TLS 1.3ではこれを5つの暗号スイートに減らし、すべてでAEAD(Authenticated Encryption with Associated Data)を使用します。TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384、TLS_CHACHA20_POLY1305_SHA256、TLS_AES_128_CCM_SHA256、TLS_AES_128_CCM_8_SHA256です。これにより、弱い暗号ネゴシエーションを悪用したBEAST、POODLE、FREAKなどの攻撃カテゴリ全体が排除されます。
# Check supported TLS 1.3 cipher suites on a server
nmap --script ssl-enum-ciphers -p 443 example.com0-RTT再開:速度とセキュリティのトレードオフ
0-RTT(Zero Round Trip Time)再開は、TLS 1.3のオプション機能です。ハンドシェイクが完了する前に、クライアントが最初のメッセージでアプリケーションデータを送信できます。これは、以前のセッションのPre-Shared Key(PSK)を使用して機能します。0-RTTはレイテンシを大幅に削減できるため、高トラフィックのAPIでは重要ですが、重大なトレードオフもあります。初期データはリプレイ攻撃から保護されません。
0-RTTにおけるリプレイ攻撃のリスク
0-RTTデータに対するリプレイ攻撃では、攻撃者が初期データのメッセージを傍受してサーバーに再送することで、同じ操作が2回実行される可能性があります(支払いや状態変更など)。TLS 1.3の仕様では、0-RTTの初期データにはべき等な操作のみを含める必要があると明確に警告しています。べき等な操作とは、GETリクエストのように、何回実行しても同じ結果になる操作です。べき等でない操作(POST、DELETE)では、決して0-RTTを使用しないでください。
事前共有鍵とセッション再開
TLS 1.3のフルハンドシェイクが正常に完了すると、サーバーはPSK(Pre-Shared Key)を含むNewSessionTicketメッセージを発行し、クライアントが保存します。再接続時、クライアントはpre_shared_key extensionを使用して、このPSKをClientHelloに含めます。サーバーはPSKを認識し、0-RTTデータを承認するか、1-RTT再開にフォールバックします。PSKチケットには有効期限を設定し、漏えいの可能性がある期間を制限するため、頻繁にローテーションする必要があります。
暗号化されたハンドシェイク:メタデータの秘匿
TLS 1.3の大きな改善点は、サーバー証明書を含むハンドシェイクの大部分が暗号化されることです。TLS 1.2ではサーバー証明書が平文で送信されていたため、ネットワークの監視者はクライアントが接続しようとしているドメインを特定できました。TLS 1.3では証明書と、それ以降のハンドシェイクメッセージの大部分が暗号化されるため、受動的な監視者が利用できるメタデータが減少します。Encrypted Client Hello(ECH)は、SNI(Server Name Indication)フィールドまで隠す新しい拡張機能です。
削除された機能:TLS 1.3で排除されたもの
TLS 1.3では、問題の原因となっていた多くのレガシー機能が削除されました。RSA鍵交換(Forward Secrecyがない)、CBCモードの暗号スイート(パディングオラクル攻撃に脆弱)、RC4(完全に破られたストリーム暗号)、輸出用暗号強度の暗号方式(FREAKおよびLogjamの原因)、デジタル署名でのMD5とSHA-1、圧縮(CRIMEの原因)、再ネゴシエーション(複数の攻撃の原因)です。これらを削除することで、TLS 1.3の攻撃対象領域は大幅に縮小されています。
TLS 1.3向けのサーバー設定
TLS 1.3を正しく導入するには、TLS 1.0と1.1を無効にし、TLS 1.3を優先するようWebサーバーを設定する必要があります。最新のWebサーバー(Nginx、Apache、IIS)の多くは、TLS 1.3をネイティブにサポートしています。また、クライアントがCAに接続しなくても証明書の失効状態を提供できるようにOCSP Staplingを有効にし、HTTPへのダウングレード攻撃を防ぐHSTSヘッダーを設定してください。SSL Labsなどのツールを使用して、設定がA+評価を達成していることを確認します。
# Nginx TLS 1.3 configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security 'max-age=63072000' always;クイックチェック
このレッスンで扱ったCompTIA Security+ (SY0-701)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、TLS 1.3は一時DH鍵交換のみを使用し、1-RTTでハンドシェイクを完了してPerfect Forward Secrecyを実現すること、0-RTT再開はPSKを使用して再接続を高速化できる一方、リプレイ攻撃に対して脆弱であり、べき等な操作にのみ使用すべきであること、そしてTLS 1.3はすべてのレガシーな弱い機能(RSA鍵交換、CBC暗号、RC4、輸出用暗号、圧縮)を削除し、攻撃対象領域を大幅に縮小していることを学びました。次は、AES-GCMなどの認証付き暗号アルゴリズムについて説明します。
よくある質問
「TLS 1.3ハンドシェイクと0-RTT再開」レッスンは無料ですか?
はい。「TLS 1.3ハンドシェイクと0-RTT再開」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Security+ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Security+ Academyコースには全4レッスンが含まれています。
「TLS 1.3ハンドシェイクと0-RTT再開」で何を学びますか?
TLS 1.3のハンドシェイクを手順ごとに追い、デフォルトで前方秘匿性を実現する仕組みを理解し、0-RTTセッション再開のセキュリティ上のトレードオフを評価します。 ブラウザで直接実行するハンズオンコードでSecurity+ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Security+ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSecurity+ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「TLS 1.3ハンドシェイクと0-RTT再開」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSecurity+ Academyレッスンでコードを書いて実行できますか?
はい。すべてのSecurity+ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- TLS 1.3ハンドシェイクと0-RTT再開
- 認証付き暗号:AES-GCMとChaCha20-Poly1305
- 鍵導出関数:PBKDF2、bcrypt、Argon2
- ポスト量子暗号:CRYSTALS-KyberとDilithium