On the Wire: Network Capture Tools for API Developers

Lane LiaBraaten, zespół interfejsów API danych Google
czerwiec 2007 r.

Wprowadzenie

Tworzenie aplikacji, które wchodzą w interakcje z usługami internetowymi, wiąże się z wyjątkowymi problemami. Częstym źródłem frustracji jest brak dokładnej wiedzy o tym, jaka wiadomość została wysłana na serwer lub jaka odpowiedź została odebrana. Niektóre z najtrudniejszych do wykrycia błędów są spowodowane rozbieżnością między tym, co naszym zdaniem wysyłamy na serwer, a tym, co faktycznie jest przesyłane.

W tym artykule przedstawiamy kilka narzędzi, które mogą zwiększyć widoczność i użyteczność danych przesyłanych przez sieć. Te narzędzia, powszechnie nazywane „sniffers”, przechwytują wszystkie pakiety sieciowe przesyłane przez interfejs sieciowy. Sprawdzanie zawartości tych pakietów oraz kolejności, w jakiej zostały wysłane i odebrane, może być przydatną techniką debugowania.

Przykład: pobieranie publicznego pliku danych

Tworzę zespół kolarski, który weźmie udział w charytatywnym przejeździe rowerowym. Utworzyłem kalendarz wydarzeń, takich jak spotkania informacyjne, zbiórki pieniędzy na rzecz zespołu i treningi. Udostępniam ten kalendarz publicznie, aby członkowie zespołu i inni zawodnicy mogli go wyświetlać i brać udział w wydarzeniach. Chcę też wysyłać newsletter z informacjami o nadchodzących wydarzeniach, więc zamiast kopiować informacje ze strony Kalendarza Google mogę użyć interfejsu Google Calendar Data API, aby wysyłać zapytania do tego kalendarza i pobierać wydarzenia.

W dokumentacji interfejsu Google Calendar API znajdziesz informacje o tym, jak używać interfejsu Google Data API w formacie REST do programowego korzystania z kalendarza. (Uwaga redakcyjna: od wersji 3 interfejs Kalendarza Google API nie używa już formatu danych Google). Najpierw uzyskaj adres URL pliku danych wydarzeń kalendarza, klikając przycisk  na stronie ustawień kalendarza:

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

Korzystając z dokumentacji Kalendarza Google, mogę pobierać i wyświetlać wydarzenia z kalendarza w ten sposób, gdzie PUBLIC_FEED_URL zawiera adres URL pliku danych wydarzeń.

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();

Spowoduje to wyświetlenie podstawowej listy wydarzeń w moim kalendarzu:

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

Fragment kodu powyżej wyświetla tytuły wydarzeń w kalendarzu, ale co z pozostałymi danymi, które otrzymaliśmy z serwera? Biblioteka klienta Java nie ułatwia generowania pliku danych ani wpisu w formacie XML, a nawet gdyby to robiła, XML nie jest jedynym formatem. A co z nagłówkami HTTP, które towarzyszą żądaniu? Czy zapytanie zostało przekierowane przez serwer proxy? W przypadku bardziej złożonych operacji pytania te stają się coraz ważniejsze, zwłaszcza gdy coś idzie nie tak i pojawiają się błędy. Oprogramowanie do przechwytywania pakietów może odpowiedzieć na te pytania, ujawniając ruch w sieci.

tcpdump

tcpdump to narzędzie wiersza poleceń, które działa na platformach podobnych do systemu Unix, ale istnieje też wersja dla systemu Windows o nazwie WinDump. Podobnie jak większość programów do przechwytywania pakietów, tcpdump przełącza kartę sieciową w tryb mieszany, co wymaga uprawnień superużytkownika. Aby użyć tcpdump, wystarczy określić interfejs sieciowy, na którym ma być nasłuchiwany ruch sieciowy, a ruch sieciowy zostanie wysłany do stdout:

sudo tcpdump -i eth0

Jeśli uruchomisz to polecenie, zobaczysz mnóstwo różnych danych sieciowych, z których część będzie Ci nieznana. Możesz po prostu przekierować dane wyjściowe do pliku i później użyć polecenia grep, ale może to prowadzić do tworzenia bardzo dużych plików. Większość programów do przechwytywania pakietów ma wbudowane mechanizmy filtrowania, dzięki czemu przechwytujesz tylko to, czego potrzebujesz.

tcpdump obsługuje filtrowanie na podstawie różnych cech ruchu sieciowego. Możesz na przykład polecić tcpdump, aby przechwytywał tylko ruch do lub z serwera na porcie 80 (wiadomości HTTP), wstawiając nazwę hosta serwera do tego wyrażenia:

