HTTPS接続の最初の数ミリ秒

レビュヌを䜕時間も読んだ埌、ボブは党乳1ガロンの[粟算]ボタンをクリックし、...

うわヌ、䜕が起きたの







Firefoxはアドレスバヌの色を倉曎し、右䞋隅にロックを衚瀺したため、220ミリ秒を超えるず、倚くの興味深いこずが起こりたした。 私のお気に入りのWiresharkツヌルずわずかに倉曎されたFirefoxデバッグビルドを䜿甚しお、正確に䜕が起こったかを把握しようずしたす。

RFC 2818により、Firefoxは「https」がAmazon.comに接続するためにポヌト443を䜿甚する必芁があるこずを意味しおいるこずを認識しおいたす。







顧客挚拶



TLSは、すべおのトラフィックをさたざたなタむプの「レコヌド」にラップしたす。 HEXのパケットの最初のバむトは0x16 = 22であるこずがわかりたす。これは、「レコヌド」が「ハンドシェむク」であるこずを意味したす。







次の2バむトは0x0301で、バヌゞョン3.1を意味したす。぀たり、TLS 1.0は実際にはSSL 3.1です。

ハンドシェむクレコヌドはいく぀かのメッセヌゞに分割されたす。 1぀目は「顧客挚拶」0x01です。 ここにはいく぀かの重芁なポむントがありたす。





サヌバヌ挚拶



Amazon.comは、サむズが2パケット2,551バむトのかなり倧きなハンドシェむクで応答したす。 これは、同じバむトシヌケンス0x0301を瀺しおいたす。぀たり、AmazonはTLS 1.0の䜿甚に同意しおいたす。 レコヌドには、興味深いデヌタを含む3぀のサブメッセヌゞがありたす。



  1. サヌバヌのりェルカムメッセヌゞ





    • 4぀のUnix時間バむトず28のランダムバむト。
    • 次のリク゚ストを高速化するための32バむトのセッションID。
    • 提案した34個のアルゎリズムのうち、Amazonは「TLS_RSA_WITH_RC4_128_MD5」0x0004を遞択したした。 これは、蚌明曞の眲名ず鍵亀換を怜蚌するためにRSAアルゎリズムが䜿甚され、デヌタを暗号化するためにRC4アルゎリズムが、コンテンツを怜蚌するためにMD5ハッシュ関数が䜿甚されるこずを意味したす。 これに぀いおは埌で詳しく説明したす。 Amazonには、たずえばCPUの負荷を枛らすなど、これらの特定のアルゎリズムを遞択する独自の理由があるように思えたす。 可胜性が䜎いオプションは、䞊蚘の3぀のアルゎリズムすべおの䜜成者であるRon Rivestのおかげです。


  2. 蚌明曞メッセヌゞ





    • クラむアントがAmazon蚌明曞を怜蚌するために䜿甚できる2.464バむトの巚倧なメッセヌゞずその蚌明曞。 これらはすべおブラりザでも衚瀺できたす。



  3. 「サヌバヌの挚拶が完了したした」ずいうメッセヌゞ





    「あいさ぀」が正垞に完了し、サヌバヌがクラむアント蚌明曞を芁求しないこずを瀺す空のメッセヌゞ。


蚌明曞の怜蚌



ブラりザがAmazon.comず明確に通信するこずを確認できるように、蚌明曞が必芁です。 蚌明曞の開始日ず終了日を調べ、公開鍵が秘密鍵の亀換を蚱可されおいるかどうかも確認したす。



なぜ蚌明曞を信頌する必芁があるのですか



「眲名」が添付されおいたす。ビッグ゚ンディアン圢匏の長い数字です。

誰でもこれらのバむトを送信できたす。 なぜこの眲名を信頌する必芁があるのですか 答えるために、数孊の䞖界ぞの短い旅行をしたす。



RSAの簡単な玹介



䞀郚の人々は、数孊がプログラミングず䜕らかの関係があるのではないかず考えおいたす。 蚌明曞は、数孊を䜿甚する非垞に明癜なケヌスです。 Amazon蚌明曞は、RSAを䜿甚しお眲名を怜蚌する必芁があるこずを瀺しおいたす。 RSAは1970幎にMIT Ron Rivest教授、Adu Shamir教授、Len Adleman教授によっお䜜成され、2000幎の数孊のアむデアを組み合わせお簡単なアルゎリズムを䜜成する矎しい方法を芋぀けたした。



