TLSハンドシェイクとは?
TLSハンドシェイクのプロトコル手順を学ぶ
2024年4月16日
著者: Ahona Rudra
翻訳: 永 香奈子
この記事はPowerDMARCのブログ記事 What is a TLS Handshake? の翻訳です。
Spelldataは、PowerDMARCの日本代理店です。
この記事は、PowerDMARCの許可を得て、翻訳しています。
TLSの暗号化および認証プロトコルは、インターネット通信を保護します。
TLSハンドシェイクは、非対称暗号を使用してサーバーとの接続を保護するプロセスです。
TLS証明書を使用しているWebサイトは、HTTPSプロトコルを利用してサーバーへ安全に接続できます。
このブログでは、TLSハンドシェイクの詳細な説明、TLSハンドシェイクの手順、動作方法などを解説していきます。
TLSハンドシェイクとは?
私たちが実生活で行う握手と同じように、TLSハンドシェイクは導入の役割を果たします。
これは二つのサーバ間で安全な通信を示すものであり、メッセージを交換して互いを認識し、検証し、暗号コードを設定し、セッションキーに合意するプロセスです。
TLSハンドシェイクのプロセスは、最初の「Hello」から始まり、クライアントとサーバが安全な接続で通信できる段階へと進行します。
TLSハンドシェイクはどのように機能するのか?
TLSハンドシェイクが何であるかを理解したところで、その動作について見ていきましょう。
TLSハンドシェイクプロセスは、サーバにTLS証明書が設定されている場合にのみ機能します。
この証明書には、ドメイン所有者に関する重要な詳細情報と、サーバの公開鍵が含まれており、サーバの識別を確認するために使用されます。
この一連のプロセスによって、TLS接続が確立されます。
したがって、ユーザがTLS対応のWebサイトにアクセスを要求すると、そのデバイスとウェブブラウザの間でTLSハンドシェイクが開始され、以下の一連の詳細情報が交換されます。
- 使用されるTLSバージョン(TLS 1.0、1.2、1.3など)
- 使用する暗号スイートの評価
- TLS証明書を使用したサーバの識別の検証
- 初期のハンドシェイクプロセスが完了すると、クライアントとサーバ間のメッセージを暗号化するためのセッションキーを生成する
TLSハンドシェイクは、すべての通信に対して暗号スイートを確立します。
暗号スイートとは、安全な通信接続を確立するために使用される一連のアルゴリズムです。
TLSハンドシェイクの重要な役割は、使用する暗号スイートを決定することです。
TLSは公開鍵暗号を使用して、暗号化されていないチャネル上で一致するセッションキーを設定します。
ハンドシェイクは、公開鍵を使用してサーバを確認することで送信者の真正性も検証します。
公開鍵は一方向の暗号化鍵であり、元の送信者以外は暗号化されたデータを復号できないことを意味しています。
元の送信者は、自身の秘密鍵を使用してデータを復号します。
TLSハンドシェイクが失敗すると、接続は終了し、クライアントには「503 Service Unavailable」とエラーメッセージが表示されます。
TLS対SSLハンドシェイク
SSLは「Secure Sockets Layer」の略であり、HTTPのために最初に開発されたセキュリティプロトコルです。
SSLはTLSに置き換えられ、SSLハンドシェイクは現在TLSハンドシェイクと呼ばれています。
TLSハンドシェイクはいつ発生するのか?
ユーザが安全な接続でWebサイトを閲覧しようとすると、ブラウザはWebサイトのオリジンサーバに問い合わせを行います。
また、HTTPSを使用する他の通信チャネルでもTLSハンドシェイクが発生します。
これには、APIコールや安全なネットワーク上でのDNS通信が含まれます。
TLSハンドシェイクの手順
TLSハンドシェイクの手順は、クライアントとサーバ間でやり取りされる一連のデータグラム(メッセージ)で構成されます。
具体的な手順は、使用される鍵交換アルゴリズムの種類や、両者がサポートする暗号スイートによって異なります。
以下は、一般的に期待される流れです。
手順1: ClientHello
メッセージ
クライアントのサーバは、WebサイトのメインサーバにClientHello
メッセージを送信することで、TLSハンドシェイクプロセスを開始します。
このメッセージには、TLSバージョンやサポートされる暗号スイートなどの重要な情報が含まれており、さらにClient Random
と呼ばれるランダムなバイト列(乱数)も含まれます。
手順2: ServerHello
メッセージ
サーバは、ClientHello
メッセージに応答し、SSL証明書、サーバが選択した暗号スイート、およびサーバが生成したServer Random
文字列(乱数)を含むメッセージを送信します。
手順3: 認証
このTLSハンドシェイクの段階では、クライアントがサーバのSSL証明書を発行元の認証機関に確認します。
これは、サーバが正規のものであり、クライアントがドメイン所有者と通信していることを検証するために行われます。
手順4: プリマスターシークレット
プリマスターシークレットとは、別のランダムなバイト列であり、クライアントによって送信されます。
これは公開鍵で暗号化され、サーバが秘密鍵を使用して復号できます。
手順5: 秘密鍵の使用
サーバはプリマスターシークレットを復号します。
手順6: セッションキーの作成
クライアントとサーバは、クライアントランダム、サーバランダム、およびプリマスターシークレットからセッションキーを作成します。
これら3つの要素の結果は、両者で同じになる必要があります。
手順7: クライアントの準備完了
クライアントは、セッションキーで暗号化されたfinished
メッセージを送信します。
手順8: サーバの準備完了
サーバは、セッションキーで暗号化されたfinished
メッセージを送信します。
手順9: 安全な対称暗号化の確立
これはTLSハンドシェイクの最終段階です。
このプロセスが完了すると、通信はセッションキーを使用して継続されます。
TLS 1.3のハンドシェイク - その違いとは?
TLS 1.3ではRSAがサポートされていないため、手順が若干異なります。
手順1: ClientHello
クライアントはClientHello
メッセージを送信し、プロトコルのバージョン、クライアントランダム、および暗号スイートのリストを含めます。
TLS 1.3では暗号スイートのサポートがないため、その数は減少します。
このメッセージには、プリマスターシークレットの評価に使用されるパラメータも含まれています。
これにより、ハンドシェイクの長さが短縮されるため、TLS 1.3のハンドシェイクはTLS 1.0/1.1/1.2のハンドシェイクと大きく異なります。
手順2: サーバがマスターシークレットを作成
このステップでは、サーバはクライアントのランダム値およびクライアントのパラメータと暗号スイートを受信します。
サーバは自身のサーバランダムを生成するとともに、マスターシークレットを生成します。
手順3: ServerHello
とfinish
ServerHello
には、サーバ証明書、暗号署名、サーバランダム、および選択された暗号スイートが含まれます。
また、マスターシークレットを持っているため、finish
メッセージを送信します。
手順4: 最終ステップとClient Finish
クライアントは署名と証明書を検証し、マスターシークレットを生成し、finish
メッセージを送信します。
手順5: 安全な対称暗号化の達成
TLSハンドシェイクが完了すると、通信はセッションキーを使用して継続されます。
TLSレポートの読み方
TLSレポートは、MTA-STS認証中の不整合なTLSハンドシェイクや配信の問題に関する貴重な情報を提供します。
PowerDMARCのTLS-RPTは、元のJSONファイルを解析し、人が読みやすい形式でレポートを提供します。
今日からTLSレポートを読み始めるには、是非無料トライアルを開始してください!
なぜビジネスおよびWebアプリケーションは、TLSハンドシェイクを使用するべきなのか?
TLSハンドシェイクは、HTTPより安全なHTTPSで通信を行う為、Webアプリケーションを侵害やその他のサイバー攻撃から保護しています。
TLS証明書を持つWebサイトは、HTTPSプロトコルを活用してユーザと安全に接続出来ます。
その目的は、個人データ、金融データ、ログイン認証情報などの機密情報を保護することです。