على الأسلاك: أدوات التقاط الشبكات لمطوري واجهة برمجة التطبيقات

لين ليابراتين، فريق Google Data APIs
حزيران (يونيو) 2007

المقدمة

يمثل تطوير التطبيقات التي تتفاعل مع خدمات الويب مجموعة فريدة من المشكلات. وأحد الأسباب الشائعة للإحباط هو عدم معرفة الرسالة التي تم إرسالها إلى الخادم بالضبط، أو الرد الذي تم تلقيه. من أصعب الأخطاء التي يمكن تتبعها هي قطع الاتصال بين ما نعتقد أننا نرسله إلى الخادم وما يحدث فعليًا عبر السلك.

تقدم هذه المقالة عدة أدوات يمكن أن تساعد في جعل البيانات المعروضة على السلك أكثر وضوحًا وفائدة. تُعرف هذه الأدوات عادةً باسم "رائحة الحزم"، وهي تلتقط جميع حزم الشبكة التي تتحرك عبر واجهة شبكتك. يمكن أن يكون فحص محتويات هذه الحزم والترتيب الذي تم إرسالها واستلامه فيه أسلوبًا مفيدًا لتصحيح الأخطاء.

مثال: استرداد خلاصة عامة

لقد شكّلت فريقًا لركوب الدراجات خلال الأعمال الخيرية، وأنشأت تقويمًا لفعاليات مثل جلسات المعلومات، وحملات جمع التبرّعات الجماعية، وجولات التدريب. لقد جعلت التقويم الحالي عامًا بحيث يمكن لأعضاء الفريق والركاب الآخرين عرض التقويم والمشاركة في الأحداث. أريد أيضًا إرسال نشرة إخبارية تحتوي على الأحداث القادمة، لذا بدلاً من نسخ المعلومات من موقع تقويم Google على الويب، يمكنني استخدام واجهة برمجة التطبيقات لبيانات تقويم Google للاستعلام عن هذا التقويم واسترداد الأحداث.