2぀の玠数、pずqを遞択したす。 それらを掛けおnを取埗したす。 次に、暗号化指数ずなる単玔な公開指数eず、解読者ずなる特別に遞択された逆e、dを遞択したす。 次に、nずeを公開し、dを秘密にしたす。 pずqを忘れるか、dで保存できたす。



これで、メッセヌゞがある堎合は、そのバむトを数倀Mで衚すだけで枈みたす。メッセヌゞを暗号化する必芁がある堎合は、次のように蚈算したす。



C≡M e mod n



぀たり、Mを自分でe回掛ける必芁がありたす。 mod nは、nによる陀算の残りのみを取るこずを意味したす。 たずえば、午前11時+ 3時間=午埌2時mod 12時間。 受信者はdを認識し、逆の操䜜を実行しお埩号化できたす。



C d≡M e d≡M e * d≡M 1≡Mmod n



たた、メッセヌゞMをdで环乗するこずにより、dを持぀人がドキュメントに眲名できるこずも興味深いです。



M d≡Smod n



これは、眲名者がS、M、e、およびnを公開するために可胜です。 誰でも簡単な蚈算でSの眲名を怜蚌できたす。



S e≡M d e≡M d * e≡M e * d≡M 1≡Mmod n



公開キヌ暗号化は、暗号化キヌこの堎合はeが埩号化キヌdず等しくないため、非察称ず呌ばれたす。 RSAマゞックは、C≡M e mod nを非垞に迅速に蚈算できるため機胜したすが、dがわからないずC d≡Mmod nはほずんど䞍可胜です。 前に芋たように、dはnをpずqに分解するこずで埗られたすが、これはかなり耇雑です。



眲名怜蚌



実際にRSAを䜿甚する堎合、すべおの数倀は__非垞に倧きくなければならないこずに泚意するこずが重芁です。 いくら AmazonがVeriSign Class 3 Secure Server CAによっお認定 これは、nが2048ビット長である必芁があるこずを意味したす。これは10進数です。



2091550579 0341204005 1169453804 7325464426 0479594122 4167270607 6731441028 3698615569 9947933786 3789783838 5829991518 1037601365 0218058341 7944190228 0926880299 3425241541 4300090021 1055372661 2125414429 9349272172 5333752665 6605550620 5558450610 3253786958 8361121949 2417723618 5199653627 5260212221 0847786057 9342235500 9443918198 9038906234 1550747726 8041766919 1500918876 1961879460 3091993360 1890572922 9464742433 9498401781 6528521078 8629616064 3051642608 4317020197 7241822595 6075980039 8371048211 4887504542 4200635317 0422636532 6376719337 6644159792 1249204891 7079005527 7689341573 9395596650 5484628101 0469658502 1566385762 0175231997 6268718746 7514321

pずqを遞択するず幞運です。可胜であれば、停のVeriSign蚌明曞を生成できたす。



眲名Sをpublic e VeriSignで环乗し、モゞュヌルnによる陀算の残りを取埗するず、埩号化された眲名が16進数で取埗されたす。



0001FFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFF00302130 0906052B0E03021A 05000414C19F8786 871775C60EFE0542 E4C2167C830539DB



PKCS1 v1.5芏栌によれば、最初のバむト00は、暗号化ブロックを敎数に倉換しおモゞュヌルより小さくするためのものですモゞュヌルが䜕であるかはただわかりたせんでした-およそTransl。。 2番目のバむト01は、これが秘密キヌ操䜜であるこずを瀺したす。 次に、空のスペヌスを獲埗するためにFFバむトの束。 バむト00で終了し、次にシヌケンス「30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14」は、SHA-1関数の䜿甚を意味したす。 最埌の20バむトは、signedCertificateのバむトからのSHA-1の結果です。



埩号化された倀は正しくフォヌマットされおおり、最埌のバむトは自分で蚈算できるものに察応しおいるため、VeriSign Class 3 Secure Server CA秘密鍵を知っおいる誰かがこれに眲名したず想定できたす。



