On the Wire: Network Capture Tools for API Developers

Lane LiaBraaten, Google Data APIs-Team
Juni 2007

Einführung

Die Entwicklung von Anwendungen, die mit Webdiensten interagieren, birgt eine Reihe besonderer Probleme. Eine häufige Frustquelle ist, dass man nicht genau weiß, welche Nachricht an den Server gesendet wurde oder welche Antwort empfangen wurde. Einige der schwierigsten Fehler, die es zu finden gilt, werden durch eine Diskrepanz zwischen dem, was wir an den Server senden, und dem, was tatsächlich über die Leitung geht, verursacht.

In diesem Artikel werden verschiedene Tools vorgestellt, mit denen die Datenübertragung besser sichtbar und nützlicher gemacht werden kann. Diese Tools, die häufig als „Packet Sniffer“ bezeichnet werden, erfassen alle Netzwerkpakete, die über Ihre Netzwerkschnittstelle übertragen werden. Die Inhalte dieser Pakete und die Reihenfolge, in der sie gesendet und empfangen wurden, können bei der Fehlersuche hilfreich sein.

Beispiel: Öffentlichen Feed abrufen

Ich stelle ein Radsportteam für eine Wohltätigkeitsfahrt zusammen und habe einen Kalender für Veranstaltungen wie Informationsveranstaltungen, Spendenaktionen und Trainingsfahrten erstellt. Ich habe diesen Kalender öffentlich gemacht, damit Teammitglieder und andere Fahrer ihn aufrufen und an den Terminen teilnehmen können. Ich möchte auch einen Newsletter mit anstehenden Terminen versenden. Anstatt die Informationen von der Google Kalender-Website zu kopieren, kann ich die Google Kalender Data API verwenden, um diesen Kalender abzufragen und Termine abzurufen.

In der Google Calendar API-Dokumentation finden Sie Informationen dazu, wie Sie die RESTful Google Data API verwenden, um programmatisch mit Ihrem Kalender zu interagieren. Hinweis des Redakteurs:Ab Version 3 wird für die Google Kalender API nicht mehr das Google Data-Format verwendet. Als Erstes müssen Sie die URL des Terminfeeds des Kalenders abrufen. Klicken Sie dazu auf der Seite mit den Kalendereinstellungen auf die Schaltfläche :

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

Anhand der Google Kalender-Dokumentation kann ich Kalendertermine so abrufen und anzeigen, wobei PUBLIC_FEED_URL die URL des Terminfeeds enthält.

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

Dadurch wird eine einfache Liste der Termine in meinem Kalender erstellt:

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

Im Code-Snippet oben werden die Titel der Kalenderereignisse angezeigt. Was ist aber mit den restlichen Daten, die wir vom Server erhalten haben? Mit der Java-Clientbibliothek ist es nicht einfach, einen Feed oder Eintrag als XML auszugeben. Selbst wenn dies möglich wäre, ist XML nicht alles. Was ist mit den HTTP-Headern, die mit der Anfrage gesendet werden? Wurde die Anfrage über einen Proxy weitergeleitet oder umgeleitet? Bei komplexeren Vorgängen werden diese Fragen immer wichtiger, insbesondere wenn etwas schiefgeht und wir Fehler erhalten. Paket-Sniffing-Software kann diese Fragen beantworten, indem sie den Netzwerkverkehr aufdeckt.

tcpdump

tcpdump ist ein Befehlszeilentool, das auf Unix-ähnlichen Plattformen funktioniert. Es gibt aber auch einen Windows-Port namens WinDump. Wie die meisten Packet Sniffer versetzt tcpdump Ihre Netzwerkkarte in den Promiscuous-Modus, was Superuser-Berechtigungen erfordert. Wenn Sie „tcpdump“ verwenden möchten, geben Sie einfach die Netzwerkschnittstelle an, die überwacht werden soll. Der Netzwerkverkehr wird dann an „stdout“ gesendet:

sudo tcpdump -i eth0

Wenn Sie diesen Befehl ausführen, werden Sie mit allen möglichen Arten von Netzwerkverkehr bombardiert, von denen Sie einige nicht einmal erkennen werden. Sie könnten die Ausgabe einfach an eine Datei weiterleiten und sie später mit grep durchsuchen, aber das könnte zu sehr großen Dateien führen. Die meisten Softwareprogramme zur Paketerfassung haben integrierte Filtermechanismen, damit Sie nur das erfassen, was Sie benötigen.

„tcpdump“ unterstützt das Filtern basierend auf verschiedenen Merkmalen des Netzwerkverkehrs. Sie können tcpdump beispielsweise anweisen, nur den Traffic zu oder von Ihrem Server an Port 80 (HTTP-Nachrichten) zu erfassen, indem Sie den Hostnamen Ihres Servers in den folgenden Ausdruck einfügen:

dst or src host <hostname> and port 80

Für jedes Paket, das dem Filterausdruck entspricht, zeigt tcpdump einen Zeitstempel, die Quelle und das Ziel des Pakets sowie mehrere TCP-Flags an. Diese Informationen können wertvoll sein, da sie die Reihenfolge zeigen, in der Pakete gesendet und empfangen wurden.

Oft ist es auch hilfreich, den Inhalt der Pakete zu sehen. Das Flag „-A“ weist tcpdump an, jedes Paket in ASCII zu drucken, wodurch die HTTP-Header und der Nachrichtentext sichtbar werden. Mit dem Flag „-s“ wird angegeben, wie viele Byte angezeigt werden sollen. „-s 0“ bedeutet, dass der Nachrichtentext überhaupt nicht gekürzt wird.

Insgesamt ergibt sich der folgende Befehl:

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

Wenn Sie diesen Befehl ausführen und dann das kurze Java-Beispiel oben, sehen Sie die gesamte Netzwerkkommunikation, die mit diesem Vorgang verbunden ist. Unter dem Traffic sehen Sie die HTTP-GET-Anfrage:

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

Außerdem wird die Antwortnachricht 200 OK mit dem Google-Datenfeed angezeigt. Der Feed ist in vier Pakete unterteilt:

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>

Diese Ausgabe enthält alle HTTP-Header und ‑Inhalte sowie mehrere kryptische TCP-Flags. Alle Daten sind hier vorhanden, aber sie sind schwer zu lesen und zu verstehen. Es gibt mehrere grafische Tools, die die Anzeige dieser Daten erleichtern.

WireShark (früher Ethereal)

Screenshot von Wireshark
WireShark zeigt den Netzwerkverkehr auf verschiedene Arten an.

WireShark ist ein grafisches Tool, das mit libpcap erstellt wurde, derselben Bibliothek, auf der auch tcpdump basiert. Es ist für Linux, Mac OS X und Windows verfügbar. Die Benutzeroberfläche von WireShark bietet mehrere neue Möglichkeiten, Paketaufzeichnungsdaten zu interpretieren und mit ihnen zu interagieren. Wenn beispielsweise Pakete von Ihrer Netzwerkschnittstelle erfasst werden, werden sie je nach verwendetem Protokoll in verschiedenen Farben dargestellt. Sie können den Traffic auch nach Zeitstempel, Quelle, Ziel und Protokoll sortieren.

Wenn Sie eine Zeile in der Liste der Pakete auswählen, zeigt Wireshark IP-, TCP- und andere protokollspezifische Informationen in den Paketheadern in einem für Menschen lesbaren Baum an. Die Daten werden auch unten auf dem Bildschirm in HEX und ASCII angezeigt.

Die visuelle Darstellung von WireShark erleichtert zwar das Verständnis des Netzwerkverkehrs, in den meisten Fällen sollten Sie den Netzwerkverkehr jedoch filtern. WireShark bietet leistungsstarke Filterfunktionen, einschließlich Unterstützung für Hunderte von Protokollen.

TIPP:Wenn Sie die verfügbaren Protokolle aufrufen und komplexe Filter erstellen möchten, klicken Sie oben im Wireshark-Fenster auf die Schaltfläche .

Um den im tcpdump-Beispiel oben verwendeten Filter zu erstellen, können Sie den folgenden Ausdruck in das WireShark-Filterfeld einfügen:

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

Oder nutzen Sie die HTTP-Kenntnisse von WireShark:

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

Dadurch werden die Ergebnisse der Erfassung auf die Pakete gefiltert, die an dieser Interaktion mit dem Google Kalender-Server beteiligt sind. Sie können auf jedes Paket klicken, um den Inhalt zu sehen und die Transaktion zusammenzufügen.

TIPP:Sie können mit der rechten Maustaste auf eines der Pakete klicken und „TCP-Stream folgen“ auswählen, um die Anfragen und Antworten sequenziell in einem einzigen Fenster anzuzeigen.

WireShark bietet verschiedene Möglichkeiten, die erfassten Informationen zu speichern. Sie können ein, mehrere oder alle Pakete speichern. Wenn Sie einen TCP-Stream ansehen, können Sie einfach auf die Schaltfläche „Speichern unter“ klicken, um nur die relevanten Pakete zu speichern. Sie können auch die Ausgabe einer tcpdump-Aufzeichnung importieren und in WireShark ansehen.

Problem: SSL und Verschlüsselung