تتضمن وثائق واجهة برمجة تطبيقات تقويم Google معلومات حول كيفية استخدام واجهة برمجة تطبيقات بيانات Google RESTful للتفاعل مع تقويمي آليًا. (ملاحظة من المحرر: اعتبارًا من الإصدار 3، لن تستخدم واجهة برمجة تطبيقات تقويم Google تنسيق بيانات 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

يعرض مقتطف الشفرة أعلاه عناوين أحداث التقويم، ولكن ماذا عن بقية البيانات التي تلقيناها من الخادم؟ لا تُسهّل مكتبة عميل جافا إخراج خلاصة أو إدخال بتنسيق 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

إذا شغّلت هذا الأمر، ونفّذت المثال القصير جافا أعلاه، سترى كل اتصال الشبكة المضمّن في هذه العملية. من بين الزيارات، سترى طلب 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.

لإعادة إنشاء الفلتر المستخدم في مثال برنامج التتبع أعلاه، يمكنك إدراج التعبير التالي في مربع فلتر WireShark:

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

أو يمكنك الاستفادة من معرفة WireShark في HTTP:

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

وسيؤدي هذا إلى تصفية نتائج الالتقاط إلى الحزم المضمنة في هذا التفاعل فقط مع خادم تقويم Google. يمكنك النقر على كل حزمة للاطّلاع على المحتوى وتجميع المعاملة.

نصيحة: يمكنك النقر بزر الماوس الأيمن على إحدى الحزم واختيار "متابعة ساحة مشاركات TCP" لعرض الطلبات والردود بشكل تسلسلي في نافذة واحدة.

يوفر WireShark عدة طرق لحفظ معلومات الالتقاط. يمكنك حفظ حزمة واحدة أو بعض الحزم أو جميعها. إذا كنت تشاهد بث TCP، فيمكنك النقر على الزر "حفظ باسم" لحفظ الحزم ذات الصلة فقط. ويمكنك أيضًا استيراد الناتج من التقاط tcpdump وعرضه في WireShark.

مشكلة: طبقة المقابس الآمنة والتشفير

أحد أوجه القصور الشائعة في أدوات التقاط الحزم هو عدم القدرة على عرض البيانات المشفرة عبر اتصال طبقة المقابس الآمنة. يدخل المثال أعلاه إلى خلاصة عامة، لذا ليست هناك حاجة إلى طبقة المقابس الآمنة. ولكن إذا دخل المثال إلى خلاصة خاصة، فسيحتاج البرنامج إلى المصادقة مع خدمة مصادقة 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 محظور.
    • وفي حال نجاح العملية، تكون الاستجابة من الخدمة هي رمز الحالة 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 كخادم وكيل بين التطبيق والخدمات البعيدة التي تتفاعل معها، وبذلك يصبح الوسيط فعالاً. ينشئ Fiddler اتصال طبقة المقابس الآمنة بكلٍ من التطبيق وخدمة الويب البعيدة، ويفك تشفير حركة المرور من نقطة نهاية واحدة، ويلتقط النص العادي، ويعيد تشفير الزيارات قبل إرسالها. للأسف، لا يتوفر Fiddler إلا لأجهزة Windows وعذرًا لجميع مستخدمي نظامي التشغيل Mac وLinux.

ملاحظة: يتطلب دعم طبقة المقابس الآمنة الإصدار 2 من Fiddler والإصدار 2.0 من إطار عمل NET Framework.

يتم عرض حركة بيانات الشبكة في Fiddler في الغالب من خلال علامة التبويب "أداة فحص الجلسة". إن علامات التبويب الفرعية الأكثر فائدة لتصحيح الأخطاء في واجهات برمجة التطبيقات لبيانات Google هي:

  • رؤوس - تعرض رؤوس HTTP بتنسيق شجرة قابل للتصغير.
  • Auth - يعرض عنواني المصادقة.
  • Raw - يعرض محتويات حزم الشبكة في نص ASCII

نصيحة: انقر على الرمز في الجانب السفلي الأيمن من نافذة Fiddler لتشغيل الالتقاط أو إيقافه.

يستخدم Fiddler إطار عمل NET .لتهيئة اتصالات الشبكة لاستخدام Fiddler كخادم وكيل. وهذا يعني أن أية اتصالات تجريها باستخدام Internet Explorer أو باستخدام NET .ستظهر في Fiddler افتراضيًا. ومع ذلك، لن يظهر عدد الزيارات من نموذج جافا أعلاه نظرًا لأن جافا تحتوي على طريقة مختلفة لإعداد خوادم HTTP الوكيلة.

في جافا، يمكنك تعيين الخادم الوكيل HTTP باستخدام خصائص النظام. يتم تشغيل Fiddler على المنفذ 8888، ولذلك بالنسبة إلى عملية التثبيت المحلية، يمكنك جعل شفرة جافا تستخدم Fiddler كخادم وكيل لـ HTTP وHTTPS من خلال إضافة هذه الأسطر:

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

إذا شغّلت النموذج باستخدام هذه الأسطر، فستحصل على تتبع تكديس سيئ للغاية من حزمة أمان جافا:

[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 ليس جهة إصدار موثوقة، فستتسبب هذه الشهادات في إخفاق جافا في إعداد اتصال طبقة المقابس الآمنة.

ملاحظة: عندما يكون Fiddler قيد التشغيل، فإن أي اتصال طبقة المقابس الآمنة (SSL) الذي تجريه في Internet Explorer سيؤدي إلى تشغيل "تنبيه الأمان" لسؤالك عما إذا كنت تريد المتابعة على الرغم من الشهادة غير الواضحة. يمكنك النقر على "عرض الشهادة" للاطلاع على الشهادة التي أنشأها Fiddler.

إذًا كيف يمكنك تجنب هذا الاستثناء الأمني؟ في الأساس، يلزمك إعادة تهيئة إطار عمل أمان جافا للثقة في جميع الشهادات. لحسن الحظ، ليس عليك إعادة اختراع العجلة هنا، يمكنك الاطّلاع على حل فرانسيس لابري وإضافة طريقة SSLUtilities.trustAllHttpsCertificates() إلى المثال أعلاه.

بعد تهيئة جافا لاستخدام Fiddler كخادم وكيل وتعطيل التحقق من الشهادة الافتراضي، يمكنك تشغيل المثال والاطلاع على جميع الزيارات التي يتم إرسالها عبر السلك في النص العادي. لا تسرق كلمة المرور!

تذكر أن معاملة المصادقة هذه ما هي إلا مثال صغير واحد على زيارات طبقة المقابس الآمنة. تستخدم بعض تطبيقات الويب اتصالات طبقة المقابس الآمنة (SSL) بشكلٍ حصري، لذا فإن تصحيح أخطاء زيارات HTTP أمر غير وارد دون الحاجة إلى طريقة فك تشفير البيانات.

الخاتمة

تتوفر الأداة cpcp على Linux وMac OS X وWindows، كما أنها أداة رائعة عندما تعرف ما تبحث عنه وتحتاج إلى التقاط سريع فقط. ومع ذلك، تتوفّر بعض الأدوات الرسومية التي توفّر حركة بيانات الشبكة بتنسيقات يسهل فهمها. وتتضمّن الأداة tcpdump خيارات وإمكانيات فلترة أكثر من تلك التي تمت تغطيتها هنا. للحصول على وصف كامل لوظائف tcpdump، اكتب "man tcpdump" أو انتقِل إلى صفحة tcpdump man على الإنترنت.

يتوفر WireShark أيضًا على Linux وMac OS X وWindows. إن الدعم المدمج لمئات البروتوكولات يجعل WireShark أداة مفيدة للعديد من التطبيقات، وليس فقط تصحيح أخطاء HTTP. ولا تكاد هذه المقدمة تُبرز الكثير من إمكانات WireShark. لمزيد من المعلومات، يُرجى إدخال اسم "manwirkshark" أو زيارة موقع WireShark الإلكتروني.

كما يتميز Fiddler بالكثير من الميزات الرائعة، ولكن ما يميزه هو إمكانية فك تشفير حركة مرور طبقة المقابس الآمنة. للحصول على مزيد من المعلومات، انتقل إلى موقع Feddler2 الإلكتروني.

وتعد تطبيقات تقصي الحزم هذه أدوات رائعة تتوفر لديك في شريط الأدوات، وقد يلاحظ القراء المراقبون أنها كلها مجانية! في المرة المقبلة التي تعمل فيها مع واجهات برمجة تطبيقات Google ورأيت شيئًا مريبًا، اسحب أحد أدوات تحليل الشبكات هذه، وألقِ نظرة عن كثب على المكونات المتاحة. إذا لم تتمكن من العثور على المشكلة، يمكنك دائمًا نشر سؤال على مجموعة المناقشة. إن تضمين رسائل الشبكة ذات الصلة سيساعد الآخرين على استيعاب مشكلتك المحددة وتشخيصها.

نتمنى لك حظًا سعيدًا ونتمنى لك وقتًا ممتعًا!

الموارد