On the Wire: Network Capture Tools for API Developers

Lane LiaBraaten, Google Data APIs team
June 2007

מבוא

פיתוח אפליקציות שמתקשרות עם שירותי אינטרנט מציב קבוצה ייחודית של בעיות. מקור נפוץ לתסכול הוא חוסר הידיעה לגבי ההודעה שנשלחה לשרת או התגובה שהתקבלה. חלק מהבאגים שהכי קשה לאתר נגרמים בגלל חוסר התאמה בין מה שאנחנו חושבים שאנחנו שולחים לשרת לבין מה שבאמת עובר בכבל.

במאמר הזה אנחנו מציגים כמה כלים שיכולים לעזור לכם לראות את הנתונים שמועברים בצורה ברורה יותר ולהשתמש בהם בצורה יעילה יותר. הכלים האלה, שנקראים בדרך כלל 'חבילות הרחה', מתעדים את כל חבילות הרשת שעוברות דרך ממשק הרשת. בדיקת התוכן של החבילות האלה והסדר שבו הן נשלחו והתקבלו יכולה להיות שיטה שימושית לניפוי באגים.

דוגמה: שליפה של פיד ציבורי

אני מקים קבוצת רכיבה על אופניים לצורך גיוס כספים למטרות צדקה, ויצרתי יומן לאירועים כמו מפגשי מידע, אירועי גיוס כספים של הקבוצה ואימוני רכיבה. הגדרתי את היומן הזה כגלוי לכולם כדי שחברי הצוות ורוכבים אחרים יוכלו לראות את היומן ולהשתתף באירועים. אני רוצה גם לשלוח ניוזלטר עם אירועים קרובים, ולכן במקום להעתיק את המידע מאתר יומן Google, אני יכול להשתמש ב-Google Calendar Data API כדי לשלוח שאילתה ליומן הזה ולאחזר אירועים.

בתיעוד של Google Calendar API יש מידע על שימוש ב-Google Data API ל-RESTful כדי ליצור אינטראקציה עם תוכנת היומן שלי באופן פרוגרמטי. (הערת העורך: החל מגרסה 3, Google Calendar API לא משתמש יותר בפורמט הנתונים של Google). הדבר הראשון שצריך לעשות הוא להשיג את כתובת ה-URL של פיד האירועים ביומן. לשם כך, לוחצים על הלחצן בדף ההגדרות של היומן:

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

בעזרת התיעוד של יומן Google, אוכל לאחזר ולהציג אירועים ביומן כמו בדוגמה הבאה, שבה PUBLIC_FEED_URL מכיל את כתובת ה-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 לא היה מספיק. מה לגבי כותרות ה-HTTP שמצורפות לבקשה? האם השאילתה הועברה דרך שרת proxy או הופנתה מחדש? בפעולות מורכבות יותר, השאלות האלה חשובות במיוחד, במיוחד כשמשהו משתבש ומתקבלות שגיאות. תוכנה לניתוח חבילות יכולה לענות על השאלות האלה על ידי חשיפת תעבורת הרשת.

tcpdump

tcpdump הוא כלי שורת פקודה שפועל בפלטפורמות דמויות Unix, אבל יש גם יציאה של Windows שנקראת WinDump. בדומה לרוב כלי הניטור של מנות נתונים, tcpdump מעביר את כרטיס הרשת למצב פרומיסקואיטיבי, שדורש הרשאות סופר-משתמש. כדי להשתמש ב-tcpdump, פשוט מציינים את ממשק הרשת להאזנה, ותעבורת הרשת תישלח אל stdout:

sudo tcpdump -i eth0

אם תריצו את הפקודה הזו, תהיו מוצפים בכל מיני סוגים של תנועת רשת, וחלק מהם לא יהיו מוכרים לכם. אפשר פשוט להעביר את הפלט לקובץ ולבצע בו grep מאוחר יותר, אבל זה עלול ליצור קבצים גדולים מאוד. לרוב תוכנות ללכידת מנות יש מנגנוני סינון מובנים, כך שתוכלו ללכוד רק את מה שאתם צריכים.

הכלי tcpdump תומך בסינון שמבוסס על מאפיינים שונים של תעבורת הרשת. לדוגמה, אפשר להזין את שם המארח של השרת בביטוי הבא כדי להורות ל-tcpdump לתעד רק את התנועה אל השרת או ממנו ביציאה 80 (הודעות HTTP):

dst or src host <hostname> and port 80