dst or src host <hostname> and port 80

W przypadku każdego pakietu, który pasuje do wyrażenia filtra, tcpdump wyświetli sygnaturę czasową, źródło i miejsce docelowe pakietu oraz kilka flag TCP. Te informacje mogą być przydatne, ponieważ pokazują kolejność wysyłania i odbierania pakietów.

Często warto też zobaczyć zawartość pakietów. Flaga „-A” informuje narzędzie tcpdump, że ma drukować każdy pakiet w formacie ASCII, co pozwala wyświetlić nagłówki HTTP i treść wiadomości. Flaga „-s” służy do określania liczby bajtów do wyświetlenia (gdzie „-s 0” oznacza, że treść wiadomości nie ma być w ogóle obcinana).

Łącząc to wszystko, otrzymujemy to polecenie:

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

Jeśli uruchomisz to polecenie, a potem wykonasz krótki przykład w języku Java podany powyżej, zobaczysz całą komunikację sieciową związaną z tą operacją. W ruchu zobaczysz żądanie 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

Zobaczysz też 200 OK wiadomość z odpowiedzią zawierającą plik danych Google. Zwróć uwagę, że plik danych jest podzielony na 4 pakiety:

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>

Dane wyjściowe obejmują wszystkie nagłówki i treści HTTP, a także kilka tajemniczych flag TCP. Wszystkie dane są tu obecne, ale trudno je odczytać i zrozumieć. Dostępnych jest kilka narzędzi graficznych, które ułatwiają wyświetlanie tych danych.

WireShark (dawniej Ethereal)

Zrzut ekranu z programu Wireshark
WireShark wyświetla ruch sieciowy na kilka sposobów.

WireShark to narzędzie graficzne oparte na bibliotece libpcap, czyli tej samej, na której opiera się tcpdump. Jest ono dostępne w systemach Linux, Mac OS X i Windows. Interfejs GUI Wiresharka umożliwia interpretowanie i wykorzystywanie danych przechwyconych pakietów na kilka nowych sposobów. Na przykład pakiety przechwytywane z interfejsu sieciowego są wyświetlane w różnych kolorach w zależności od używanego protokołu. Możesz też sortować ruch według sygnatury czasowej, źródła, miejsca docelowego i protokołu.

Jeśli wybierzesz wiersz na liście pakietów, Wireshark wyświetli informacje o IP, TCP i innych protokołach w nagłówkach pakietów w postaci czytelnego drzewa. Dane są też wyświetlane w formacie szesnastkowym i ASCII u dołu ekranu.

Chociaż wizualny charakter WireSharka ułatwia zrozumienie ruchu w sieci, w większości przypadków warto go filtrować. WireShark ma zaawansowane funkcje filtrowania, w tym obsługę setek protokołów.

WSKAZÓWKA: aby wyświetlić dostępne protokoły i tworzyć złożone filtry, kliknij przycisk  u góry okna WireShark.

Aby odtworzyć filtr użyty w przykładzie tcpdump powyżej, możesz wstawić to wyrażenie w polu filtra WireShark:

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

Możesz też skorzystać z wiedzy WireSharka o protokole HTTP:

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

Spowoduje to przefiltrowanie wyników przechwytywania tak, aby zawierały tylko pakiety związane z tą interakcją z serwerem Kalendarza Google. Możesz kliknąć każdy pakiet, aby zobaczyć jego zawartość i złożyć transakcję.

WSKAZÓWKA: możesz kliknąć prawym przyciskiem myszy jeden z pakietów i wybrać „Follow TCP Stream” (Śledź strumień TCP), aby wyświetlić żądania i odpowiedzi kolejno w jednym oknie.

WireShark udostępnia kilka sposobów zapisywania informacji o przechwytywaniu. Możesz zapisać jeden, kilka lub wszystkie pakiety. Jeśli przeglądasz strumień TCP, możesz po prostu kliknąć przycisk „Zapisz jako”, aby zapisać tylko odpowiednie pakiety. Możesz też zaimportować dane wyjściowe z zrzutu tcpdump i wyświetlić je w programie WireShark.

Problem: SSL i szyfrowanie

