On the Wire: Network Capture Tools for API Developers

लेन लियाब्रेटन, Google Data APIs टीम
जून 2007

परिचय

वेब सेवाओं के साथ इंटरैक्ट करने वाले ऐप्लिकेशन डेवलप करने में कई तरह की समस्याएं आती हैं. अक्सर यह पता नहीं चल पाता कि सर्वर को कौनसा मैसेज भेजा गया था या कौनसा जवाब मिला था. कुछ ऐसे बग होते हैं जिन्हें ट्रैक करना बहुत मुश्किल होता है. ऐसा इसलिए होता है, क्योंकि हम सर्वर को जो डेटा भेज रहे हैं और जो डेटा असल में भेजा जा रहा है उसमें अंतर होता है.

इस लेख में, ऐसे कई टूल के बारे में बताया गया है जिनकी मदद से, वायर पर मौजूद डेटा को ज़्यादा आसानी से देखा जा सकता है और उसे ज़्यादा काम का बनाया जा सकता है. इन टूल को आम तौर पर "पैकेट स्निफ़र" कहा जाता है. ये आपके नेटवर्क इंटरफ़ेस पर मौजूद सभी नेटवर्क पैकेट कैप्चर करते हैं. इन पैकेट के कॉन्टेंट की जांच करना और यह देखना कि इन्हें किस क्रम में भेजा और पाया गया, डीबग करने का एक उपयोगी तरीका हो सकता है.

उदाहरण: सार्वजनिक फ़ीड वापस पाना

मैंने दान के लिए साइक्लिंग करने वाली एक टीम बनाई है. साथ ही, मैंने इवेंट के लिए एक कैलेंडर बनाया है. जैसे, जानकारी देने वाले सेशन, टीम के लिए फ़ंड इकट्ठा करने वाले इवेंट, और ट्रेनिंग के लिए साइक्लिंग. मैंने इस कैलेंडर को सार्वजनिक किया है, ताकि टीम के सदस्य और अन्य राइडर कैलेंडर देख सकें और इवेंट में हिस्सा ले सकें. मुझे आने वाले इवेंट की जानकारी देने वाला एक न्यूज़लेटर भी भेजना है. इसलिए, Google Calendar की वेबसाइट से जानकारी कॉपी करने के बजाय, मैं इस कैलेंडर को क्वेरी करने और इवेंट वापस पाने के लिए, Google Calendar Data API का इस्तेमाल कर सकता/सकती हूं.

Google Calendar API के दस्तावेज़ में, RESTful Google Data API का इस्तेमाल करके, प्रोग्राम के हिसाब से अपने कैलेंडर के साथ इंटरैक्ट करने के तरीके के बारे में जानकारी दी गई है. (संपादक का नोट: v3 से, Google Calendar API अब Google डेटा फ़ॉर्मैट का इस्तेमाल नहीं करता.) सबसे पहले, कैलेंडर की सेटिंग वाले पेज पर मौजूद बटन पर क्लिक करके, कैलेंडर के इवेंट फ़ीड का यूआरएल पाएं:

http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic

Google Calendar के दस्तावेज़ को रेफ़रंस के तौर पर इस्तेमाल करके, मैं इस तरह से कैलेंडर इवेंट वापस पा सकता हूं और उन्हें दिखा सकता हूं. यहां PUBLIC_FEED_URL में इवेंट फ़ीड का यूआरएल होता है.

CalendarService myService = new CalendarService("exampleCo-fiddlerExample-1");
final String PUBLIC_FEED_URL = "http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic";
URL feedUrl = new URL(PUBLIC_FEED_URL);
CalendarEventFeed resultFeed = myService.getFeed(feedUrl, CalendarEventFeed.class);

System.out.println("All events on your calendar:");
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
  CalendarEventEntry entry = resultFeed.getEntries().get(i);
  System.out.println("\t" + entry.getTitle().getPlainText());
}
System.out.println();

इससे मेरे कैलेंडर पर मौजूद इवेंट की एक सामान्य सूची मिलती है:

All events on your calendar:
    MS150 Training ride
    Meeting with Nicole
    MS150 Information session