Ein häufiger Nachteil von Tools zur Paketerfassung ist, dass Daten, die über eine SSL-Verbindung verschlüsselt werden, nicht angezeigt werden können. Im obigen Beispiel wird auf einen öffentlichen Feed zugegriffen, daher ist SSL nicht erforderlich. Wenn im Beispiel jedoch auf einen privaten Feed zugegriffen würde, müsste sich der Client beim Google-Authentifizierungsdienst authentifizieren, was eine SSL-Verbindung erfordert.

Das folgende Snippet ähnelt dem vorherigen Beispiel. Hier wird jedoch mit CalendarService der Metafeed des Nutzerkalenders angefordert. Das ist ein privater Feed, für den eine Authentifizierung erforderlich ist. Rufen Sie zur Authentifizierung einfach die Methode setUserCredentials auf. Mit dieser Methode wird eine HTTPS-Anfrage an den ClientLogin-Dienst gesendet und das Authentifizierungstoken aus der Antwort abgerufen. Das CalendarService-Objekt enthält dann das Authentifizierungstoken in allen nachfolgenden Anfragen.

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

Sehen Sie sich den Netzwerk-Traffic an, der für die Authentifizierung und den Zugriff auf einen privaten Google Data API-Feed erforderlich ist:

  1. Nutzeranmeldedaten an den ClientLogin-Dienst senden
    • Senden Sie eine HTTP-POST-Anfrage an https://www.google.com/accounts/ClientLogin mit den folgenden Parametern im Nachrichtentext:
      • E-Mail: Die E-Mail-Adresse des Nutzers.
      • Passwd: Das Passwort des Nutzers.
      • source: Gibt Ihre Clientanwendung an. Das Format sollte „companyName-applicationName-versionID“ sein. In den Beispielen wird der Name ExampleCo-FiddlerSSLExample-1 verwendet.
      • service: Der Google Kalender-Dienstname ist „cl“.
  2. Autorisierungstoken erhalten
    • Wenn die Authentifizierungsanfrage fehlschlägt, erhalten Sie den HTTP-Statuscode „403 Forbidden“ (Zugriff verweigert / verboten).
    • Wenn der Vorgang erfolgreich ist, enthält die Antwort des Dienstes den HTTP-Statuscode „200 OK“ sowie drei lange alphanumerische Codes im Antworttext: SID, LSID und Auth. Der Wert Auth ist das Autorisierungstoken.
  3. Metafeed für privaten Kalender anfordern
    • Senden Sie eine HTTP-GET-Anfrage an http://www.google.com/calendar/feeds/default mit dem folgenden Header:
    • Authorization: GoogleLogin auth=<yourAuthToken>
      

Führen Sie diesen Snippet aus und sehen Sie sich den Netzwerkverkehr in WireShark an (verwenden Sie „http || ssl“ als Filter). Sie sehen die an der Transaktion beteiligten SSL- und TLS-Pakete, die ClientLogin-Anfrage- und Antwortpakete sind jedoch in den „Application Data“-Paketen verschlüsselt. Keine Sorge, als Nächstes sehen wir uns ein Tool an, mit dem sich diese verschlüsselten Informationen aufdecken lassen.

Fiddler

Fiddler ist ein weiteres grafisches Tool zum Erfassen von Paketen, das sich jedoch ganz anders verhält als die bisher vorgestellten Tools. Fiddler fungiert als Proxy zwischen Ihrer Anwendung und den Remote-Diensten, mit denen Sie interagieren. Fiddler stellt eine SSL-Verbindung sowohl zu Ihrer Anwendung als auch zum Remote-Webdienst her, entschlüsselt den Traffic von einem Endpunkt, erfasst den Klartext und verschlüsselt den Traffic wieder, bevor er gesendet wird. Leider ist Fiddler nur für Windows verfügbar.

Hinweis:Für die SSL-Unterstützung ist Fiddler Version 2 und .NET Framework Version 2.0 erforderlich.

Der Netzwerkverkehr wird in Fiddler hauptsächlich über den Tab „Session Inspector“ angezeigt. Die Untertabs, die für die Fehlerbehebung bei Problemen mit den Google Data APIs am nützlichsten sind:

  • Header: Hier werden die HTTP-Header in einem minimierbaren Baumformat angezeigt.
  • Auth: Hier werden die Authentifizierungsheader angezeigt.
  • Roh: Zeigt den Inhalt von Netzwerkpaketen als ASCII-Text an.

TIPP:Klicken Sie links unten im Fiddler-Fenster auf das Symbol , um die Erfassung zu aktivieren und zu deaktivieren.

Fiddler verwendet das .NET Framework, um Netzwerkverbindungen so zu konfigurieren, dass Fiddler als Proxy verwendet wird. Das bedeutet, dass alle Verbindungen, die Sie mit Internet Explorer oder mit .NET-Code herstellen, standardmäßig in Fiddler angezeigt werden. Der Traffic aus dem Java-Beispiel oben wird jedoch nicht angezeigt, da HTTP-Proxys in Java anders eingerichtet werden.