Częstym niedociągnięciem narzędzi do przechwytywania pakietów jest brak możliwości wyświetlania danych zaszyfrowanych w połączeniu SSL. W powyższym przykładzie uzyskuje się dostęp do publicznego pliku danych, więc SSL nie jest konieczny. Jeśli jednak przykład uzyskuje dostęp do prywatnego kanału, klient musi uwierzytelnić się w usłudze uwierzytelniania Google, co wymaga połączenia SSL.

Poniższy fragment kodu jest podobny do poprzedniego przykładu, ale w tym przypadku CalendarService żąda metakanału kalendarza użytkownika, który jest kanałem prywatnym wymagającym uwierzytelniania. Aby się uwierzytelnić, wystarczy wywołać metodę setUserCredentials. Ta metoda wywołuje żądanie HTTPS do usługi ClientLogin i pobiera z odpowiedzi token uwierzytelniający. Obiekt CalendarService będzie następnie uwzględniać token uwierzytelniający we wszystkich kolejnych żądaniach.

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();

Weź pod uwagę ruch sieciowy wymagany do uwierzytelnienia i uzyskania dostępu do prywatnego pliku danych interfejsu Google Data API:

  1. Przesyłanie danych logowania użytkownika do usługi ClientLogin
    • Wyślij żądanie HTTP POST do https://www.google.com/accounts/ClientLogin z tymi parametrami w treści wiadomości:
      • E-mail – adres e-mail użytkownika.
      • Passwd – hasło użytkownika.
      • source – identyfikuje aplikację klienta. Powinna mieć format nazwa_firmy-nazwa_aplikacji-identyfikator_wersji. W przykładach używamy nazwy ExampleCo-FiddlerSSLExample-1.
      • service – nazwa usługi Kalendarz Google to „cl”.
  2. Otrzymanie tokena autoryzacji
    • Jeśli żądanie uwierzytelniania się nie powiedzie, otrzymasz kod stanu HTTP 403 Forbidden.
    • Jeśli się to uda, odpowiedź z usługi będzie zawierać kod stanu HTTP 200 OK oraz 3 długie kody alfanumeryczne w treści odpowiedzi: SID, LSIDAuth. Wartość Auth to token autoryzacji.
  3. Prośba o prywatny metadane kalendarza
    • Wyślij żądanie HTTP GET do http://www.google.com/calendar/feeds/default z tym nagłówkiem:
    • Authorization: GoogleLogin auth=<yourAuthToken>
      

Spróbuj uruchomić ten fragment kodu i wyświetlić ruch w sieci w programie WireShark (używając filtra „http || ssl”). Zobaczysz pakiety SSL i TLS związane z transakcją, ale pakiety żądania i odpowiedzi ClientLogin są zaszyfrowane w pakietach „Dane aplikacji”. Nie martw się, w dalszej części pokażemy narzędzie, które może ujawnić te zaszyfrowane informacje.

Fiddler

Fiddler to kolejne graficzne narzędzie do przechwytywania pakietów, ale działa zupełnie inaczej niż przedstawione do tej pory narzędzia. Fiddler działa jako serwer proxy między aplikacją a usługami zdalnymi, z którymi wchodzi w interakcję, stając się w ten sposób pośrednikiem. Fiddler nawiązuje połączenie SSL zarówno z aplikacją, jak i z usługą sieciową, odszyfrowuje ruch z jednego punktu końcowego, przechwytuje tekst jawny i ponownie szyfruje ruch przed wysłaniem go dalej. Niestety Fiddler jest dostępny tylko w systemie Windows. Przepraszamy użytkowników komputerów Mac i systemu Linux.

Uwaga: obsługa SSL wymaga Fiddlera w wersji 2 i .NET Framework w wersji 2.0.

Wyświetlanie ruchu sieciowego w programie Fiddler odbywa się głównie na karcie Session Inspector (Inspektor sesji). Podzakładki najbardziej przydatne do debugowania problemów z interfejsami Google Data API to:

  • Nagłówki – wyświetla nagłówki HTTP w formacie drzewa, które można zwinąć.
  • Auth (Uwierzytelnianie) – wyświetla nagłówki uwierzytelniania.
  • Surowe – wyświetla zawartość pakietów sieciowych w tekście ASCII.

WSKAZÓWKA: kliknij ikonę  w lewym dolnym rogu okna Fiddler, aby włączyć i wyłączyć rejestrowanie.

Fiddler używa platformy .NET Framework do konfigurowania połączeń sieciowych w taki sposób, aby korzystały z Fiddlera jako serwera proxy. Oznacza to, że wszystkie połączenia nawiązywane za pomocą Internet Explorera lub kodu .NET będą domyślnie widoczne w Fiddlerze. Ruch z przykładowego kodu w języku Java nie będzie jednak widoczny, ponieważ w tym języku serwery proxy HTTP konfiguruje się w inny sposób.

