Klartext-Protokolle über SSL-Verbindungen testen

Hat man regelmäßig mit Servern zu tun, kommt man nicht umhin, ab und zu via Telnet auf Protokollebene mit dem Server zu sprechen. Solange das über eine unverschlüsselte Verbindung läuft, funktioniert das auch prima, z.B. bei SMTP, POP3 oder HTTP.

Schwieriger wird es, wenn man eine verschlüsselte Verbindung nutzen möchte oder muss. SSL via Telnet macht man nicht so nebenbei 😉 Muss man erfreulicherweise auch nicht, denn es gibt ja OpenSSL. Dieses kann nicht nur Zertifikate erstellen und signieren, sondern auch als Client für SSL-verschlüsselte Verbindungen dienen. Und da es de-facto überall verfügbar ist, sollte man wissen, wie das funktioniert.

Generell muss bei verschlüsselten Verbindungen unterschieden werden zwischen einer obligatorisch verschlüsselten Verbindung, wie sie z.B. bei HTTPS zum Einsatz kommt, und einer optional verschlüsselten Verbindung, wie sie bei der Kombination von SMTP und STARTTLS möglich ist.

Im Fall einer obligatorisch verschlüsselten Verbindung wie bei HTTPS sieht der Aufruf von OpenSSL wie folgt aus:

mbpgb:~ gbeine$ openssl s_client -crlf -connect www.example.org:443
CONNECTED(00000003)
depth=1 /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
...
issuer=/C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 2 Primary Intermediate Server CA
---
No client certificate CA names sent
---
SSL handshake has read 4526 bytes and written 328 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: EAAF4A04C62CDB6F8F00CB08B1B1D3DFA26676A60B1C4F746D6581E47E7729B6
    Session-ID-ctx: 
    Master-Key: 7595A6E6BA5D0099F2CC8E75BE43574F68025B36BAC578B5456B50321EF397D58F5D3FE347AE8F8E07B4DF346DE2B46C
    Key-Arg   : None
    Start Time: 1388319414
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

Auf Meldung CONNECTED folgen jede Menge Daten über das vom Server verwendete SSL-Zertifikat. Einen Teil davon habe ich ausgelassen und durch ‚…‘ ersetzt. Die Ausgabe füllt normalerweise mehrere Bildschirmseiten und endet mit ‚—‚. Nach den ‚—‚ wartet der Server nun auf eine Eingabe, die im Klartext erfolgt, wie bei einer Telnet Session.

Hier kann man nun eine Seite vom Server anfordern. Das erfolgt über das HTTP-Kommando GET, gefolgt von der Angabe der Protokollversion und des Hostnamen der Seite. Nach der Angabe des Hosts muss man zweimal mit Enter bestätigen und erhält einen Response vom Server. Die Verbindung wird danach automatisch geschlossen.

...
    Verify return code: 0 (ok)
---
GET / HTTP/1.1
HOST: www.example.org

HTTP/1.1 302 Found
Date: Sun, 29 Dec 2013 12:26:57 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u7
Location: index.php
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/html

closed
mbpgb:~ gbeine$

Während für HTTPS eine Verschlüsselung mit SSL verbindlich ist, gibt es bei SMTP, POP3 und IMAP zwei Möglichkeiten: Einmal kann wie bei HTTPS eine Verschlüsselung obligatorisch sein. Das erfolgt in der Regel über die Ports 465 für SMTP, 993 für IMAP und 995 für POP3. Soll die Verschlüsselung aber mit STARTSSL zugeschalten werden, dann funktioniert die Verbindung über die Ports 25 für SMTP, 110 für POP3 und 143 für IMAP.

Unterstützt der Mailserver eine verschlüsselte Verbindung über Port 465, kann diese mit OpenSSL wie folgt aufgebaut werden.

mbpgb:~ gbeine$ openssl s_client -crlf -connect mail.example.org:465
CONNECTED(00000003)
depth=0 /description=zoozailei7ooPh8g/C=DE/ST=Example/L=Example/O=Example.org/CN=mail.example.org/emailAddress=postmaster@example.org
...
---
220 mail.example.org ESMT
helo dude
250 mail.example.org
quit
221 2.0.0 Bye
closed
mbpgb:~ gbeine$

Wie auch bei HTTPS meldet sich der Server nach dem CONNECT wieder mit einer gewaltigen Menge an Zertifikatdetails. Im Beispiel wurde nur eine Sitzung mit helo geöffnet und die Verbindung danach beendet.

Beim Einsatz von StartTLS sieht der Aufruf von OpenSSL etwas anders aus. Zusätzlich wird beim Aufruf die Option -starttls mit dem Zielprotokoll (smtp, pop3, imap, ftp oder xmpp) angegeben. Als Port wird der Standard für das jeweilige Protokoll verwendet.

mbpgb:~ gbeine$ openssl s_client -starttls smtp -crlf -connect mail.example.org:25
CONNECTED(00000003)
depth=0 /description=zoozailei7ooPh8g/C=DE/ST=Example/L=Example/O=Example.org/CN=mail.example.org/emailAddress=postmaster@example.org
...
---
250 DSN
quit
221 2.0.0 Bye
closed
mbpgb:~ gbeine$

Der Server meldet sich im Fall von SMTP nicht mit 220, weil die „Begrüßung“ bereits vor dem Umschalten auf TLS erfolgt ist. Der weitere Verlauf der SMTP Session ist aber analog zu einer Session, die via Telnet im Klartext durchgeführt wird.

Auf die gleiche Weise wie bei SMTP lassen sich auch POP3 und IMAP mit OpenSSL als Client benutzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.