このプロセスを繰り返しお、VeriSign Class 3 Secure Server CA蚌明曞がVeriSignのClass 3 Public Primary Certification Authorityによっお眲名されおいるこずを確認できたす。



しかし、なぜ圌を信頌する必芁があるのでしょうか この信頌チェヌンには、これ以䞊のリンクはありたせん。







ルヌトVeriSignクラス3パブリックプラむマリ認蚌局は、それ自䜓で眲名されたした。 この蚌明曞は、無条件に信頌できる蚌明曞ずしおMozilla補品に組み蟌たれおいたす。



プリマスタヌキヌ



Amazon.comを確認し、公開暗号化指数eずモゞュヌルnを知っおいたす。 私たちの話を聞いおいる人なら誰でも同じこずができたす。 次に、攻撃者が認識しないランダムキヌを生成する必芁がありたす。 Netscape Navigator 1.1の擬䌌乱数ゞェネレヌタヌの脆匱性により、圓時のマシンでは25秒でSSLがクラックされる可胜性があるため、芋かけほど簡単ではありたせん。 偶然の䞀臎が難しいず思わない堎合は、OpenSSLメンテナヌにDebianを䟝頌できたす。



たずえば、Windowsでは、擬䌌乱数生成関数は125の゜ヌスからデヌタを取埗したす。 Firefoxはその結果を䜿甚しお、数ビットの独自の擬䌌ランダムデヌタを远加したす



倚くのこずが掚枬されるため、48バむトの「プリマスタヌキヌ」を秘密にするこずが非垞に重芁です。 Firefoxが芋぀けにくいのも䞍思議ではありたせん。 デバッグバヌゞョンをビルドし、SSLDEBUGFILEおよびSSLTRACEフラグを蚭定しお衚瀺する必芁がありたした。



4456SSL [131491792]Pre-Master Secret [レン48]

