私は現在、セキュリティと暗号化に関する大学のクラスを取っています。私たちがやっているプロジェクトの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プロトコルの一部を誤解していますか?
素晴らしいソース、thx! – kraiz