לכל מנה שמתאימה לביטוי הסינון, tcpdump יציג חותמת זמן, את המקור והיעד של המנה וכמה דגלי TCP. המידע הזה יכול להיות שימושי כי הוא מראה את הסדר שבו החבילות נשלחו והתקבלו.

לעתים קרובות כדאי לראות גם את התוכן של החבילות. הדגל ‎-A אומר ל-tcpdump להדפיס כל מנה (packet) ב-ASCII, וכך חושף את כותרות ה-HTTP ואת גוף ההודעה. הסימון ‎-s משמש לציון מספר הבייטים שיוצגו (כאשר ‎-s 0 מציין שלא יתבצע קיצוץ של גוף ההודעה).

אחרי שמשלבים את כל המידע, מקבלים את הפקודה הבאה:

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

אם מריצים את הפקודה הזו ואז מריצים את הדוגמה הקצרה של Java שמופיעה למעלה, אפשר לראות את כל התקשורת ברשת שקשורה לפעולה הזו. בין תנועת הגולשים תופיע בקשת ה-HTTP 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>

הפלט הזה כולל את כל כותרות ה-HTTP והתוכן, וגם כמה דגלי TCP מוצפנים. כל הנתונים מוצגים כאן, אבל קשה לקרוא ולהבין אותם. יש כמה כלים גרפיים שמקלים על הצגת הנתונים האלה.

‫WireShark (לשעבר Ethereal)

צילום מסך של Wireshark
WireShark מציג את תנועת הרשת בכמה דרכים.

WireShark הוא כלי גרפי שמבוסס על libpcap, אותה ספרייה ש-tcpdump מבוסס עליה, והוא זמין ב-Linux, ב-Mac OS X וב-Windows. ממשק המשתמש הגרפי של WireShark מאפשר כמה דרכים חדשות לפרש את נתוני לכידת המנות ולבצע איתם אינטראקציה. לדוגמה, כשמנות נתונים נלכדות מממשק הרשת, הן מוצגות בצבעים שונים בהתאם לפרוטוקול שבו הן משתמשות. אפשר גם למיין את התנועה לפי חותמת זמן, מקור, יעד ופרוטוקול.

אם בוחרים שורה ברשימת החבילות, Wireshark מציג את ה-IP, את ה-TCP ומידע אחר שספציפי לפרוטוקול בכותרות של החבילות, בתצוגת עץ שנוחה לקריאה. הנתונים מוצגים גם בפורמטים HEX ו-ASCII בחלק התחתון של המסך.

האופי הוויזואלי של WireShark מקל על ההבנה של תעבורת הרשת, אבל ברוב המקרים עדיין כדאי לסנן את תעבורת הרשת. ל-WireShark יש יכולות סינון חזקות, כולל תמיכה במאות פרוטוקולים.

טיפ: כדי לראות את הפרוטוקולים הזמינים וליצור מסננים מורכבים, לוחצים על הלחצן בחלק העליון של חלון WireShark.

כדי ליצור מחדש את המסנן שבו נעשה שימוש בדוגמה של tcpdump שלמעלה, אפשר להזין את הביטוי הבא בתיבת הסינון של WireShark:

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

או להשתמש בידע של WireShark בנושא HTTP:

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

הפעולה הזו תסנן את תוצאות הלכידה כך שיוצגו רק המנות שקשורות לאינטראקציה הזו עם השרת של Google Calendar. אפשר ללחוץ על כל חבילה כדי לראות את התוכן שלה ולהרכיב את העסקה.

טיפ: אפשר ללחוץ לחיצה ימנית על אחד מהחבילות ולבחור באפשרות 'מעקב אחר זרם TCP' כדי להציג את הבקשות והתגובות ברצף בחלון אחד.

ב-WireShark יש כמה דרכים לשמור את פרטי הלכידה. אפשר לשמור חבילה אחת, כמה חבילות או את כל החבילות. אם אתם צופים בזרם TCP, אתם יכולים פשוט ללחוץ על הלחצן 'שמירה בשם' כדי לשמור רק את החבילות הרלוונטיות. אפשר גם לייבא את הפלט מ-tcpdump ולצפות בו ב-WireShark.

בעיה: SSL והצפנה

