2010-12-02 22 views
5

मैं वर्तमान में सुरक्षा और क्रिप्टोग्राफी पर विश्वविद्यालय की कक्षा ले रहा हूं, और हमारी परियोजनाओं में से एक मूलभूत टीएलएस सॉकेट लागू करना शामिल है।टीएलएस/एसएसएल प्रोटोकॉल को समझना

इसलिए, मैंने अपनी पाठ्यपुस्तक के साथ-साथ नवीनतम RFC दोनों का उपयोग करके टीएलएस प्रोटोकॉल का अध्ययन किया है, इसलिए मुझे टीएलएस/एसएसएल कैसे काम करता है, और यह भी कि टीएलएस रिकॉर्ड प्रारूप कैसे रखा गया है, बाइट के बारे में बहुत अच्छी समझ है -by-बाइट।

तो, शुरू करने के लिए मैंने एक सर्वर प्रोग्राम लिखने का फैसला किया जो पोर्ट 443 पर सुनता है और आने वाले सुरक्षित HTTP कनेक्शन स्वीकार करता है। यह सब क्लाइंट कनेक्शन स्वीकार करता है और फिर क्लाइंट द्वारा भेजे गए प्रारंभिक संदेश के हेक्स डंप को प्रिंट करता है।

लेकिन जब मैं एक वेब ब्राउज़र (फ़ायरफ़ॉक्स) का उपयोग कर अपने सर्वर से कनेक्ट करता हूं, तो मैं पूरी तरह से बैकस्ट्रीम द्वारा परेशान हूं ब्राउज़र ब्राउज़र भेजता है। According to the RFC, पहली बात यह है कि एक टीएलएस क्लाइंट को ClientHello संदेश भेजना होगा। सभी संदेशों को एक टीएलएस रिकॉर्ड प्रारूप है, जो इस प्रारूप में होना माना जाता है में समाहित किया जाना चाहिए (सी-ish अंकन आरएफसी का उपयोग करता है का उपयोग करते हुए):

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

ContentType क्षेत्र एक भी enum मूल्य है कि एक होना चाहिए है change_cipher_spec = 0x14, alert = 0x15, handshake = 0x16, application_data = 0x17

तो, पहली बात यह है एक ग्राहक करना चाहिए एक ClientHello संदेश है, जो हाथ मिलाना का हिस्सा है भेजने के बाद से, मैं bytestream में बहुत पहले बाइट एक 0x16 होने की उम्मीद थी, यह दर्शाता है: निम्नलिखित प्रकार के यह एक हैंडशेक संदेश है।

लेकिन बजाय, वास्तविक bytestream अपने ब्राउज़र भेजता है:

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 

मैं घंटों के लिए आरएफसी से अधिक डालने का कार्य करने के बाद भी इस bytestream का कोई मतलब नहीं कर सकते हैं। टीएलएस के बारे में जो कुछ भी मैंने पढ़ा है, वह मुझे बताता है कि पहला बाइट एक हैंडशेक इंगित करने के लिए 0x16 होना चाहिए, उसके बाद दो-बाइट संस्करण फ़ील्ड, उसके बाद दो-बाइट रिकॉर्ड लम्बाई क्षेत्र हो। लेकिन यह बाइट-स्ट्रीम 0x80 0x55 से शुरू होता है, जो मेरे लिए व्यर्थ है।

कोई भी यहां क्या हो रहा है इसे साफ़ कर सकता है? क्या मैं टीएलएस प्रोटोकॉल के कुछ हिस्से को गलत समझ रहा हूं?

उत्तर

9

जो आप देख रहे हैं वह SSL संस्करण 2 संगत हैलो है। appendix E of RFC 5246 पर देखें। मुझे विश्वास नहीं है कि फ़ायरफ़ॉक्स के नवीनतम संस्करण इसे भेजेंगे, वे केवल वी 3 हैलो प्रारूप भेज देंगे जो आप उम्मीद कर रहे थे।

5

वायर्सहार्क में एचटीटीपीएस/टीएलएस/एसएसएल के लिए एक पार्सर है, यह हैंडशेक के सादा पाठ भाग को समझने में सक्षम होगा।

यह भी सुनिश्चित करें कि The First few milliseconds of an HTTPS connectio n पढ़ना सुनिश्चित करें।

+0

भयानक स्रोत, thx! – kraiz

संबंधित मुद्दे