On the Wire: Network Capture Tools برای توسعه دهندگان API

Lane LiaBraaten، تیم Google Data APIs
ژوئن 2007

معرفی

توسعه برنامه‌هایی که با خدمات وب در تعامل هستند، مجموعه‌ای از مشکلات را ایجاد می‌کند. یک منبع رایج ناامیدی این است که نمی‌دانیم دقیقاً چه پیامی به سرور ارسال شده است یا چه پاسخی دریافت شده است. ردیابی برخی از دشوارترین اشکالات ناشی از قطع ارتباط بین چیزی است که فکر می کنیم به سرور ارسال می کنیم و آنچه در واقع از طریق سیم می گذرد.

این مقاله چندین ابزار را معرفی می‌کند که می‌توانند به دیده شدن و مفیدتر شدن داده‌های روی سیم کمک کنند. این ابزارها که معمولاً به آنها "packet sniffers" گفته می شود، تمام بسته های شبکه را که در رابط شبکه شما حرکت می کنند، ضبط می کنند. بررسی محتویات این بسته ها و ترتیب ارسال و دریافت آنها می تواند یک تکنیک اشکال زدایی مفید باشد.

یک مثال: بازیابی فید عمومی

من یک تیم دوچرخه سواری را برای یک سواری خیریه تشکیل می دهم و تقویمی برای رویدادهایی مانند جلسات اطلاعاتی، جمع آوری کمک های مالی تیم و سواری های آموزشی ایجاد کرده ام. من این تقویم را عمومی کرده ام تا اعضای تیم و سایر سواران بتوانند تقویم را مشاهده کنند و در رویدادها شرکت کنند. من همچنین می‌خواهم یک خبرنامه با رویدادهای آینده ارسال کنم، بنابراین به جای کپی کردن اطلاعات از وب‌سایت Google Calendar، می‌توانم از API داده‌های Google Calendar برای پرس و جو از این تقویم و بازیابی رویدادها استفاده کنم.

اسناد Google Calendar API اطلاعاتی در مورد نحوه استفاده از RESTful Google Data API برای تعامل برنامه‌ریزی با تقویم من دارد. ( توجه ویرایشگر: از نسخه 3، Google Calendar API دیگر از قالب Google Data استفاده نمی کند.) اولین کاری که باید انجام دهید این است که 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

قطعه کد بالا عنوان رویدادهای تقویم را نمایش می دهد، اما بقیه داده هایی که از سرور دریافت کردیم چطور؟ کتابخانه سرویس گیرنده جاوا خروجی یک فید یا ورودی را به عنوان XML ساده نمی کند، و حتی اگر اینطور باشد، XML تمام داستان نیست. در مورد سرصفحه های HTTP که با درخواست همراه هستند چطور؟ آیا پرس و جو پروکسی شد یا هدایت شد؟ با عملیات پیچیده‌تر، این سؤال‌ها اهمیت فزاینده‌ای پیدا می‌کنند، به‌ویژه زمانی که کارها اشتباه می‌شوند و خطاهایی دریافت می‌کنیم. نرم افزار sniffing بسته می تواند با آشکارسازی ترافیک شبکه به این سوالات پاسخ دهد.

tcpdump

tcpdump یک ابزار خط فرمان است که بر روی پلتفرم های مشابه یونیکس کار می کند، اما یک پورت ویندوز به نام WinDump نیز وجود دارد. مانند بسیاری از اسنیفرهای بسته، tcpdump کارت شبکه شما را در حالت غیرقانونی قرار می دهد که به امتیازات superuser نیاز دارد. برای استفاده از 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

اگر این دستور را اجرا کنید، سپس مثال کوتاه جاوا را در بالا اجرا کنید، تمام ارتباطات شبکه درگیر در این عملیات را خواهید دید. در میان ترافیک، درخواست 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 Data است. توجه داشته باشید که خوراک بین چهار بسته تقسیم می شود:

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 روی آن ساخته شده است و در لینوکس، Mac OS X و ویندوز موجود است. رابط کاربری گرافیکی 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 درگیر هستند فیلتر می کند. می توانید روی هر بسته کلیک کنید تا محتویات آن را ببینید و تراکنش را با هم ترکیب کنید.

