2010-12-02 19 views
5

私は現在、セキュリティと暗号化に関する大学のクラスを取っています。私たちがやっているプロジェクトの1つは、基本的なTLSソケットを実装することです。TLS/SSLプロトコルの理解

私は教科書と最新のRFCの両方を使ってTLSプロトコルを研究しました。そのため、TLS/SSLの仕組みや、TLSレコードフォーマットのレイアウト方法バイト単位。

私はポート443でリッスンし、着信セキュアHTTP接続を受け付けるサーバープログラムを作成することにしました。クライアント接続を受け入れ、クライアントが送信した最初のメッセージの16進ダンプを出力するだけです。

しかし、Webブラウザ(Firefox)を使用してサーバーに接続すると、ブラウザが私に送信するバイトストリームによって完全に困惑しています。 According to the RFC、TLSクライアントが最初に行うべきことは、ClientHelloメッセージを送信することです。すべてのメッセージは、(RFCが使用C-ISH表記法を使用して)次のようにフォーマットされるようになっているTLSレコード形式、中にカプセル化されなければならない:

struct { 
     ContentType type; 
     ProtocolVersion version; 
     uint16 length; 
     opaque fragment[TLSPlaintext.length]; 
    } TLSPlaintext; 

ContentTypeフィールドは1でなければならない単一の列挙型値でありますchange_cipher_spec = 0x14, alert = 0x15, handshake = 0x16, application_data = 0x17

ので、しなければならないクライアントは握手の一部であるClientHelloメッセージを送るである最初の事以来、私は示し、バイトストリームでは非常に最初のバイトは0x16ことを期待したい:次のタイプのこれはハンドシェイクメッセージです。

しかし、その代わりに、私のブラウザが送信する実際のバイトストリームは次のとおりです。

80 55 01 03 00 00 3c 00 00 00 10 00 00 88 00 00 87 00 00 39 00 00 
38 00 00 84 00 00 35 00 00 45 00 00 44 00 00 33 00 00 32 00 00 96 
00 00 41 00 00 04 00 00 05 00 00 2f 00 00 16 00 00 13 00 fe ff 00 
00 0a 00 00 ff 07 99 58 ad 17 f3 17 23 be 63 8c 6d cb 9b 5f 6f 

私も時間RFCかけ注いだ後、このバイトストリームのいずれかの意味を理解することはできません。私がTLSについて読んだことはすべて、最初のバイトはハンドシェイクを示すために0x16でなければならず、その後に2バイトのバージョンフィールドが続き、その後に2バイトのレコード長フィールドが続くことを伝えます。しかし、このバイトストリームは0x80 0x55で始まりますが、それは意味のないことです。

ここで起こっていることを誰でもクリアできるのですか?私はTLSプロトコルの一部を誤解していますか?

答えて

9

あなたが見ているのは、SSLバージョン2互換のhelloです。 appendix E of RFC 5246を見てください。 Firefoxの最新バージョンがそれを送信するとは思わないが、あなたが期待していたV3のhelloフォーマットのみを送信するだろう。

5

WiresharkにはHTTPS/TLS/SSLのパーサーがあり、これはハンドシェイクのプレーンテキスト部分を理解することができます。

The First few milliseconds of an HTTPS connectioも必ずお読みください。

+0

素晴らしいソース、thx! – kraiz