05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

314 6 Netzwerkprogrammierung <strong>mit</strong> <strong>SSL</strong><br />

Sowohl Open<strong>SSL</strong> als auch GnuTLS sind Open-Source-Implementierungen des<br />

<strong>SSL</strong>/TLS-Protokolls, die netzwerkbasierten Anwendungen eine Programmierschnittstelle<br />

(API) zur Nutzung der <strong>SSL</strong>-Funktionalität bereitstellen. Die<br />

APIs der beiden konkurrierenden <strong>SSL</strong>-Bibliotheken sind dabei durchaus unterschiedlich.<br />

Um eine möglichst unkomplizierte Integration in bereits existierende<br />

Open<strong>SSL</strong>-Anwendungen zu ermöglichen, enthält die erst später entwickelte<br />

GnuTLS-Bibliothek zusätzlich zur GnuTLS-API eine Emulations-<br />

”<br />

API“ <strong>mit</strong> eingeschränktem, Open<strong>SSL</strong>-kompatiblem Funktionsumfang. Beide<br />

<strong>SSL</strong>-Implementierungen beherrschen die Protokollversionen <strong>SSL</strong> 3.0, TLS 1.0<br />

<strong>und</strong> TLS 1.1. Open<strong>SSL</strong> implementiert darüber hinaus noch <strong>SSL</strong> 2.0, das von<br />

GnuTLS aus Sicherheitsgründen erst gar nicht mehr angeboten wird. Selbstverständlich<br />

kann (<strong>und</strong> sollte) man trotzdem auch in Open<strong>SSL</strong>-basierten Anwendungen<br />

auf die Unterstützung von <strong>SSL</strong> 2.0 verzichten.<br />

Wir konzentrieren uns in den kommenden Abschnitten ausschließlich auf die<br />

Netzwerkprogrammierung <strong>mit</strong> Open<strong>SSL</strong>. Bevor wir allerdings die ersten praktischen<br />

Schritte unternehmen, werfen wir noch einen Blick auf die Arbeitsschritte<br />

bei der <strong>SSL</strong>-Kommunikation <strong>und</strong> überlegen uns, wie sich (bestehende)<br />

Anwendungsprotokolle elegant um <strong>SSL</strong> erweitern lassen.<br />

6.2.1 Datentransfer über <strong>SSL</strong><br />

Soll eine neue <strong>SSL</strong>-Verbindung aufgebaut werden, so starten Client <strong>und</strong> Server<br />

zur gegenseitigen Begrüßung als erstes ein sogenanntes Handshake-Verfahren,<br />

welches entsprechend dem TLS Handshake Protocol abgewickelt wird. Abbildung<br />

6.1 zeigt das Verfahren im Überblick. Kompakt dargestellt, wird über<br />

diesen in RFC 2246 [DA99] spezifizierten Ablauf die Authentizität der Kommunikationspartner<br />

geprüft <strong>und</strong> ein Kommunikationsschlüssel für den eigentlichen<br />

Datentransfer vereinbart.<br />

<strong>SSL</strong>-Handshake<br />

Der typische <strong>SSL</strong>-Verbindungsaufbau funktioniert wie folgt: Der Client schickt<br />

zunächst eine Begrüßungsformel ClientHello an den Server, die dieser <strong>mit</strong> einem<br />

ServerHello beantwortet. Die beiden Kommunikationspartner tauschen<br />

in dieser Phase u. a. je 28 Bytes an zufälligen Daten aus (ClientHello.random<br />

<strong>und</strong> ServerHello.random), die später in die Berechnung des Master-Secrets<br />

einfließen <strong>und</strong> vor Capture-/Replay-Attacken schützen. Außerdem einigen sich<br />

die Parteien auf eine für die weitere Kommunikation zu verwendende Protokollversion<br />

(derzeit <strong>SSL</strong> 2.0, <strong>SSL</strong> 3.0, TLS 1.0, TLS 1.1) <strong>und</strong> eine sogenannte<br />

Cipher Suite. Die Cipher Suite ist ein Tripel aus Schlüsselaustauschverfahren,<br />

Verschlüsselungsalgorithmus <strong>und</strong> Message Authentication Code. Der Client<br />

offeriert dabei die von ihm unterstützten Cipher Suiten <strong>und</strong> der Server wählt

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!