ऊपर दिए गए कोड स्निपेट में, कैलेंडर इवेंट के टाइटल दिख रहे हैं. हालांकि, सर्वर से मिले बाकी डेटा का क्या होगा? Java क्लाइंट लाइब्रेरी से, फ़ीड या एंट्री को XML के तौर पर आउटपुट करना आसान नहीं होता. अगर ऐसा हो भी जाता है, तो XML पूरी जानकारी नहीं होती. अनुरोध के साथ भेजे गए एचटीटीपी हेडर के बारे में क्या जानकारी है? क्या क्वेरी को प्रॉक्सी किया गया था या रीडायरेक्ट किया गया था? ज़्यादा जटिल कार्रवाइयों के लिए, ये सवाल ज़्यादा अहम हो जाते हैं. ऐसा तब होता है, जब कोई गड़बड़ी होती है और हमें गड़बड़ी के मैसेज मिलते हैं. पैकेट स्निफ़िंग सॉफ़्टवेयर, नेटवर्क ट्रैफ़िक का पता लगाकर इन सवालों के जवाब दे सकता है.

tcpdump

tcpdump एक कमांड लाइन टूल है, जो Unix जैसे प्लैटफ़ॉर्म पर काम करता है. हालांकि, Windows के लिए भी एक पोर्ट उपलब्ध है, जिसे WinDump कहा जाता है. ज़्यादातर पैकेट स्निफ़र की तरह, tcpdump भी आपके नेटवर्क कार्ड को प्रॉमिसक्यूअस मोड में डाल देता है. इसके लिए, सुपरयूज़र के पास खास अधिकार होने चाहिए. tcpdump का इस्तेमाल करने के लिए, सिर्फ़ उस नेटवर्क इंटरफ़ेस के बारे में बताएं जिस पर आपको सुनना है. इसके बाद, नेटवर्क ट्रैफ़िक को stdout पर भेज दिया जाएगा:

sudo tcpdump -i eth0

इस कमांड को चलाने पर, आपको हर तरह का नेटवर्क ट्रैफ़िक मिलेगा. इसमें से कुछ को तो आप पहचान भी नहीं पाएंगे. आउटपुट को किसी फ़ाइल में फ़ॉरवर्ड किया जा सकता है और बाद में grep किया जा सकता है. हालांकि, इससे बहुत बड़ी फ़ाइलें बन सकती हैं. ज़्यादातर पैकेट कैप्चर सॉफ़्टवेयर में, फ़िल्टर करने के कुछ तरीके पहले से मौजूद होते हैं. इससे सिर्फ़ ज़रूरी डेटा कैप्चर किया जाता है.

tcpdump, नेटवर्क ट्रैफ़िक की अलग-अलग विशेषताओं के आधार पर फ़िल्टर करने की सुविधा देता है. उदाहरण के लिए, tcpdump को सिर्फ़ पोर्ट 80 (एचटीटीपी मैसेज) पर आपके सर्वर से आने या जाने वाले ट्रैफ़िक को कैप्चर करने के लिए कहा जा सकता है. इसके लिए, अपने सर्वर का होस्टनेम इस एक्सप्रेशन में डालें:

dst or src host <hostname> and port 80

फ़िल्टर एक्सप्रेशन से मेल खाने वाले हर पैकेट के लिए, tcpdump एक टाइमस्टैंप, पैकेट का सोर्स और डेस्टिनेशन, और कई टीसीपी फ़्लैग दिखाएगा. यह जानकारी अहम हो सकती है, क्योंकि इससे पता चलता है कि पैकेट किस क्रम में भेजे और पाए गए.

पैकेट के कॉन्टेंट को देखना भी अक्सर फ़ायदेमंद होता है. '-A' फ़्लैग, tcpdump को हर पैकेट को ASCII में प्रिंट करने के लिए कहता है. इससे एचटीटीपी हेडर और मैसेज का मुख्य हिस्सा दिखता है. '-s' फ़्लैग का इस्तेमाल यह तय करने के लिए किया जाता है कि कितने बाइट दिखाए जाएं. '-s 0' का मतलब है कि मैसेज के मुख्य हिस्से को छोटा न किया जाए.

इन सभी को एक साथ रखने पर, हमें यह कमांड मिलती है:

sudo tcpdump -A -s 0 -i eth0 dst or src host <hostname> and port 80

इस कमांड को चलाने के बाद, ऊपर दिए गए .Java के छोटे उदाहरण को लागू करें. इससे आपको इस ऑपरेशन में शामिल सभी नेटवर्क कम्यूनिकेशन दिखेंगे. आपको ट्रैफ़िक में एचटीटीपी GET अनुरोध दिखेगा:

22:22:30.870771 IP dellalicious.mshome.net.4520 > po-in-f99.google.com.80: P 1:360(359) ack 1 win 65535
E.....@....\...eH..c...P.=.....zP......GET /calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic HTTP/1.1
User-Agent: exampleCo-fiddlerExample-1 GCalendar-Java/1.0.6 GData-Java/1.0.10(gzip)
Accept-Encoding: gzip
Cache-Control: no-cache
Pragma: no-cache
Host: www.google.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

आपको 200 OK जवाब वाला मैसेज भी दिखेगा, जिसमें Google डेटा फ़ीड शामिल होगा. ध्यान दें कि फ़ीड को चार पैकेट में बांटा गया है:

22:22:31.148789 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 1:1431(1430) ack 360 win 6432
E...1 ..2.I.H..c...e.P.....z.=.:P..M...HTTP/1.1 200 OK
Content-Type: application/atom+xml; charset=UTF-8
Cache-Control: max-age=0, must-revalidate, private
Last-Modified: Mon, 11 Jun 2007 15:11:40 GMT
Transfer-Encoding: chunked
Date: Sun, 24 Jun 2007 02:22:10 GMT
Server: GFE/1.3

13da
<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom'
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gCal='http://sc
hemas.google.com/gCal/2005' xmlns:gd='http://schemas.google.com/g/2005'><id>http
://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.goo
gle.com/public/basic</id><updated>2007-06-11T15:11:40.000Z</updated><category sc
heme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/g/2
005#event'></category><title type='text'>MS150 Training Schedule</title><subtitl
e type='text'>This calendar is public</subtitle><link rel='http://schemas.google
.com/g/2005#feed' type='application/atom+xml' href='http://www.google.com/calend
ar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic'></
link><link rel='self' type='application/atom+xml' href='http://www.google.com/ca
lendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic
?max-results=25'></link><author><name>Lane LiaBraaten</name><email>api.lliabraa@
gmail.com</email></author><generator version='1.0' uri='http://www.google.com/ca
lendar'>Google Calendar</generator><openSearch:totalRe


22:22:31.151501 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 1431:2861(1430) ack 360 win 6432
E...1!..2.I.H..c...e.P.......=.:P.. 2...sults>3</openSearch:totalResults><openSe
arch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch
:itemsPerPage><gd:where valueString=''></gd:where><gCal:timezone value='America/
Los_Angeles'></gCal:timezone><entry><id>http://www.google.com/calendar/feeds/24v
j3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/dgt40022cui2k3j
740hnj46744</id><published>2007-06-11T15:11:05.000Z</published><updated>2007-06-
11T15:11:05.000Z</updated><category scheme='http://schemas.google.com/g/2005#kin
d' term='http://schemas.google.com/g/2005#event'></category><title type='text'>M
S150 Training ride</title><summary type='html'>When: Sat Jun 9, 2007 7am to 10am

&amp;nbsp; PDT&lt;br&gt;   &lt;br&gt;Event Status:     confirmed</summary><conte
nt type='text'>When: Sat Jun 9, 2007 7am to 10am&amp;nbsp; PDT&lt;br&gt;   &lt;b
r&gt;Event Status:     confirmed</content><link rel='alternate' type='text/html'
 href='http://www.google.com/calendar/event?eid=ZGd0NDAwMjJjdWkyazNqNzQwaG5qNDY3
NDQgMjR2ajNtNXBsMTI1YmgyaWpiYm5laDk1M3NAZw' title='alternate'></link><link rel='
self' type='application/atom+xml' href='http://www.google.com/calendar/feeds/24v
j3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/dgt40022cui2k3j
740hnj46744'></link><author><name>MS150 Training Schedule</name></author><gCal:s
endEventNotifications value='false'></gCal:sendEventNotifications></entry><entry

><id>http://www.google.com/cal

22:22:31.153097 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: . 2861:4291(1430) ack 360 win 6432
E...1#..2.I.H..c...e.P.......=.:P.. ....endar/feeds/24vj3m5pl125bh2ijbbneh953s%4
0group.calendar.google.com/public/basic/51d8kh4s3bplqnbf1lp6p0kjp8</id><publishe
d>2007-06-11T15:08:23.000Z</published><updated>2007-06-11T15:10:39.000Z</updated
><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.g
oogle.com/g/2005#event'></category><title type='text'>Meeting with Nicole</title

