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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

402 7 Client-/Server-Programmierung <strong>mit</strong> Open<strong>SSL</strong><br />

147 }<br />

148 else<br />

149 send_smtp_response( bio, "500 unknown command\n" );<br />

150 }<br />

151 }<br />

105–109<br />

111–122<br />

121–142<br />

In einer Schleife liest der Dæmon zeilenweise die Anfragen des verb<strong>und</strong>enen<br />

Client in den 256 Zeichen langen Zwischenpuffer buf ein. Jede Eingabezeile<br />

wird danach <strong>mit</strong> der strtok_r()-Funktion in das SMTP-Kommando <strong>und</strong><br />

seine optionalen Argumente zerlegt. Das isolierte SMTP-Kommando entscheidet<br />

nun über den weiteren Verlauf der handle_client()-Funktion. Sollte die<br />

strtok_r()-Funktion kein SMTP-Kommando ausfindig machen können, etwa<br />

bei der clientseitigen Eingabe einer Leerzeile, wird sofort <strong>mit</strong> dem nächsten<br />

Schleifendurchlauf begonnen.<br />

Auf ein EHLO des Clients reagiert der SMTP-Server seinerseits <strong>mit</strong> einer Begrüßung<br />

<strong>und</strong> liefert dem Client im gleichen Atemzug eine Liste der von ihm unterstützten<br />

SMTP-Erweiterungen. Im vorliegenden Fall beschränken wir uns<br />

auf die beiden Erweiterungen STARTTLS <strong>und</strong> AUTH. DieSTARTTLS-Erweiterung<br />

soll dabei nur angeboten werden, sofern noch keine <strong>SSL</strong>-gesicherte Verbindung<br />

etabliert wurde <strong>und</strong> <strong>mit</strong> der AUTH-Erweiterung soll es sich, da hier Authentifizierungsinformationen<br />

wie Benutzernamen <strong>und</strong> Paßwörter übertragen werden,<br />

genau umgekehrt verhalten. Die sprintf()-Funktion konstruiert deshalb anhand<br />

der Fallunterscheidung tls?"AUTH PLAIN LOGIN":"STARTTLS" die passende<br />

Antwort an den Client.<br />

Auf das STARTTLS-Kommando des Clients antwortet der Server zunächst <strong>mit</strong><br />

einer Aufmunterung an den Client, sofort <strong>mit</strong> dem <strong>SSL</strong>-Handshake zu beginnen:<br />

220 TLS go ahead. Danach wandelt der Dæmon zunächst das <strong>mit</strong><br />

dem Client verb<strong>und</strong>ene, gepufferte Socket-BIO in ein gepuffertes <strong>SSL</strong>-BIO um.<br />

Sofern die Operation erfolgreich war, setzt der Dæmon das tls-Flag der<br />

handle_client()-Funktion auf den Wert 1 um festzuhalten, daß das vorausgehende<br />

<strong>SSL</strong>-Upgrade erfolgreich abgeschlossen wurde. Zum einen kann<br />

der Server nun bei einem erneuten EHLO anstatt der STARTTLS-Erweiterung<br />

die AUTH-Erweiterung anbieten. Zum anderen akzeptiert der Server, falls bereits<br />

ein <strong>SSL</strong>-Upgrade stattgef<strong>und</strong>en hat, aus verständlichen Gründen keine<br />

weiteren STARTTLS-Kommandos mehr.<br />

Bemerkenswert ist im Zusammenhang <strong>mit</strong> dem STARTTLS-Kommando erneut,<br />

daß sich die gesamte Zauberei“ beim <strong>SSL</strong>-Upgrade auf eine einfache Erweiterung<br />

der zur Kommunikation <strong>mit</strong> dem Client verwendeten BIO-Kette um<br />

”<br />

ein zusätzliches <strong>SSL</strong>-BIO beschränkt. So kann die Verarbeitungsschleife der<br />

handle_client()-Funktion vor <strong>und</strong> nach einem <strong>SSL</strong>-Upgrade auf die gleichen<br />

Ein-/Ausgabefunktionen zurückgreifen, ein Wechsel der API ist, dank<br />

der Flexibilität der BIO-Schnittstelle, nicht erforderlich.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!