On the Wire: เครื่องมือจับภาพเครือข่ายสำหรับนักพัฒนา API

Lane LiaBraaten ทีม Google Data APIs
มิถุนายน 2007

บทนำ

การพัฒนาแอปพลิเคชันที่โต้ตอบกับบริการบนเว็บทำให้เกิดปัญหาที่เฉพาะเจาะจง สาเหตุที่พบบ่อยซึ่งทำให้เกิดความหงุดหงิดคือการไม่ทราบว่าข้อความใดถูกส่งไปยังเซิร์ฟเวอร์หรือได้รับการตอบกลับอย่างไร ข้อบกพร่องที่ติดตามได้ยากที่สุดบางอย่างเกิดจากการขาดการเชื่อมต่อระหว่างสิ่งที่เราคิดว่ากำลังส่งไปยังเซิร์ฟเวอร์กับสิ่งที่ส่งผ่านสายจริง

บทความนี้จะแนะนำเครื่องมือหลายอย่างที่จะช่วยให้ข้อมูลในเครือข่ายมองเห็นได้ชัดเจนและมีประโยชน์มากขึ้น เครื่องมือเหล่านี้มักเรียกว่า "ดักจับแพ็กเก็ต" ซึ่งจะบันทึกแพ็กเก็ตเครือข่ายทั้งหมดที่เคลื่อนที่ผ่านอินเทอร์เฟซเครือข่าย การตรวจสอบเนื้อหาของแพ็กเก็ตเหล่านี้และลำดับการส่งและรับอาจเป็นเทคนิคการแก้ไขข้อบกพร่องที่มีประโยชน์

ตัวอย่าง: การดึงข้อมูลฟีดสาธารณะ

ฉันกำลังรวบรวมทีมปั่นจักรยานเพื่อการกุศล และได้สร้างปฏิทินสำหรับกิจกรรมต่างๆ เช่น เซสชันข้อมูล การระดมทุนของทีม และการปั่นจักรยานฝึกซ้อม ฉันได้ตั้งค่าปฏิทินนี้เป็นแบบสาธารณะเพื่อให้สมาชิกในทีมและนักปั่นคนอื่นๆ ดูปฏิทินและเข้าร่วมกิจกรรมได้ นอกจากนี้ ฉันยังต้องการส่งจดหมายข่าวเกี่ยวกับกิจกรรมที่กำลังจะจัดขึ้นด้วย ดังนั้นฉันจึงใช้ Google Calendar Data API เพื่อค้นหาปฏิทินนี้และดึงข้อมูลกิจกรรมแทนที่จะคัดลอกข้อมูลจากเว็บไซต์ Google ปฏิทิน