><summary type='html'>When: Mon Jun 4, 2007 10am to 11am&amp;nbsp; PDT&lt;br&gt;
  &lt;br&gt;Where: Conference Room B &lt;br&gt;Event Status:     confirmed</summ
ary><content type='text'>When: Mon Jun 4, 2007 10am to 11am&amp;nbsp; PDT&lt;br&
gt;  &lt;br&gt;Where: Conference Room B &lt;br&gt;Event Status:     confirmed

&lt;br&gt;Event Description: Discuss building cycling team for MS150</content><l
ink rel='alternate' type='text/html' href='http://www.google.com/calendar/event?
eid=NTFkOGtoNHMzYnBscW5iZjFscDZwMGtqcDggMjR2ajNtNXBsMTI1YmgyaWpiYm5laDk1M3NAZw'
title='alternate'></link><link rel='self' type='application/atom+xml' href='http
://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.calendar.goo
gle.com/public/basic/51d8kh4s3bplqnbf1lp6p0kjp8'></link><author><name>MS150 Trai
ning Schedule</name></author><gCal:sendEventNotifications value='false'></gCal:s
endEventNotifications></entry><entry><id>http://www.google.com/calendar/feeds/24
vj3m5pl125bh2ijbbneh953s%40group.calendar.google.com/public/basic/va41amq3r08dhh
kpm3lc1abs2o</id><published>20


22:22:31.190244 IP po-in-f99.google.com.80 > dellalicious.mshome.net.4520: P 4291:5346(1055) ack 360 win 6432
E..G1$..2.K.H..c...e.P.....<.=.:P.. ....07-06-11T15:10:08.000Z</published><updat
ed>2007-06-11T15:10:08.000Z</updated><category scheme='http://schemas.google.com
/g/2005#kind' term='http://schemas.google.com/g/2005#event'></category><title ty
pe='text'>MS150 Information session</title><summary type='html'>When: Wed Jun 6,
 2007 4pm to Wed Jun 6, 2007 5pm&amp;nbsp; PDT&lt;br&gt;   &lt;br&gt;Event Statu
s:     confirmed</summary><content type='text'>When: Wed Jun 6, 2007 4pm to Wed
Jun 6, 2007 5pm&amp;nbsp; PDT&lt;br&gt;   &lt;br&gt;Event Status:     confirmed<

/content><link rel='alternate' type='text/html' href='http://www.google.com/cale
ndar/event?eid=dmE0MWFtcTNyMDhkaGhrcG0zbGMxYWJzMm8gMjR2ajNtNXBsMTI1YmgyaWpiYm5la
Dk1M3NAZw' title='alternate'></link><link rel='self' type='application/atom+xml'
 href='http://www.google.com/calendar/feeds/24vj3m5pl125bh2ijbbneh953s%40group.c
alendar.google.com/public/basic/va41amq3r08dhhkpm3lc1abs2o'></link><author><name
>MS150 Training Schedule</name></author><gCal:sendEventNotifications value='fals
e'></gCal:sendEventNotifications></entry></feed>

इस आउटपुट में सभी एचटीटीपी हेडर और कॉन्टेंट के साथ-साथ कई मुश्किल टीसीपी फ़्लैग शामिल हैं. यहां सारा डेटा मौजूद है, लेकिन इसे पढ़ना और समझना मुश्किल है. ऐसे कई ग्राफ़िकल टूल उपलब्ध हैं जिनकी मदद से इस डेटा को आसानी से देखा जा सकता है.

WireShark (पहले इसका नाम Ethereal था)

Wireshark का स्क्रीन कैप्चर
WireShark, नेटवर्क ट्रैफ़िक को कई तरीकों से दिखाता है.

