web-dev-qa-db-ja.com

TLSとDTLSの違い

[〜#〜] dtls [〜#〜] (TLS over UDP)の作者は、TCPなしで実行できるように何を変更する必要がありましたか?

ボーナスポイント:プロトコルの違いのいずれかが、インターフェイスの面でもベストプラクティスの面でも、使用方法に影響を与えますか?

35
tylerl

DTLSは現在(バージョン1.2)で定義されており、TLS 1.2( RFC 5246 )との違いを説明することによって RFC 6347 で定義されています。ほとんどのTLS要素は再利用され、ほとんど違いはありません。

コンテキストは、クライアントとサーバーが互いに「データグラム」として大量のデータを送信したいというものです。彼らはreally両方とも、定義された順序で長いバイトシーケンスを送信することを望みますが、 [〜#〜] tcp [〜#〜] の贅沢を享受しません。 TCPは、バイトに信頼できる双方向トンネルを提供します。すべてのバイトは、最終的に送信者が使用したのと同じ順序で受信者に到達します。 TCPは、確認応答メッセージ、送信タイムアウト、および再送信の複雑なアセンブリを通じてそれを実現します。これにより、TLSは単純に仮定でデータが通常の状態で無傷になることを許可します。言い換えれば、TLSはdetectの変更で十分であると見なします。そのような変更は攻撃を受けている場合にのみ発生するためです。

一方、DTLSは、失われたり、複製されたり、間違った順序で受信されたりする可能性があるデータグラムに対して機能します。これに対処するために、DTLSはいくつかの追加のメカニズムといくつかの追加の寛大さを使用します。

主な違いは次のとおりです。

  1. 明示的なレコード。 TLSを使用すると、oneの長いバイトストリームが得られます。TLS実装は、適切と思われるときにレコードに分割することを決定します。この分割は、アプリケーションに対して透過的です。 DTLSではそうではありません。各DTLSレコードはデータグラムにマップされます。データはレコードごとに送受信され、レコードは完全に受信されるか、まったく受信されません。また、アプリケーションはパスMTUディスカバリー自体を処理する必要があります。

  2. 明示的なシーケンス番号。 TLSレコードには [〜#〜] mac [〜#〜] が含まれ、これによりレコードの整合性が保証され、MAC入力にはレコードシーケンス番号が含まれるため、レコードが失われたり、重複したり、並べ替えられたりしていないことを確認できます。 TLSでは、このシーケンス番号(64ビット整数)は暗黙的です(これは常に前のレコードよりも1つ大きくなります)。 DTLSでは、シーケンス番号は各レコードで明示的です(そのため、レコードごとに8バイトのオーバーヘッドが追加されます-大したことではありません)。シーケンス番号は、暗号スイートの再ネゴシエーションをより適切に処理するために、16ビットの「エポック」と48ビットのサブシーケンス番号にさらに分割されます。

  3. 変更は許容されます。データグラムは、失われたり、複製されたり、並べ替えられたり、変更されたりする場合があります。これは、TLSが嫌う「事実」であるが、DTLSは受け入れる。したがって、クライアントとサーバーの両方が少しの乱用を許容することになっています。彼らは「ウィンドウ」メカニズムを使用して「少し早い」レコードを理解します(レコードが1 2 5 3 4 6の順序でレコードを受け取った場合、ウィンドウはレコード3と4までレコードの「5」をバッファに保持しますまたは、受信者はレコード3と4が失われたためスキップする必要があると判断します)。重複、およびMACが一致しないレコードについて警告する場合があります。しかし、一般に、異常なレコード(欠落、重複、ウィンドウスコープを超えて早すぎる、古すぎる、変更された...)は単に削除されます。

    つまり、DTLS実装では、通常の「ノイズ」(発生する可能性のあるランダムエラー)とアクティブな攻撃を区別しません(実際には区別できません)。一部のしきい値を使用できます(エラーが多すぎる場合は、ユーザーに警告します)。

  4. ステートレス暗号化。レコードが失われる可能性があるため、暗号化では、各レコードで変更される状態を使用しないでください。実際には、これはRC4がないことを意味します。

  5. 確認済みの終了はありません。 DTLSには、TLSがclose_notifyアラートメッセージで行うように、検証済みの接続終了の概念はありません。つまり、受信者がピアからのデータグラムの受信を停止すると、送信者が自発的に送信を停止したのか、それとも残りのデータが失われたのかを知ることができません。このようなことはSSL 2.0の主要な罪の1つと考えられていましたが、DTLSの場合、これは問題ないようです。そのようなものが必要な場合、明示的な終了をプロビジョニングするのは、送信されるデータ形式次第ですwithin DTLS。

  6. 断片化と再放出。ハンドシェイクメッセージは本来のデータグラム長を超える可能性があるため、複数のレコードに分割される場合があります。ハンドシェイクメッセージの構文は、これらのフラグメントを管理するために拡張されています。フラグメント処理にはバッファーが必要であるため、DTLS実装では、TLS実装(つまり、RAMが不足している組み込みシステム用に最適化された実装)よりも少しRAMが必要になる可能性があります。デスクトップとサーバーは、十分な大きさのバッファーを割り当てるだけで、DTLSはそれらにとっては悪くありません)。再送信は、単純なTLSハンドシェイクよりも実装が少し複雑な状態マシンを介して行われます(ただし、RFCはそれをよく説明しています)。

  7. DoS/spoofに対する保護。データグラムは「そのまま」送信できるため、IPスプーフィングの影響を受ける可能性があります。悪意のあるユーザーは、偽の送信元アドレスでデータグラムを送信できます。特に、ClientHelloメッセージ。 DTLSサーバーがClientHelloを受け取ったときにリソースを割り当てる場合、 DoS のための十分な余地があります。 TLSの場合、ClientHelloは、TCPの3ウェイハンドシェイクが完了した後にのみ発生します。これは、クライアントが実際に受信できるソースIPアドレスを使用することを意味します。実際のIPを表示せずにサーバーをDoSできることは強力な武器です。したがって、DTLSにはオプションの防御機能が含まれています。

    DTLSの防御メカニズムは「Cookie」です。クライアントはそのClientHelloを送信します。サーバーはこれに対して、不透明なCookieを含むHelloVerifyRequestメッセージで応答します。このメッセージには、クライアントがsecondClientHelloとして返信する必要があります。サーバーは、状態を保存せずに検証できる種類のCookieを用意する必要があります。つまり、タイムスタンプとMACが付いたCookie(奇妙なことに、RFC alludesがそのようなメカニズムに対して完全に指定されていない-実装によっては間違っている可能性があります)。

    このCookieメカニズムは、実際にはTCP 3ウェイハンドシェイクのエミュレーションです。これは、追加のラウンドトリップが1つあることを意味します。つまり、最初のハンドシェイクのために、DTLSをTLS-over-TCPのパフォーマンスに戻します。

それ以外は、DTLSはTLSに似ています。 TLSの非RC4暗号スイートがDTLSに適用されます。 DTLS 1.2は、TLS 1.2と同様に、CBC暗号化を使用するときにレコードごとのランダムIVを含むため、BEASTのような攻撃から保護されています。

要約すると、DTLSの追加機能は、概念的にはTCPからのインポート(受信ウィンドウ、シーケンス番号による再構成、再送信、接続Cookie ...)であり、通常のTLSでスローされます(重要な欠落の1つは確認応答がないことです)メッセージ)。プロトコルは変更に関してより寛容であり、検証済みの「送信終了」は含まれていません(ただし、DTLSは、これが実際に意味をなさない状況で使用されることになっています)。

DTLSのアプリケーションドメインは、TLSのドメインとはまったく異なります。遅延よりも損失の方が重要ではないデータストリーミングアプリケーションに適用することを意図しています。 VoIPまたはライブビデオフィード。特定のアプリケーションでは、TLSはDTLSよりもはるかに意味があります。 適切プロトコルを選択することをお勧めします。

51
Thomas Pornin

DTLSとトランスポート層セキュリティ(TLS)プロトコルの間には、他の回答ミス/インプライドが存在しないことをアプリケーションプログラマが認識しておく必要のある重要な違いがあります。

DTLSプロトコルは、データグラムプロトコルの通信プライバシーを提供します。この記事の執筆時点での現存する高評価のLONGおよび一般的に有益な回答とは対照的に、 (archive) の場合、DTLSはnotの場合に使用されますTCPは利用できません(TCPの贅沢を享受しないアプリによって。主な違いは、DTLS実装がパケットの並べ替えと損失の問題を処理する一方で、のみを処理することですDTLSハンドシェイク(および暗号化の選択)に使用されるパケット。ただし、ペイロード(アプリケーションデータ)を含むDTLSパケットは、それらをカプセル化するDTLSパケット(通常はUDP)よりも確実にペイロードを配信しません。利点は、DTLSがアプリケーションデータをより速く、より低いレイテンシで配信することです。ボーナスポイント:DTLSが、VoIP、ライブビデオフィード、MMOゲームなど、レイテンシよりも損失が重要ではないストリーミングアプリケーションを保護するために使用される理由です。 TLSは、データストリームを確実に、認証された暗号化でエンドツーエンドで配信することを目的としています。DTLSは、アプリケーションデータの配信を目的としています。エンドツーエンドで認証および暗号化されますが、すべてのアプリケーションデータの配信が保証されている場合よりもレイテンシが低くなります。

さらに、DTLSプロトコル(v1.2)はTLSプロトコル(v1.2)およびclaimsから派生し、「同等のセキュリティ保証」を提供しますが、それはしません. 2 2013年に戻って、研究者はDTLS実装とDTLSプロトコル自体の両方で、少なくともGnuTLSとOpenSSLで修正された主要なセキュリティ上の欠陥を特定しました実装 2

PS:DTLS 1.3は開発中です---

0
Matthew Elvey