חיסרון נפוץ של כלי לכידת חבילות הוא חוסר היכולת להציג נתונים שמוצפנים בחיבור SSL. בדוגמה שלמעלה יש גישה לפיד ציבורי, ולכן אין צורך ב-SSL. עם זאת, אם הדוגמה ניגשה לפיד פרטי, הלקוח היה צריך לבצע אימות באמצעות שירות האימות של Google, שדורש חיבור SSL.

קטע הקוד הבא דומה לדוגמה הקודמת, אבל כאן CalendarService מבקש את פיד המטא של היומן של המשתמש, שהוא פיד פרטי שנדרש אימות כדי לגשת אליו. כדי לבצע אימות, פשוט קוראים לשיטה setUserCredentials. השיטה הזו מפעילה בקשת HTTPS לשירות 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
    • שולחים בקשת HTTP POST אל https://www.google.com/accounts/ClientLogin עם הפרמטרים הבאים בגוף ההודעה:
      • אימייל – כתובת האימייל של המשתמש.
      • Passwd – הסיסמה של המשתמש.
      • source – מזהה את אפליקציית הלקוח. הפורמט צריך להיות companyName-applicationName-versionID. בדוגמאות האלה השתמשנו בשם ExampleCo-FiddlerSSLExample-1.
      • service – שם השירות של יומן Google הוא 'cl'.
  2. מקבלים את טוקן ההרשאה
    • אם בקשת האימות נכשלת, תקבלו קוד סטטוס HTTP 403 Forbidden.
    • אם הפעולה מצליחה, התגובה מהשירות היא קוד סטטוס HTTP 200 OK, בתוספת שלושה קודים אלפאנומריים ארוכים בגוף התגובה: SID, LSID ו-Auth. הערך Auth הוא טוקן ההרשאה.
  3. בקשת הזנת מטא של יומן פרטי
    • שולחים HTTP GET אל http://www.google.com/calendar/feeds/default עם הכותרת הבאה:
    • Authorization: GoogleLogin auth=<yourAuthToken>
      

מנסים להריץ את קטע הקוד הזה ולצפות בתנועת הרשת ב-WireShark (באמצעות 'http || ssl' כמסנן). תוכלו לראות את חבילות ה-SSL וה-TLS שקשורות לעסקה, אבל חבילות הבקשה והתגובה של ClientLogin מוצפנות בחבילות של 'נתוני אפליקציה'. אל דאגה, בהמשך נבדוק כלי שיכול לחשוף את המידע המוצפן הזה.

Fiddler

Fiddler הוא עוד כלי גרפי לניתוח חבילות, אבל הוא פועל בצורה שונה מאוד מהכלים שהוצגו עד עכשיו. ‫Fiddler פועל כ-Proxy בין האפליקציה שלכם לבין השירותים המרוחקים שאתם יוצרים איתם אינטראקציה, ובעצם הופך ל'אדם בתווך'. ‫Fiddler יוצר חיבור SSL עם האפליקציה ועם שירות האינטרנט המרוחק, מפענח את התנועה מנקודת קצה אחת, מתעד את הטקסט הרגיל ומצפין מחדש את התנועה לפני שהוא שולח אותה. לצערנו, Fiddler זמין רק ל-Windows. מצטערים בפני כל משתמשי Mac ו-Linux.

הערה: כדי לתמוך ב-SSL צריך את Fiddler גרסה 2 ואת .NET Framework גרסה 2.0.

רוב הפעולות שקשורות לצפייה בתעבורת הרשת ב-Fiddler מתבצעות דרך הכרטיסייה Session Inspector. כרטיסיות המשנה שהכי שימושיות לניפוי באגים בבעיות שקשורות ל-Google Data APIs הן:

  • כותרות – הצגת כותרות ה-HTTP בפורמט של עץ שניתן לכיווץ.
  • אימות – מציג את כותרות האימות.
  • Raw – הצגת התוכן של מנות רשת בטקסט ASCII

טיפ: לוחצים על הסמל בפינה הימנית התחתונה של חלון Fiddler כדי להפעיל ולהשבית את הלכידה.

‫Fiddler משתמש ב-‎ .NET Framework כדי להגדיר חיבורים לרשת לשימוש ב-Fiddler כ-proxy. כלומר, כל חיבור שתבצעו באמצעות Internet Explorer או באמצעות קוד ‎ .NET יופיע ב-Fiddler כברירת מחדל. עם זאת, התנועה מהדוגמה של Java שלמעלה לא תופיע כי ב-Java יש דרך שונה להגדרת שרתי proxy של HTTP.