WireShark, libpcap की मदद से बनाया गया एक ग्राफ़िकल टूल है. tcpdump भी इसी लाइब्रेरी की मदद से बनाया गया है. यह Linux, Mac OS X, और Windows पर उपलब्ध है. WireShark के जीयूआई की मदद से, पैकेट कैप्चर डेटा को समझने और उससे इंटरैक्ट करने के कई नए तरीके मिलते हैं. उदाहरण के लिए, आपके नेटवर्क इंटरफ़ेस से कैप्चर किए गए पैकेट, इस्तेमाल किए जा रहे प्रोटोकॉल के आधार पर अलग-अलग रंगों में दिखाए जाते हैं. ट्रैफ़िक को टाइमस्टैंप, सोर्स, डेस्टिनेशन, और प्रोटोकॉल के हिसाब से भी क्रम से लगाया जा सकता है.

अगर पैकेट की सूची में कोई लाइन चुनी जाती है, तो Wireshark, पैकेट हेडर में आईपी, टीसीपी, और प्रोटोकॉल से जुड़ी अन्य जानकारी को, आसानी से पढ़े जा सकने वाले ट्री में दिखाएगा. यह डेटा, स्क्रीन पर सबसे नीचे HEX और ASCII फ़ॉर्मैट में भी दिखता है.

WireShark के विज़ुअल नेचर की वजह से, नेटवर्क ट्रैफ़िक को समझना आसान हो जाता है. हालांकि, ज़्यादातर मामलों में आपको नेटवर्क ट्रैफ़िक को फ़िल्टर करना होगा. WireShark में फ़िल्टर करने की बेहतरीन सुविधाएं हैं. इसमें सैकड़ों प्रोटोकॉल के लिए भी सहायता उपलब्ध है.

अहम जानकारी: उपलब्ध प्रोटोकॉल देखने और मुश्किल फ़िल्टर बनाने के लिए, WireShark विंडो में सबसे ऊपर मौजूद बटन पर क्लिक करें.

ऊपर दिए गए tcpdump उदाहरण में इस्तेमाल किए गए फ़िल्टर को फिर से बनाने के लिए, WireShark के फ़िल्टर बॉक्स में यह एक्सप्रेशन डालें:

ip.addr==<your IP address> && tcp.port==80

इसके अलावा, एचटीटीपी के बारे में WireShark की जानकारी का इस्तेमाल करें:

ip.addr==<your IP address> && http

इससे, कैप्चर किए गए डेटा को फ़िल्टर करके सिर्फ़ उन पैकेट को दिखाया जाएगा जो Google Calendar सर्वर के साथ इस इंटरैक्शन में शामिल हैं. हर पैकेट पर क्लिक करके, उसके कॉन्टेंट को देखा जा सकता है. साथ ही, लेन-देन की जानकारी को एक साथ देखा जा सकता है.

सलाह: किसी एक पैकेट पर राइट क्लिक करके, "टीसीपी स्ट्रीम को फ़ॉलो करें" को चुनें. इससे, अनुरोध और जवाब एक ही विंडो में क्रम से दिखेंगे.

WireShark, कैप्चर की गई जानकारी को सेव करने के कई तरीके उपलब्ध कराता है. आपके पास एक, कुछ या सभी पैकेट सेव करने का विकल्प होता है. अगर टीसीपी स्ट्रीम देखी जा रही है, तो सिर्फ़ काम के पैकेट सेव करने के लिए, "Save As" बटन पर क्लिक करें. tcpdump कैप्चर से मिले आउटपुट को भी इंपोर्ट किया जा सकता है और WireShark में देखा जा सकता है.

समस्या: एसएसएल और एन्क्रिप्शन

पैकेट कैप्चर करने वाले टूल की एक आम समस्या यह है कि वे एसएसएल कनेक्शन पर एन्क्रिप्ट (सुरक्षित) किए गए डेटा को नहीं देख पाते. ऊपर दिए गए उदाहरण में, सार्वजनिक फ़ीड को ऐक्सेस किया गया है. इसलिए, एसएसएल की ज़रूरत नहीं है. हालांकि, अगर उदाहरण में किसी निजी फ़ीड को ऐक्सेस किया गया है, तो क्लाइंट को Google की पुष्टि करने वाली सेवा से पुष्टि करानी होगी. इसके लिए, एसएसएल कनेक्शन की ज़रूरत होती है.