เอกสารประกอบของ Google Calendar API มีข้อมูลเกี่ยวกับวิธีใช้ Google Data API แบบ RESTful เพื่อโต้ตอบกับปฏิทินของฉันแบบเป็นโปรแกรม (หมายเหตุจากบรรณาธิการ: ตั้งแต่ v3 เป็นต้นไป 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 ที่มาพร้อมกับคำขอจะเป็นอย่างไร มีการส่งต่อหรือเปลี่ยนเส้นทางคำค้นหาหรือไม่ เมื่อการดำเนินการมีความซับซ้อนมากขึ้น คำถามเหล่านี้จะมีความสำคัญมากขึ้น โดยเฉพาะอย่างยิ่งเมื่อเกิดข้อผิดพลาด ซอฟต์แวร์ดมแพ็กเก็ตสามารถตอบคำถามเหล่านี้ได้โดยการแสดงการรับส่งข้อมูลในเครือข่าย

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 พิมพ์แต่ละแพ็กเก็ตใน ASCII ซึ่งจะแสดงส่วนหัว HTTP และเนื้อความของข้อความ แฟล็ก "-s" ใช้เพื่อระบุจำนวนไบต์ที่จะแสดง (โดยที่ "-s 0" หมายถึงไม่ตัดเนื้อหาข้อความเลย)

เมื่อรวมทุกอย่างเข้าด้วยกัน เราจะได้คำสั่งต่อไปนี้

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

หากเรียกใช้คำสั่งนี้ แล้วเรียกใช้ตัวอย่าง .Java แบบสั้นด้านบน คุณจะเห็นการสื่อสารผ่านเครือข่ายทั้งหมดที่เกี่ยวข้องกับการดำเนินการนี้ ในการเข้าชม คุณจะเห็นGETคำขอ HTTP ดังนี้

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 ด้วย โปรดทราบว่าฟีดจะแบ่งออกเป็น 4 แพ็กเก็ต ดังนี้

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 GUI ของ WireShark ช่วยให้ตีความและโต้ตอบกับข้อมูลการดักจับแพ็กเก็ตได้หลายวิธี เช่น เมื่อมีการจับแพ็กเก็ตจากอินเทอร์เฟซเครือข่าย ระบบจะแสดงแพ็กเก็ตเหล่านั้นในสีต่างๆ ตามโปรโตคอลที่ใช้ นอกจากนี้ คุณยังจัดเรียงการเข้าชมตามการประทับเวลา แหล่งที่มา ปลายทาง และโปรโตคอลได้ด้วย

หากคุณเลือกแถวในรายการแพ็กเก็ต Wireshark จะแสดงข้อมูล IP, TCP และโปรโตคอลอื่นๆ ที่เฉพาะเจาะจงในส่วนหัวของแพ็กเก็ตในรูปแบบแผนผังที่มนุษย์อ่านได้ นอกจากนี้ ข้อมูลยังแสดงในรูปแบบ HEX และ ASCII ที่ด้านล่างของหน้าจอด้วย

แม้ว่าลักษณะภาพของ WireShark จะช่วยให้เข้าใจการรับส่งข้อมูลเครือข่ายได้ง่ายขึ้น แต่ในกรณีส่วนใหญ่ คุณก็ยังคงต้องกรองการรับส่งข้อมูลเครือข่ายอยู่ดี WireShark มีความสามารถในการกรองที่แข็งแกร่ง รวมถึงรองรับโปรโตคอลหลายร้อยรายการ

เคล็ดลับ: หากต้องการดูโปรโตคอลที่ใช้ได้และสร้างตัวกรองที่ซับซ้อน ให้คลิกปุ่ม ที่ด้านบนของหน้าต่าง WireShark

หากต้องการสร้างตัวกรองที่ใช้ในตัวอย่าง tcpdump ด้านบนอีกครั้ง คุณสามารถแทรกนิพจน์ต่อไปนี้ลงในช่องตัวกรอง WireShark

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

หรือใช้ความรู้เกี่ยวกับ HTTP ของ WireShark

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

ซึ่งจะกรองผลลัพธ์ของการจับภาพให้เหลือเฉพาะแพ็กเก็ตที่เกี่ยวข้องกับการโต้ตอบนี้กับเซิร์ฟเวอร์ Google ปฏิทิน คุณคลิกแต่ละแพ็กเก็ตเพื่อดูเนื้อหาและประกอบธุรกรรมได้

เคล็ดลับ: คุณคลิกขวาที่แพ็กเก็ตใดแพ็กเก็ตหนึ่ง แล้วเลือก "ติดตามสตรีม TCP" เพื่อแสดงคำขอและการตอบกลับตามลำดับในหน้าต่างเดียวได้

WireShark มีหลายวิธีในการบันทึกข้อมูลการจับภาพ คุณบันทึกแพ็กเก็ต 1 แพ็กเก็ต บางแพ็กเก็ต หรือทั้งหมดก็ได้ หากกำลังดูสตรีม 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 พร้อมด้วยรหัสตัวอักษรและตัวเลขยาว 3 รายการในเนื้อหาของการตอบกลับ ได้แก่ SID, LSID และ Auth ค่า Auth คือโทเค็นการให้สิทธิ์
  3. ขอ Metafeed ปฏิทินส่วนตัว
    • ส่ง HTTP GET ไปยัง http://www.google.com/calendar/feeds/default โดยมีส่วนหัวต่อไปนี้
    • Authorization: GoogleLogin auth=<yourAuthToken>
      

ลองเรียกใช้ข้อมูลโค้ดนี้และดูการรับส่งข้อมูลในเครือข่ายใน WireShark (ใช้ "http || ssl" เป็นตัวกรอง) คุณจะเห็นแพ็กเก็ต SSL และ TLS ที่เกี่ยวข้องกับธุรกรรม แต่แพ็กเก็ตคำขอและการตอบกลับ ClientLogin จะได้รับการเข้ารหัสในแพ็กเก็ต "ข้อมูลแอปพลิเคชัน" ไม่ต้องกังวล ในส่วนถัดไป เราจะดูเครื่องมือที่สามารถเปิดเผยข้อมูลที่เข้ารหัสนี้ได้

Fiddler

Fiddler เป็นอีกเครื่องมือหนึ่งที่ใช้ดมแพ็กเก็ตแบบกราฟิก แต่ทำงานแตกต่างจากเครื่องมือที่กล่าวมาข้างต้น Fiddler ทำหน้าที่เป็นพร็อกซีระหว่างแอปพลิเคชันของคุณกับบริการระยะไกลที่คุณโต้ตอบด้วย ซึ่งทำให้ Fiddler กลายเป็นตัวกลาง Fiddler จะสร้างการเชื่อมต่อ SSL กับทั้งแอปพลิเคชันและเว็บเซอร์วิสระยะไกล ถอดรหัสการรับส่งจากปลายทางหนึ่ง จับข้อความธรรมดา และเข้ารหัสการรับส่งอีกครั้งก่อนที่จะส่งต่อ ขออภัย Fiddler พร้อมให้บริการสำหรับ Windows เท่านั้น เราขออภัยผู้ใช้ Mac และ Linux ทุกท่าน

หมายเหตุ: การรองรับ SSL ต้องใช้ Fiddler เวอร์ชัน 2 และ .NET Framework เวอร์ชัน 2.0

การดูการรับส่งข้อมูลเครือข่ายใน Fiddler ส่วนใหญ่จะทำผ่านแท็บ Session Inspector แท็บย่อยที่มีประโยชน์มากที่สุดในการแก้ไขข้อบกพร่องเกี่ยวกับ Google Data API ได้แก่

  • ส่วนหัว - แสดงส่วนหัว HTTP ในรูปแบบแผนผังที่ยุบได้
  • Auth - แสดงส่วนหัวการตรวจสอบสิทธิ์
  • ดิบ - แสดงเนื้อหาของแพ็กเก็ตเครือข่ายในข้อความ ASCII

เคล็ดลับ: คลิกไอคอน ที่มุมซ้ายล่างของหน้าต่าง Fiddler เพื่อเปิดและปิดการจับภาพ

Fiddler ใช้ .NET Framework เพื่อกำหนดค่าการเชื่อมต่อเครือข่ายให้ใช้ Fiddler เป็นพร็อกซี ซึ่งหมายความว่าการเชื่อมต่อใดๆ ที่คุณทำกับ Internet Explorer หรือกับโค้ด .NET จะปรากฏใน Fiddler โดยค่าเริ่มต้น อย่างไรก็ตาม การเข้าชมจากตัวอย่าง Java ด้านบนจะไม่ปรากฏเนื่องจาก Java มีวิธีตั้งค่าพร็อกซี HTTP ที่แตกต่างกัน

ใน Java คุณสามารถตั้งค่าพร็อกซี HTTP โดยใช้พร็อพเพอร์ตี้ของระบบ Fiddler ทำงานบนพอร์ต 8888 ดังนั้นสำหรับการติดตั้งในเครื่อง คุณสามารถทำให้โค้ด Java ใช้ Fiddler เป็นพร็อกซีสำหรับ 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
Fiddler สามารถถอดรหัสและแสดงการรับส่งข้อมูล SSL ได้

ข้อผิดพลาดนี้เกิดขึ้นเมื่อตรวจสอบใบรับรองที่เซิร์ฟเวอร์ส่งกลับมาในการเชื่อมต่อ SSL ไม่ได้ ในกรณีนี้ ใบรับรองที่ไม่ถูกต้องมาจาก Fiddler ซึ่งทำหน้าที่เป็นคนกลาง Fiddler จะสร้างใบรับรองทันที และเนื่องจาก Fiddler ไม่ใช่ผู้ออกที่เชื่อถือได้ ใบรับรองเหล่านี้จะทำให้ Java ตั้งค่าการเชื่อมต่อ SSL ไม่สำเร็จ

หมายเหตุ: เมื่อ Fiddler ทำงาน การเชื่อมต่อ SSL ที่คุณทำใน Internet Explorer จะทริกเกอร์ "การแจ้งเตือนด้านความปลอดภัย" ซึ่งจะถามว่าคุณต้องการดำเนินการต่อหรือไม่แม้ว่าใบรับรองจะไม่น่าเชื่อถือ คุณคลิก "ดูใบรับรอง" เพื่อดูใบรับรองที่ Fiddler สร้างขึ้นได้

แล้วคุณจะหลีกเลี่ยงข้อยกเว้นด้านความปลอดภัยนี้ได้อย่างไร โดยพื้นฐานแล้ว คุณต้องกำหนดค่าเฟรมเวิร์กความปลอดภัยของ Java ใหม่เพื่อให้เชื่อถือใบรับรองทั้งหมด โชคดีที่คุณไม่ต้องคิดค้นวิธีใหม่ๆ ในที่นี้ เพียงดูโซลูชันของ Francis Labrie แล้วเพิ่มเมธอด SSLUtilities.trustAllHttpsCertificates() ลงในตัวอย่างด้านบน

เมื่อกำหนดค่า Java ให้ใช้ Fiddler เป็นพร็อกซีและปิดใช้การยืนยันใบรับรองเริ่มต้นแล้ว คุณจะเรียกใช้ตัวอย่างและดูการเข้าชมทั้งหมดที่ส่งผ่านสายในรูปแบบข้อความธรรมดาได้ อย่าขโมยรหัสผ่านของฉัน

โปรดทราบว่าธุรกรรมการตรวจสอบสิทธิ์นี้เป็นเพียงตัวอย่างเล็กๆ ของการรับส่งข้อมูล 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

แอปพลิเคชันดมแพ็กเก็ตเหล่านี้เป็นเครื่องมือที่ยอดเยี่ยมที่ควรมีไว้ในกล่องเครื่องมือของคุณ และผู้อ่านที่สังเกตจะเห็นว่าแอปเหล่านี้ฟรีทั้งหมด ครั้งต่อไปที่คุณใช้ Google API และเห็นสิ่งผิดปกติ ให้ใช้เครื่องมือวิเคราะห์เครือข่ายเหล่านี้เพื่อดูรายละเอียดว่าเกิดอะไรขึ้น หากไม่พบปัญหา คุณสามารถโพสต์คำถามในกลุ่มสนทนาของเราได้เสมอ การใส่ข้อความเครือข่ายที่เกี่ยวข้องจะช่วยให้ผู้อื่นเข้าใจและวินิจฉัยปัญหาของคุณได้

ขอให้โชคดีและสนุกกับการดมกลิ่น

แหล่งข้อมูล