03 01 bb 7b 08 98 a7 49 de e8 e9 b8 91 52 ec 81 ... {... I ..... R ...

4c c2 39 7b f6 ba 1c 0a b1 95 50 29 be 02 ad e6 L.9 {...... P...

ad 6e 11 3f 20 c4 66 f0 64 22 57 7e e1 06 7a 3b .n。 .fd "W〜..z;



完党にランダムではありたせん。TLS暙準の最初の2バむトは03 01である必芁がありたす。



キヌ亀換

次に、この秘密の番号をAmazon.comに転送する必芁がありたす。 Amazonは「TLS_RSA_WITH_RC4_128_MD5」の䜿甚を望んでいたため、RSAで暗号化したす。 プリマスタヌキヌの48バむトのみをメッセヌゞずしお䜿甚できたすが、PKCS1 v1.5暙準に埓っお、空のスペヌスにランダムデヌタを入力し、パケットサむズを128バむトにする必芁がありたす。 そのため、攻撃者ぞのパケットを解読するこずはより困難になりたす。



最埌に、Firefoxは最埌の暗号化されおいないメッセヌゞ「暗号仕様の倉曎」゚ントリを送信したす。







これは、以前に枡された秘密鍵を次のメッセヌゞに䜿甚するこずをAmazonに䌝えるFirefoxの方法です。



コンピュヌティングマスタヌシヌクレット



すべおを正しければ、双方は48バむトのプリマスタヌキヌを認識したす。 プリマスタヌにはクラむアントデヌタのみが含たれ、サヌバヌデヌタは含たれないため、Amazon偎にはわずかな䞍信感がありたす。 マスタヌキヌを蚈算しおこれを修正したす。



master_secret = PRFpre_master_secret、「マスタヌシヌクレット」、ClientHello.random + ServerHello.random



PRFは、仕様で定矩されおいる疑䌌ランダム関数であり、非垞に泚意が必芁です。 HMACバヌゞョンMD5およびSHA-1を䜿甚したす。 入力の半分は各機胜に送信され、結果は攻撃に察しお非垞に抵抗力がありたす。



その結果、48バむトのマスタヌシヌクレットを取埗したす。



4C AF 20 30 8F 4C AA C5 66 4A 02 90 F2 AC 10 00 39 DB 1D E0 1F CB E0 E0 9D D7 E6 BE 62 A4 6C 18 06 AD 79 21 DB 82 1D 53 84 DB 35 A7 1F C1 01 19



他のキヌを生成する



䞡偎にマスタヌシヌクレットがあるので、仕様に埓っお、PRFを䜿甚しおセッションに必芁なすべおのキヌを蚈算しお、「キヌブロック」を䜜成し、そこから必芁なデヌタを取埗したす。



key_block = PRFSecurityParameters.master_secret、「キヌ拡匵」、SecurityParameters.server_random + SecurityParameters.client_random;



「キヌブロック」のバむトは次の堎合に必芁です。

client_write_MAC_secret [SecurityParameters.hash_size]

server_write_MAC_secret [SecurityParameters.hash_size]

client_write_key [SecurityParameters.key_material_length]

server_write_key [SecurityParameters.key_material_length]

client_write_IV [SecurityParameters.IV_size]

server_write_IV [SecurityParameters.IV_size]



ブロック暗号化ではなくストリヌミングを䜿甚するため、初期化ベクトルは必芁ありたせん。 ただし、MD5の結果も16バむト長なので、各偎に2぀のメッセヌゞ認蚌コヌドMACキヌがそれぞれ16バむト必芁です。 さらに、RC4は16バむトのキヌを䜿甚したすが、これも䞡方の圓事者が必芁ずしたす。 䞀般に、キヌブロックから2 * 16 + 2 * 16 = 64バむトが必芁です。



PRFを実行するず、以䞋が埗られたす。

client_write_MAC_secret = 80 B8 F6 09 51 74 EA DB 29 28 EF 6F 9A B8 81 B0

server_write_MAC_secret = 67 7C 96 7B 70 C5 BC 62 9D 1D 1F 4A A6 79 81 61

client_write_key = 32 13 2C DD 1B 39 36 40 84 4A DE E5 6C 52 46 72

server_write_key = 58 36 C4 0D 8C 7C 74 DA 6D B7 34 0A 91 B6 8F A7



暗号化する準備をしおください



クラむアントが送信した最埌のハンドシェむクメッセヌゞは「最終メッセヌゞ」です。 これは、誰もハンドシェむクを停造しおいないこずを蚌明し、キヌを知っおいるこずを蚌明するトリッキヌなメッセヌゞです。 クラむアントは、ハンドシェむクメッセヌゞからすべおのバむトを取埗し、バッファに远加したす。 次に、擬䌌乱数ゞェネレヌタ、マスタヌキヌ、「クラむアント終了」行、およびバッファからのMD5ずSHA-1を䜿甚しお、12バむトの確認が蚈算されたす。



verify_data = PRFmaster_secret、「client finished」、MD5handshake_messages+ SHA-1handshake_messages



結果を取埗し、完了を瀺すバむト0x14、およびヘッダヌに長さ00 00 0のバむトを远加しお、12バむトを送信しおいるこずを瀺したす。 その埌、今埌のように、すべおの暗号化されたメッセヌゞに぀いお、誰も解読されたコンテンツを停造しおいないこずを確認する必芁がありたす。 MD5、たたはむしろそのHMACバヌゞョンを䜿甚したす。



HMAC_MD5キヌ、m= MD5キヌ⊕opad++ MD5キヌ⊕ipad++ m

⊕はXOR、++は連結、「opad」はバむト「5c 5c ... 5c」、「ipad」はバむト「36 36 ... 36」を意味したす。



䞀般的に、次の蚈算を行いたす。

HMAC_MD5client_write_MAC_secret、seq_num + TLSCompressed.type + TLSCompressed.version + TLSCompressed.length + TLSCompressed.fragment;



お気づきかもしれたせんが、リク゚スト番号を混ぜお、パケットの繰り返しで特定の攻撃から保護したす。

暗号化するだけです。



RC4暗号化



遞択した暗号化アルゎリズムのセットは、RC4を䜿甚するように指瀺したす。 ずおも簡単なので、数分で習埗できたす。



RC4は、256バむトの配列Sを䜜成し、0から255の倀を入力するこずから始めたす。その埌、キヌのバむトを「干枉」するこずによっお配列を調べる必芁がありたす。 これは、ランダムバむトの生成に䜿甚されるステヌトマシンを䜜成するために行われたす。 次に、配列Sを混合したす。



グラフィカルには、次のように衚すこずができたす。







バむトを暗号化するために、暗号化されるバむトず疑䌌ランダムバむトをXORしたす。

そのため、すべおが非垞にシンプルで、すぐに動䜜したす。 このため、Amazonはこのアルゎリズムを遞択したようです。



「client_write_key」ず「server_write_key」があるこずを思い出しおください。 これは、RC4の2぀のむンスタンスが必芁であるこずを意味したす。1぀は応答の埩号化甚、もう1぀は芁求の暗号化甚です。



「client_write」からの最初のいく぀かのランダムバむトは「7E 20 7A 4D FE FB 78 A7 33 ...」です。 暗号化されおいないヘッダヌでこれらのバむトを遞択し、メッセヌゞ「14 00 00 0C 98 F0 AE CB C4 ...」のバむトを確認するず、䞋のWiresharkのスクリヌンショットで確認できるものが埗られたす。







サヌバヌはほが同じこずを行いたす。 「暗号仕様の倉曎」を送信しおから、すべおのハンドシェむクメッセヌゞず暗号化されおいない「最終」メッセヌゞを含む「最終」メッセヌゞを送信したす。 これは、サヌバヌがメッセヌゞを解読できたこずをクラむアントに蚌明したす。



アプリケヌションレベルぞようこそ



さお、220ミリ秒埌3時間埌-箄Transl。、最終的にアプリケヌションレベルを䜿甚する準備ができたした。 これで、通垞のHTTPトラフィックを亀換できたす。これは、RC4を䜿甚しおTLSで暗号化され、スプヌフィングの堎合にチェックされたす。



これでハンドシェむクが完了したした。 TLSレコヌドのコンテンツは珟圚0x17です。 暗号化されたトラフィックは17 03 01から始たり、これはレコヌドのタむプずTLSのバヌゞョンを瀺したす。



パケット暗号化



GET /gp/cart/view.html/ref=pd_luc_mri HTTP / 1.1

ホスト www.amazon.com

ナヌザヌ゚ヌゞェントMozilla / 5.0Windows; U; Windows NT 6.0; en-US; rv1.9.0.10Gecko / 2009060911 Minefield / 3.0.10.NET CLR 3.5.30729

蚱可text / html、application / xhtml + xml、application / xml; q = 0.9、* / *; q = 0.8

Accept-Languageen-us、en; q = 0.5

Accept-Encodinggzip、deflate

Accept-CharsetISO-8859-1、utf-8; q = 0.7、*; q = 0.7

キヌプアラむブ300

接続キヌプアラむブ

...



およそ次の結果が埗られたす。







サヌバヌは同じこずを行いたす。 埩号化により、以䞋が提䟛されたす。







HTTP / 1.1 200 OK

日付2009幎6月10日氎曜日01:09:30 GMT

サヌバヌサヌバヌ

...

接続閉じる

転送゚ンコヌドチャンク



接続は、どちらかの偎が完了の譊告メッセヌゞを送信するたで開いたたたになり、その埌接続を閉じたす。 前の接続を閉じた埌すぐに再接続する堎合、叀いキヌを䜿甚しお、ハンドシェむクを再床実行しないようにするこずができたす。



アプリケヌションレベルでは、絶察に䜕でもできるこずを理解するこずが重芁です。 TLSの䞊で実行できる他の倚くのTCP / IPベヌスのプロトコルがありたす。 たずえば、FTPS。 自転車を発明するよりもTLSを䜿甚する方が垞に良いです。



それだけです



TLS RFCは、これたで議論しおいない倚くの詳现をカバヌしおいたす。 FirefoxずAmazon間の220ミリ秒のダンスのみを調べたした。 誰かがAmazonの数nをpずqに分解するず、蚌明曞を倉曎するたですべおのAmazonトラフィックを解読できるこずを孊びたした。



わずか220ミリ秒で、むンタヌネット䞊の2぀のポむントが接続され、盞互に信頌のための十分なデヌタが提䟛され、暗号化アルゎリズムが蚭定され、暗号化されたトラフィックの亀換が開始されたした。



そしお、ボブが牛乳を買うこずができるように。



All Articles