यहां दिया गया स्निपेट, पिछले उदाहरण जैसा ही है. हालांकि, इसमें CalendarService उपयोगकर्ता के कैलेंडर मेटाफ़ीड का अनुरोध करता है. यह एक निजी फ़ीड है, जिसके लिए पुष्टि करना ज़रूरी है. पुष्टि करने के लिए, बस setUserCredentials तरीके को कॉल करें. यह तरीका, ClientLogin सेवा को एचटीटीपीएस अनुरोध ट्रिगर करता है और जवाब से पुष्टि करने का टोकन लेता है. इसके बाद, CalendarService ऑब्जेक्ट, पुष्टि करने वाले टोकन को बाद के सभी अनुरोधों में शामिल करेगा.

CalendarService myService = new CalendarService("exampleCo-fiddlerSslExample-1");
myService.setUserCredentials(username, userPassword);
final String METAFEED_URL = "http://www.google.com/calendar/feeds/default";
URL feedUrl = new URL(METAFEED_URL);
CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class);

System.out.println("Your calendars:");
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
  CalendarEntry entry = resultFeed.getEntries().get(i);
  System.out.println("\t" + entry.getTitle().getPlainText());
}
System.out.println();

निजी Google Data API फ़ीड की पुष्टि करने और उसे ऐक्सेस करने के लिए, ज़रूरी नेटवर्क ट्रैफ़िक के बारे में जानें:

  1. ClientLogin सेवा को उपयोगकर्ता के क्रेडेंशियल सबमिट करें
    • https://www.google.com/accounts/ClientLogin पर एचटीटीपी POST अनुरोध भेजें. इसके मैसेज बॉडी में ये पैरामीटर शामिल करें:
      • ईमेल - उपयोगकर्ता का ईमेल पता.
      • Passwd - उपयोगकर्ता का पासवर्ड.
      • source - इससे आपके क्लाइंट ऐप्लिकेशन की पहचान होती है. यह companyName-applicationName-versionID के फ़ॉर्मैट में होना चाहिए. उदाहरणों में, ExampleCo-FiddlerSSLExample-1 नाम का इस्तेमाल किया गया है.
      • service - Google Calendar सेवा का नाम 'cl' है.
  2. ऑथराइज़ेशन टोकन पाना
    • अगर पुष्टि करने का अनुरोध पूरा नहीं होता है, तो आपको एचटीटीपी 403 ऐक्सेस नहीं दिया जा सका स्टेटस कोड मिलेगा.
    • अगर अनुरोध पूरा हो जाता है, तो सेवा से मिलने वाला रिस्पॉन्स, एचटीटीपी 200 OK स्टेटस कोड होता है. साथ ही, रिस्पॉन्स के मुख्य हिस्से में तीन लंबे अल्फ़ान्यूमेरिक कोड होते हैं: SID, LSID, और Auth. Auth वैल्यू, अनुमति देने वाला टोकन है.
  3. निजी कैलेंडर के मेटाफ़ीड का अनुरोध करें
    • यहां दिए गए हेडर के साथ, http://www.google.com/calendar/feeds/default पर एचटीटीपी GET भेजें:
    • Authorization: GoogleLogin auth=<yourAuthToken>
      

इस स्निपेट को चलाकर देखें. साथ ही, WireShark में नेटवर्क ट्रैफ़िक देखें. इसके लिए, फ़िल्टर के तौर पर 'http || ssl' का इस्तेमाल करें. आपको लेन-देन में शामिल एसएसएल और टीएलएस पैकेट दिखेंगे. हालांकि, ClientLogin अनुरोध और जवाब वाले पैकेट, "ऐप्लिकेशन डेटा" पैकेट में एन्क्रिप्ट (सुरक्षित) किए जाते हैं. चिंता न करें, अब हम एक ऐसे टूल के बारे में जानेंगे जो एन्क्रिप्ट (सुरक्षित) की गई इस जानकारी को दिखा सकता है.

Fiddler

Fiddler भी एक ग्राफ़िकल पैकेट स्निफ़िंग टूल है. हालांकि, यह अब तक बताए गए टूल से काफ़ी अलग तरीके से काम करता है. Fiddler, आपके ऐप्लिकेशन और उन रिमोट सेवाओं के बीच प्रॉक्सी के तौर पर काम करता है जिनसे आपको इंटरैक्ट करना है. इस तरह, यह मैन-इन-द-मिडल बन जाता है. Fiddler, आपके ऐप्लिकेशन और रिमोट वेब सेवा, दोनों के साथ SSL कनेक्शन बनाता है. यह एक एंडपॉइंट से ट्रैफ़िक को डिक्रिप्ट करता है, प्लेनटेक्स्ट को कैप्चर करता है, और फिर ट्रैफ़िक को दोबारा एन्क्रिप्ट करके भेजता है. माफ़ करें, Fiddler सिर्फ़ Windows के लिए उपलब्ध है. Mac और Linux का इस्तेमाल करने वाले लोगों के लिए यह उपलब्ध नहीं है.

