E-Mail-Verschlüsselung austesten

Seite 2: StartTLS

Inhaltsverzeichnis

Vor allem Internet-Providern setzen bevorzugt den SSL-Nachfolger Transport Layer Security via StartTLS ein. Es hat den Vorteil, dass man es als zusätzliche Option anbieten kann, aber ein Client, der es nicht unterstützt, weiterhin mit dem Server unverschlüsselt kommunizieren kann. Anders herum muss auch ein Mail-Programm damit umgehen können, dass ein Server TLS verweigert.

Die bei vielen Clients zur Verschlüsselung voreingestellte Option "TLS nur, wenn möglich" birgt allerdings eine große Gefahr. Ein Angreifer in einer Man-In-The-Middle-Position könnte etwa aus dem Befehl StartTLS, der die Verschlüsselung aktivieren soll, unbemerkt ein XtartTLS machen. Das führt dann dazu, dass der Server sagt: "XtartTLS kann ich nicht" und manche Mail-Programme die Daten dann eben unverschlüsselt über die Leitung schicken, ohne dass der Anwender das bemerkt. Deshalb sollte man besser einmal testen, ob der Server StartTLS beherrscht und es dann zur Pflicht machen. Wenn dann eine Fehlermeldung erscheint, weiß man, dass etwas schief läuft.

Auf welchem Port ein TLS-fähiger Dienst läuft, hängt vom Anbieter ab. Prinzipiell kann man diese Form der Verschlüsselung transparent in den normalen Betrieb einbetten. Ob ein Mail-Server das unterstützt, verrät

$ nc smtp.irgend.wo smtp
220 Mailserver ESMTP Exim 4.69 Wed, 16 Sep 2009 13:05:15 +0200
ehlo test
250-Mailserver Hello loki [10.1.2.73]
250-SIZE 78643200
250-PIPELINING
250-STARTTLS
250 HELP
quit
221 Mailserver closing connection

In dieser Liste sollte der Befehl STARTTLS auftauchen, der die Verschlüsselung via Transport Layer Security aktiviert:

STARTTLS
220 TLS go ahead

Ab hier wird's mit netcat wieder schwierig, aber openssl springt erneut in die Bresche. Die Entwickler haben nämlich dem SSL-Client die notwendige Intelligenz spendiert, um in SMTP, POP3, IMAP und FTP nach TLS-Verschlüsselung zu fragen, was aber leider nicht mit allen Servern funktioniert.

$ openssl s_client -host mail.irgend.wo -port 25 -starttls smtp
CONNECTED(00000003)
[...]
250 HELP
ehlo test
250-Mailserver Hello loki [10.1.2.73]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250 HELP

Allerdings ist die Authentifizierung bei SMTP etwas komplizierter. Die meisten Server unterstützen wie der in diesem Beispiel das Verfahren AUTH PLAIN, beim dem die Zugangsdaten Base64-kodiert werden müssen. Das erledigt der Perl-Befehl

$ perl -MMIME::Base64 -e 'print encode_base64("\000user-ju\000secret")'
AHVzZXItanUAc2VjcmV0

dessen Ausgabe man an den SMTP-Server verfüttert:

AUTH PLAIN AHVzZXItanUAc2VjcmV0
235 Authentication succeeded

womit die Bahn frei ist, für weitere Mail-Kommandos. Bei Protokollen oder Servern, die der openssl-Client nicht unterstützt, hilft das Tool gnutls-cli aus dem Paket gnutls-bin weiter. Es baut zunächst eine Klartext-Verbindung zu einem Service auf:

$ gnutls-cli -s -p submission smtp.heise.de
Resolving ...
Connecting to '10.1.2.41:587'...
 
- Simple Client Mode:
 
220 Mailserver ESMTP Exim 4.69 Wed, 16 Sep 2009 18:03:01 +0200
ehlo test
250-Mailserver Hello loki.ct.heise.de [10.10.22.75]
250-SIZE 78643200
250-PIPELINING
250-STARTTLS
250 HELP
starttls
220 TLS go ahead

Dann sucht man in einer zweiten Shell nach der Prozess-ID und schickt dem Tool ein SIGALARM:

$ ps aux | grep gnutls
ju 6103 pts/3 S+ 18:03 0:00 gnutls-cli [...]
$ kill -s SIGALRM 6103

Das veranlasst gnutls-cli dazu, die TLS-Verbindung auszuhandeln und dann Standard-in und Standard-Out durch den damit aufgebauten Tunnel umzuleiten. [Update: Torsten Krah wies uns darauf hin, dass die Eingabe von CTRL-D im Terminalfenster von gnutls-cli schneller geht und den gleichen Effekt hat /].

Umsonst dazu geliefert bekommt man ein paar nützliche Informationen über die soeben ausgehandelte TLS-Verbindung:

*** Starting TLS handshake
- Certificate type: X.509
- Got a certificate list of 1 certificates.
 
- Certificate[0] info:
# The hostname in the certificate matches 'smtp.heise.de'.
# valid since: Thu Dec 14 14:08:41 CET 2006
# expires at: Sun Dec 11 14:08:41 CET 2016
# fingerprint: 28:8C:E0:29:B9:31:9B:96:F6:3D:B4:49:10:CD:06:80
# Subject's DN: C=DE,ST=Niedersachsen,L=Hannover,O=Heise Zeitschriften Verlag GmbH Co KG,OU=Netzwerkadministration,CN=smtp.heise.de,EMAIL=admin@heise.de
# Issuer's DN: C=DE,ST=Niedersachsen,L=Hannover,O=Verlag Heinz Heise GmbH & Co KG,OU=Netzwerkadministration,CN=admin@heise.de,EMAIL=admin@heise.de
 
- Peer's certificate issuer is unknown
- Peer's certificate is NOT trusted
- Version: TLS 1.0
- Key Exchange: DHE RSA
- Cipher: AES 256 CBC
- MAC: SHA
- Compression: NULL
quit
221 Mailserver closing connection
- Peer has closed the GNUTLS connection

Damit kann man quasi beliebige, interaktive TLS-Verbindungen herstellen. Wer weiter mit SSL herumexperimentieren will, den interessiert vielleicht noch, dass openssl mit s_server und das gnutls-Paket mit gnutls-serv auch einfache Server anbieten, die auf Wunsch sogar einen sehr simplen WWW-Server emulieren. (ju)