نکته: می توانید روی یکی از بسته ها کلیک راست کرده و "Follow TCP Stream" را انتخاب کنید تا درخواست ها و پاسخ ها به صورت متوالی در یک پنجره نمایش داده شوند.

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 - رمز عبور کاربر.
      • منبع - برنامه مشتری شما را شناسایی می کند. باید به شکل companyName-applicationName-versionID باشد. نمونه ها از نام ExampleCo-FiddlerSSLExample-1 استفاده می کنند.
      • سرویس - نام سرویس Google Calendar '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 و پاسخ در بسته های "Application Data" رمزگذاری شده اند. نگران نباشید، در ادامه به ابزاری نگاه خواهیم کرد که واقعاً می تواند این اطلاعات رمزگذاری شده را آشکار کند.

کمانچه نواز

Fiddler یکی دیگر از ابزارهای گرافیکی sniffing بسته است، اما رفتار آن کاملاً متفاوت از ابزارهای ارائه شده تاکنون است. Fiddler به عنوان یک پروکسی بین برنامه شما و سرویس های راه دوری که با آنها در تعامل هستید عمل می کند و در واقع تبدیل به یک مرد میانی می شود. Fiddler اتصال SSL را هم با برنامه شما و هم با سرویس وب راه دور برقرار می کند، ترافیک را از یک نقطه پایانی رمزگشایی می کند، متن ساده را می گیرد و ترافیک را قبل از ارسال مجدد رمزگذاری می کند. متأسفانه، Fiddler فقط برای ویندوز در دسترس است، متأسفیم برای همه شما کاربران مک و لینوکس.

توجه: پشتیبانی از SSL به نسخه 2 Fiddler و نسخه 2.0 .NET Framework نیاز دارد.

مشاهده ترافیک شبکه در Fiddler بیشتر از طریق تب Session Inspector انجام می شود. زبانه های فرعی که برای رفع اشکال با Google Data API مفید هستند عبارتند از:

  • سرصفحه ها - سرصفحه های HTTP را در قالب درختی جمع شونده نشان می دهد.
  • Auth - سرصفحه های Authentication را نشان می دهد.
  • خام - محتویات بسته های شبکه را در متن ASCII نشان می دهد

نکته: روی نماد در گوشه سمت چپ پایین پنجره Fiddler برای روشن و خاموش کردن تصویربرداری.

Fiddler از .NET Framework برای پیکربندی اتصالات شبکه برای استفاده از Fiddler به عنوان یک پروکسی استفاده می کند. این بدان معنی است که هر اتصالی که با اینترنت اکسپلورر یا کد دات نت ایجاد می کنید به طور پیش فرض در Fiddler ظاهر می شود. با این حال، ترافیک نمونه جاوا در بالا نشان داده نمی شود زیرا جاوا روش متفاوتی برای تنظیم پراکسی های HTTP دارد.

در جاوا، می توانید پراکسی HTTP را با استفاده از ویژگی های سیستم تنظیم کنید. Fiddler روی پورت 8888 اجرا می‌شود، بنابراین برای نصب محلی می‌توانید کد جاوا را با افزودن این خطوط به عنوان پروکسی برای 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] 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 را رمزگشایی و نمایش دهد.

این خطا زمانی رخ می دهد که گواهی بازگردانده شده از سرور در یک اتصال SSL قابل تأیید نباشد. در این مورد، گواهی بد از سوی Fiddler می آید که نقش یک مرد میانی را ایفا می کند. Fiddler گواهینامه ها را به سرعت تولید می کند، و از آنجایی که Fiddler صادرکننده قابل اعتمادی نیست، این گواهی ها باعث می شود جاوا در راه اندازی اتصال SSL شکست بخورد.