ध्यान दें: एसएसएल के साथ काम करने के लिए, Fiddler का वर्शन 2 और .NET Framework का वर्शन 2.0 ज़रूरी है.

Fiddler में नेटवर्क ट्रैफ़िक देखने के लिए, ज़्यादातर Session Inspector टैब का इस्तेमाल किया जाता है. Google Data API से जुड़ी समस्याओं को डीबग करने के लिए, ये सब-टैब सबसे ज़्यादा काम के होते हैं:

  • हेडर - इसमें एचटीटीपी हेडर को छोटा किए जा सकने वाले ट्री फ़ॉर्मैट में दिखाया जाता है.
  • Auth - इससे पुष्टि करने वाले हेडर दिखते हैं.
  • रॉ - नेटवर्क पैकेट के कॉन्टेंट को ASCII टेक्स्ट में दिखाता है

अहम जानकारी: कैप्चर करने की सुविधा को चालू और बंद करने के लिए, Fiddler विंडो के सबसे नीचे बाईं ओर मौजूद आइकॉन पर क्लिक करें.

Fiddler, .NET फ़्रेमवर्क का इस्तेमाल करके नेटवर्क कनेक्शन कॉन्फ़िगर करता है, ताकि Fiddler को प्रॉक्सी के तौर पर इस्तेमाल किया जा सके. इसका मतलब है कि Internet Explorer या .NET कोड से बनाए गए सभी कनेक्शन, Fiddler में डिफ़ॉल्ट रूप से दिखेंगे. हालांकि, ऊपर दिए गए Java सैंपल से मिला ट्रैफ़िक नहीं दिखेगा, क्योंकि Java में एचटीटीपी प्रॉक्सी सेट अप करने का तरीका अलग होता है.

Java में, सिस्टम प्रॉपर्टी का इस्तेमाल करके एचटीटीपी प्रॉक्सी सेट की जा सकती है. Fiddler, पोर्ट 8888 पर चलता है. इसलिए, लोकल इंस्टॉलेशन के लिए, इन लाइनों को जोड़कर Java कोड को एचटीटीपी और एचटीटीपीएस के लिए Fiddler को प्रॉक्सी के तौर पर इस्तेमाल करने के लिए सेट किया जा सकता है:

System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "8888");

इन लाइनों के साथ सैंपल चलाने पर, आपको Java सुरक्षा पैकेज से एक स्टैक ट्रेस मिलेगा:

[java] Caused by:
  sun.security.validator.ValidatorException: PKIX path building failed:
  sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Fiddler का स्क्रीन कैप्चर
Fiddler, एसएसएल ट्रैफ़िक को डिक्रिप्ट करके दिखा सकता है.

यह गड़बड़ी तब होती है, जब एसएसएल कनेक्शन में सर्वर से मिले सर्टिफ़िकेट की पुष्टि नहीं की जा सकती. इस मामले में, खराब सर्टिफ़िकेट Fiddler से आ रहा है, जो मैन-इन-द-मिडल के तौर पर काम कर रहा है. Fiddler, सर्टिफ़िकेट जनरेट करता है. Fiddler एक भरोसेमंद जारीकर्ता नहीं है. इसलिए, इन सर्टिफ़िकेट की वजह से Java, एसएसएल कनेक्शन सेट अप नहीं कर पाएगा.

ध्यान दें: Fiddler के चालू होने पर, Internet Explorer में बनाए गए किसी भी एसएसएल कनेक्शन से 'सुरक्षा से जुड़ी सूचना' ट्रिगर होगी. इसमें आपसे पूछा जाएगा कि क्या आपको संदिग्ध सर्टिफ़िकेट के बावजूद आगे बढ़ना है. Fiddler की ओर से जनरेट किया गया सर्टिफ़िकेट देखने के लिए, 'सर्टिफ़िकेट देखें' पर क्लिक करें.