W języku Java możesz ustawić serwer proxy HTTP za pomocą właściwości systemowych. Fiddler działa na porcie 8888, więc w przypadku instalacji lokalnej możesz sprawić, że kod Java będzie używać Fiddlera jako serwera proxy dla protokołów HTTP i HTTPS, dodając te wiersze:

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

Jeśli uruchomisz przykład z tymi wierszami, otrzymasz nieprzyjemny ślad stosu z pakietu zabezpieczeń 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
Zrzut ekranu przedstawiający Fiddlera
Fiddler może odszyfrowywać i wyświetlać ruch SSL.

Ten błąd występuje, gdy nie można zweryfikować certyfikatu zwróconego przez serwer w połączeniu SSL. W tym przypadku nieprawidłowy certyfikat pochodzi z narzędzia Fiddler, które działa jako atakujący typu „man in the middle”. Fiddler generuje certyfikaty na bieżąco, a ponieważ nie jest zaufanym wystawcą, te certyfikaty spowodują, że Java nie będzie w stanie skonfigurować połączenia SSL.

Uwaga: gdy Fiddler jest uruchomiony, każde połączenie SSL nawiązywane w programie Internet Explorer powoduje wyświetlenie „Alertu bezpieczeństwa” z pytaniem, czy chcesz kontynuować pomimo podejrzanego certyfikatu. Aby wyświetlić certyfikat wygenerowany przez Fiddlera, kliknij „View Certificate” (Wyświetl certyfikat).

Jak obejść to wyłączenie zabezpieczeń? Musisz ponownie skonfigurować platformę zabezpieczeń Javy, aby ufała wszystkim certyfikatom. Na szczęście nie musisz wymyślać koła od nowa. Zapoznaj się z rozwiązaniem Francisa Labrie i dodaj metodę SSLUtilities.trustAllHttpsCertificates() do powyższego przykładu.

Po skonfigurowaniu Javy do używania Fiddlera jako serwera proxy i wyłączeniu domyślnej weryfikacji certyfikatu możesz uruchomić przykład i zobaczyć cały ruch przesyłany przez sieć w postaci zwykłego tekstu. Nie kradnij mojego hasła!

Pamiętaj, że ta transakcja uwierzytelniania to tylko jeden z wielu przykładów ruchu SSL. Niektóre aplikacje internetowe używają wyłącznie połączeń SSL, więc debugowanie ruchu HTTP jest niemożliwe bez sposobu na odszyfrowanie danych.

Podsumowanie

tcpdump jest dostępny w systemach Linux, Mac OS X i Windows. To świetne narzędzie, gdy wiesz, czego szukasz, i potrzebujesz tylko szybkiego przechwycenia. Istnieją jednak narzędzia graficzne, które przedstawiają ruch sieciowy w formatach łatwiejszych do zrozumienia. tcpdump ma znacznie więcej opcji i możliwości filtrowania niż te, które zostały tu omówione. Pełny opis funkcji tcpdump znajdziesz, wpisując „man tcpdump” lub odwiedzając stronę man tcpdump online.

WireShark jest też dostępny w systemach Linux, Mac OS X i Windows. Wbudowana obsługa setek protokołów sprawia, że WireShark jest przydatnym narzędziem w wielu zastosowaniach, nie tylko do debugowania HTTP. To tylko ułamek możliwości Wiresharka. Więcej informacji znajdziesz, wpisując „man wireshark” lub odwiedzając stronę internetową WireShark.

Fiddler ma też wiele świetnych funkcji, ale wyróżnia go możliwość odszyfrowywania ruchu SSL. Więcej informacji znajdziesz na stronie Fiddler2.

Te aplikacje do przechwytywania pakietów to świetne narzędzia, które warto mieć w swoim arsenale. Uważni czytelnicy zauważą, że wszystkie są bezpłatne. Gdy następnym razem będziesz pracować z interfejsami API Google i zauważysz coś podejrzanego, użyj jednego z tych analizatorów sieci i przyjrzyj się bliżej temu, co się dzieje. Jeśli nie możesz znaleźć rozwiązania problemu, zawsze możesz zadać pytanie w naszej grupie dyskusyjnej. Dołączenie odpowiednich komunikatów sieciowych pomoże innym zrozumieć i zdiagnozować Twój konkretny problem.

Powodzenia i miłego wąchania!

Zasoby