توجه: هنگامی که Fiddler در حال اجرا است، هر اتصال SSL که در اینترنت اکسپلورر ایجاد می‌کنید، یک «هشدار امنیتی» را راه‌اندازی می‌کند و از شما می‌پرسد که آیا می‌خواهید با وجود گواهی ناقص ادامه دهید. می‌توانید روی «مشاهده گواهی» کلیک کنید تا گواهی‌ای را که Fiddler ایجاد کرده است ببینید.

بنابراین چگونه می توانید این استثناء امنیتی را دور بزنید؟ اساساً باید چارچوب امنیتی جاوا را مجدداً پیکربندی کنید تا به همه گواهی ها اعتماد کنید. خوشبختانه، لازم نیست چرخ را دوباره اختراع کنید، راه حل فرانسیس لابری را در اینجا بررسی کنید و متد SSLUtilities.trustAllHttpsCertificates() به مثال بالا اضافه کنید.

هنگامی که جاوا را برای استفاده از Fiddler به عنوان یک پروکسی پیکربندی کردید و تأیید گواهی پیش فرض را غیرفعال کردید، می توانید مثال را اجرا کنید و تمام ترافیک ارسال شده از طریق سیم را به صورت متن ساده مشاهده کنید. رمز عبور من را ندزدید!

به یاد داشته باشید، این تراکنش احراز هویت تنها یک نمونه کوچک از ترافیک SSL است. برخی از برنامه های وب منحصراً از اتصالات SSL استفاده می کنند، بنابراین اشکال زدایی ترافیک HTTP بدون راهی برای رمزگشایی داده ها غیرممکن است.

نتیجه

tcpdump در لینوکس، مک او اس ایکس و ویندوز موجود است و زمانی که می‌دانید به دنبال چه چیزی هستید و فقط به یک عکس‌برداری سریع نیاز دارید، ابزاری عالی است. با این حال، برخی از ابزارهای گرافیکی وجود دارند که ترافیک شبکه را در قالب هایی ارائه می کنند که درک آن آسان تر است. tcpdump گزینه ها و قابلیت های فیلترینگ بسیار بیشتری نسبت به مواردی که در اینجا پوشش داده شده است دارد. برای توضیح کامل عملکرد tcpdump، عبارت man tcpdump را تایپ کنید یا به صفحه man tcpdump به صورت آنلاین مراجعه کنید.

WireShark بر روی Linux، Mac OS X و Windows نیز موجود است. پشتیبانی داخلی از صدها پروتکل، WireShark را به ابزاری مفید برای بسیاری از برنامه‌ها، نه فقط اشکال‌زدایی HTTP، تبدیل می‌کند. این مقدمه به سختی سطح قابلیت های زیاد WireShark را خراش می دهد. برای اطلاعات بیشتر، "man wireshark" را تایپ کنید یا به وب سایت WireShark مراجعه کنید.

Fiddler همچنین ویژگی های بسیار خوبی دارد، اما چیزی که آن را متمایز می کند، توانایی آن در رمزگشایی ترافیک SSL است. برای اطلاعات بیشتر به وب سایت Fiddler2 مراجعه کنید.

این برنامه‌های sniffing بسته ابزارهای خوبی برای داشتن در کمربند ابزار شما هستند، و خوانندگان آگاه متوجه خواهند شد که همه آنها رایگان هستند! دفعه بعد که با API های Google کار می کنید و چیز عجیبی می بینید، یکی از این تحلیلگرهای شبکه را بیرون بیاورید و به آنچه روی سیم است نگاه دقیق تری بیندازید. اگر مشکل را پیدا نکردید، همیشه می‌توانید سؤالی را به گروه بحث ما ارسال کنید. گنجاندن پیام‌های شبکه مربوطه به دیگران کمک می‌کند تا مشکل خاص شما را درک کرده و تشخیص دهند.

موفق باشید و بوی خوش!

منابع