तो इस सुरक्षा अपवाद से कैसे बचा जा सकता है? आपको Java के सुरक्षा फ़्रेमवर्क को फिर से कॉन्फ़िगर करना होगा, ताकि सभी सर्टिफ़िकेट पर भरोसा किया जा सके. अच्छी बात यह है कि आपको यहां कुछ नया करने की ज़रूरत नहीं है. फ़्रांसिस लैब्रि का समाधान देखें और ऊपर दिए गए उदाहरण में SSLUtilities.trustAllHttpsCertificates() तरीका जोड़ें.

Java को Fiddler का इस्तेमाल प्रॉक्सी के तौर पर करने के लिए कॉन्फ़िगर करने और डिफ़ॉल्ट सर्टिफ़िकेट की पुष्टि करने की सुविधा बंद करने के बाद, उदाहरण को चलाया जा सकता है. साथ ही, पूरा ट्रैफ़िक देखा जा सकता है, जिसे वायर पर सादे टेक्स्ट में भेजा जाता है. मेरा पासवर्ड मत चुराओ!

ध्यान रखें कि पुष्टि करने के लिए किया गया यह लेन-देन, एसएसएल ट्रैफ़िक का सिर्फ़ एक छोटा सा उदाहरण है. कुछ वेब ऐप्लिकेशन सिर्फ़ एसएसएल कनेक्शन का इस्तेमाल करते हैं. इसलिए, डेटा को डिक्रिप्ट करने का कोई तरीका न होने पर, एचटीटीपी ट्रैफ़िक को डीबग नहीं किया जा सकता.

नतीजा

tcpdump, Linux, Mac OS X, और Windows पर उपलब्ध है. अगर आपको पता है कि आपको क्या खोजना है और आपको सिर्फ़ डेटा को तुरंत कैप्चर करना है, तो यह एक बेहतरीन टूल है. हालांकि, कुछ ग्राफ़िकल टूल ऐसे होते हैं जो नेटवर्क ट्रैफ़िक को ऐसे फ़ॉर्मैट में दिखाते हैं जिसे समझना आसान होता है. tcpdump में यहां बताए गए विकल्पों और फ़िल्टर करने की सुविधाओं के अलावा, कई और विकल्प भी होते हैं. tcpdump की सुविधाओं के बारे में पूरी जानकारी पाने के लिए, 'man tcpdump' टाइप करें या tcpdump man page पर ऑनलाइन जाएं.

WireShark, Linux, Mac OS X, और Windows पर भी उपलब्ध है. WireShark में सैकड़ों प्रोटोकॉल के लिए पहले से मौजूद सपोर्ट की वजह से, यह कई ऐप्लिकेशन के लिए एक उपयोगी टूल है. इसका इस्तेमाल सिर्फ़ एचटीटीपी डीबग करने के लिए नहीं किया जाता. इस जानकारी में, WireShark की कई सुविधाओं के बारे में सिर्फ़ सामान्य जानकारी दी गई है. ज़्यादा जानकारी के लिए, "man wireshark" टाइप करें या WireShark की वेबसाइट पर जाएं.

Fiddler में कई बेहतरीन सुविधाएं भी हैं, लेकिन इसे खास बनाने वाली सुविधा यह है कि यह एसएसएल ट्रैफ़िक को डिक्रिप्ट कर सकता है. ज़्यादा जानकारी के लिए, Fiddler2 की वेबसाइट पर जाएं.

ये पैकेट स्निफ़िंग ऐप्लिकेशन, आपके टूलकिट में शामिल करने के लिए बेहतरीन टूल हैं. साथ ही, ध्यान से पढ़ने वाले लोगों ने यह भी देखा होगा कि ये सभी ऐप्लिकेशन मुफ़्त हैं! अगली बार जब Google API का इस्तेमाल किया जा रहा हो और आपको कुछ गड़बड़ लगे, तो इनमें से किसी एक नेटवर्क ऐनलज़र का इस्तेमाल करें. साथ ही, देखें कि नेटवर्क में क्या हो रहा है. अगर आपको समस्या का पता नहीं चल रहा है, तो हमारे चर्चा ग्रुप में जाकर सवाल पूछें. नेटवर्क से जुड़े मैसेज शामिल करने से, अन्य लोगों को आपकी समस्या को समझने और उसका पता लगाने में मदद मिलेगी.

शुभकामनाएं और सूंघने का आनंद लें!

संसाधन