In Java können Sie den HTTP-Proxy mithilfe von Systemeigenschaften festlegen. Fiddler wird auf Port 8888 ausgeführt. Bei einer lokalen Installation können Sie Fiddler als Proxy für HTTP und HTTPS verwenden, indem Sie diese Zeilen hinzufügen:

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

Wenn Sie das Beispiel mit diesen Zeilen ausführen, erhalten Sie einen unschönen Stacktrace vom Java-Sicherheitspaket:

[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
Screenshot von Fiddler
Fiddler kann SSL-Traffic entschlüsseln und anzeigen.

Dieser Fehler tritt auf, wenn das von einem Server in einer SSL-Verbindung zurückgegebene Zertifikat nicht überprüft werden kann. In diesem Fall stammt das ungültige Zertifikat von Fiddler, der als Man-in-the-Middle fungiert. Fiddler generiert Zertifikate im laufenden Betrieb. Da Fiddler kein vertrauenswürdiger Aussteller ist, führen diese Zertifikate dazu, dass Java keine SSL-Verbindung herstellen kann.

Hinweis:Wenn Fiddler ausgeführt wird, löst jede SSL-Verbindung, die Sie in Internet Explorer herstellen, eine Sicherheitswarnung aus, in der Sie gefragt werden, ob Sie trotz des fragwürdigen Zertifikats fortfahren möchten. Sie können auf „Zertifikat ansehen“ klicken, um das von Fiddler generierte Zertifikat aufzurufen.

Wie können Sie diese Sicherheitsausnahme umgehen? Sie müssen das Sicherheitsframework von Java so konfigurieren, dass allen Zertifikaten vertraut wird. Glücklicherweise müssen Sie das Rad hier nicht neu erfinden. Sehen Sie sich die Lösung von Francis Labrie an und fügen Sie dem Beispiel oben die SSLUtilities.trustAllHttpsCertificates()-Methode hinzu.

Nachdem Sie Java so konfiguriert haben, dass Fiddler als Proxy verwendet wird, und die Standardzertifikatsprüfung deaktiviert haben, können Sie das Beispiel ausführen und den gesamten Traffic, der über die Leitung gesendet wird, im Klartext sehen. Stehl nicht mein Passwort!

Diese Authentifizierungstransaktion ist nur ein kleines Beispiel für SSL-Traffic. Einige Webanwendungen verwenden ausschließlich SSL-Verbindungen. Daher ist das Debuggen von HTTP-Traffic ohne Möglichkeit zur Entschlüsselung der Daten nicht möglich.

Fazit

tcpdump ist für Linux, Mac OS X und Windows verfügbar und ist ein hervorragendes Tool, wenn Sie wissen, wonach Sie suchen, und nur eine schnelle Erfassung benötigen. Es gibt jedoch einige grafische Tools, die den Netzwerkverkehr in leichter verständlichen Formaten darstellen. tcpdump bietet viel mehr Optionen und Filterfunktionen als die hier behandelten. Eine vollständige Beschreibung der Funktionen von tcpdump erhalten Sie, wenn Sie „man tcpdump“ eingeben oder die tcpdump-Manpage online aufrufen.

WireShark ist auch für Linux, Mac OS X und Windows verfügbar. Die integrierte Unterstützung für Hunderte von Protokollen macht WireShark zu einem nützlichen Tool für viele Anwendungen, nicht nur für das HTTP-Debugging. Diese Einführung kratzt nur an der Oberfläche der vielen Funktionen von Wireshark. Weitere Informationen erhalten Sie, wenn Sie „man wireshark“ eingeben oder die WireShark-Website aufrufen.

Fiddler bietet viele tolle Funktionen, aber was es wirklich einzigartig macht, ist die Möglichkeit, SSL-Traffic zu entschlüsseln. Weitere Informationen finden Sie auf der Fiddler2-Website.

Diese Anwendungen zum Erfassen von Paketen sind großartige Tools, die Sie in Ihrem Repertoire haben sollten. Aufmerksame Leser werden bemerkt haben, dass sie alle kostenlos sind. Wenn Sie das nächste Mal mit den Google-APIs arbeiten und etwas Ungewöhnliches bemerken, können Sie eines dieser Netzwerk-Analysetools verwenden, um sich genauer anzusehen, was übertragen wird. Wenn Sie das Problem nicht finden können, können Sie jederzeit eine Frage in unserer Diskussionsgruppe posten. Wenn Sie die relevanten Netzwerkbenachrichtigungen angeben, können andere Ihr Problem besser nachvollziehen und diagnostizieren.

Viel Glück und viel Spaß beim Schnüffeln!

Ressourcen