ב-Java, אפשר להגדיר את שרת ה-proxy של HTTP באמצעות מאפייני מערכת. ‫Fiddler פועל ביציאה 8888, כך שבהתקנה מקומית אפשר להשתמש בקוד Java ב-Fiddler כ-Proxy ל-HTTP ול-HTTPS על ידי הוספת השורות הבאות:

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

אם מריצים את הדוגמה עם השורות האלה, מקבלים בפועל מעקב מחסנית (stack trace) לא נעים מחבילת האבטחה של 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
אפשר לפענח ולהציג תנועת SSL ב-Fiddler.

השגיאה הזו מתרחשת כשאי אפשר לאמת את האישור שמוחזר מהשרת בחיבור SSL. במקרה הזה, האישור הבעייתי מגיע מ-Fiddler, שפועל כהתקפת אדם בתווך. ‫Fiddler יוצר אישורים תוך כדי תנועה, ומכיוון ש-Fiddler הוא לא מנפיק מהימן, האישורים האלה יגרמו ל-Java להיכשל בהגדרת חיבור SSL.

הערה: כש-Fiddler פועל, כל חיבור SSL שיוצרים ב-Internet Explorer יפעיל 'התראה בנושא אבטחה' עם שאלה אם רוצים להמשיך למרות האישור המפוקפק. אפשר ללחוץ על 'הצגת האישור' כדי לראות את האישור שנוצר על ידי Fiddler.

אז איך אפשר לעקוף את חריגת האבטחה הזו? בעיקרון, צריך להגדיר מחדש את מסגרת האבטחה של Java כך שתיתן אמון בכל האישורים. למזלכם, לא צריך להמציא את הגלגל מחדש – כדאי לעיין בפתרון של פרנסיס לאברי ולהוסיף את השיטה SSLUtilities.trustAllHttpsCertificates() לדוגמה שלמעלה.

אחרי שמגדירים את Java להשתמש ב-Fiddler כ-Proxy ומשביתים את אימות האישורים שמוגדר כברירת מחדל, אפשר להריץ את הדוגמה ולראות את כל התנועה שנשלחת דרך החוט בטקסט פשוט. אל תגנבו את הסיסמה שלי!

חשוב לזכור שעסקת האימות הזו היא רק דוגמה קטנה לתנועת SSL. חלק מאפליקציות האינטרנט משתמשות בחיבורי SSL בלבד, ולכן אי אפשר לבצע ניפוי באגים בתעבורת HTTP בלי דרך לפענח את הנתונים.

סיכום

הכלי tcpdump זמין ב-Linux, ב-Mac OS X וב-Windows, והוא שימושי מאוד כשאתם יודעים מה אתם מחפשים וצריכים רק ללכוד נתונים במהירות. עם זאת, יש כלים גרפיים שמציגים את התנועה ברשת בפורמטים שקל יותר להבין. ל-tcpdump יש הרבה יותר אפשרויות ויכולות סינון מאלה שצוינו כאן. כדי לקבל תיאור מלא של הפונקציונליות של tcpdump, מקלידים 'man tcpdump' או עוברים אל הדף man של tcpdump באינטרנט.

התוכנה WireShark זמינה גם ב-Linux, ב-Mac OS X וב-Windows. התמיכה המובנית במאות פרוטוקולים הופכת את WireShark לכלי שימושי להרבה אפליקציות, ולא רק לניפוי באגים ב-HTTP. ההסבר הזה הוא רק טעימה קטנה מתוך היכולות הרבות של WireShark. למידע נוסף, אפשר להקליד 'man wireshark' או להיכנס אל האתר של WireShark.

ל-Fiddler יש גם הרבה תכונות נהדרות, אבל מה שמייחד אותו הוא היכולת שלו לפענח תנועת SSL. מידע נוסף זמין באתר של Fiddler2.

אפליקציות לניתוח חבילות הן כלים מצוינים, וקוראים ערניים ישימו לב שכולן חינמיות. בפעם הבאה שתעבדו עם ממשקי ה-API של Google ותראו משהו חשוד, תוכלו להשתמש באחד מהכלים האלה לניתוח רשת כדי לבדוק מקרוב מה קורה ברשת. אם אתם לא מצליחים למצוא את הבעיה, תמיד אפשר לפרסם שאלה בקבוצת הדיון שלנו. הוספת הודעות הרשת הרלוונטיות תעזור לאחרים להבין את הבעיה הספציפית שלך ולאבחן אותה.

בהצלחה!

משאבים