Transport Layer Security (TLS/SSL)

Zur sicheren Kommunikation zwischen unseren Servern einerseits und den Browsern der Anwender andererseits setzen wir HTTPS ein, die TLS-Variante von HTTP. Diese Seite

Für einen groben Überblick siehe die beiden Artikel Transport_Layer_Security und Cipher_Suite in der deutschsprachigen Wikipedia.1

1. Cipher Suites

1.1. Allgemeines

Zu Beginn einer mit TLS abgesicherten Kommunikation zwischen Server und Client (Browser) müssen sich beide Parteien auf eine sog. Cipher Suite, einen Satz von Verfahren, einigen:

Die Server können verschiedene Cipher Suites anbieten und die Clients können verschiedene (evtl. davon abweichende) Cipher Suites unterstützen. Aus der Sicht des Servers sind deswegen für die folgenden Abschnitte zwei Fragen ganz zentral:

  1. Welche Cipher Suites bietet man dem Client an (Auswahl)?

  2. Wie sind die Cipher Suites angeordnet (Reihenfolge)?

Unglücklicherweise existieren für Cipher Suites mindestens drei unterschiedliche Notationen:

Bei aller Verwirrung, die dadurch entsteht (und auch durch die obendrein inkonsistente Verwendung innerhalb von OpenSSL selbst, siehe unten), hält man sich am besten an die von der IANA normierten und eindeutigen Hex-Codes. Es gibt auch eine vergleichende Übersicht.

1.1.1. IANA TLS Parameter

Siehe die TLS Cipher Suite Registry, die man auch herunterladen kann.

1.1.2. GnuTLS Priority Strings

In GnuTLS werden die Cipher Suite-Zeichenketten priority strings genannt. Um sie zu interpretieren, d. h. um zu sehen, welche Verfahren in welcher Reihenfolge verwendet werden, kann man das folgende Kommando verwenden:

$ gnutls-cli -l --priority 'ZEICHENKETTE'

Abhängig von der installierten GnuTLS-Version kann sich die Ausgabe des obigen Kommandos ändern.

Weitere Details zu den priority strings findet man in der GnuTLS-Dokumentation.

1.1.3. OpenSSL Cipher Suite-Zeichenketten

Welche Verfahren und welche Reihenfolge konkret hinter der jeweiligen Cipher Suite-Zeichenkette stecken, erfährt man bei OpenSSL mit dem folgenden Kommando:

$ openssl ciphers -V 'ZEICHENKETTE'

Abhängig von der installierten OpenSSL-Version kann sich auch die Ausgabe des obigen Befehls ändern.

Weitere Details zu den Cipher Suite-Zeichenketten hält die "Dokumentation" bereit. Bei der Evaluation der Fähigkeiten der installierten OpenSSL-Version können auch die folgenden Kommandos hilfreich sein:

$ openssl version -a
$ openssl list-public-key-algorithms
$ openssl list-cipher-algorithms
$ openssl list-message-digest-algorithms

Die Zeichenketten der folgenden Abschnitte werden mit OpenSSL 1.0.1e interpretiert. Mit einem Skript lassen sich automatisch besser lesbare Darstellungen in Tabellenform erzeugen.

1.2. Anleitung "Applied Crypto Hardening"

Die Anleitung Applied Crypto Hardening (siehe bettercrypto.org, Stand 2016-11-16) enthält im Abschnitt 3.2.3, Cipher Suite-Zeichenketten für zwei Konfigurationen A und B, die in den beiden folgenden Abschnitten - ohne Bewertung! - aufgelistet werden.

1.2.1. Konfiguration A

Cipher Suite (OpenSSL):

EDH+aRSA+AES256:EECDH+aRSA+AES256:!SSLv3

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0x009F

DHE-RSA-AES256-GCM-SHA384

TLSv1.2

DH

RSA

AESGCM(256)

AEAD

0x006B

DHE-RSA-AES256-SHA256

TLSv1.2

DH

RSA

AES(256)

SHA256

0xC030

ECDHE-RSA-AES256-GCM-SHA384

TLSv1.2

ECDH

RSA

AESGCM(256)

AEAD

0xC028

ECDHE-RSA-AES256-SHA384

TLSv1.2

ECDH

RSA

AES(256)

SHA384

Das Wichtigste in Kürze:

1.2.2. Konfiguration B

Cipher Suite (OpenSSL):

EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0x009F

DHE-RSA-AES256-GCM-SHA384

TLSv1.2

DH

RSA

AESGCM(256)

AEAD

0x006B

DHE-RSA-AES256-SHA256

TLSv1.2

DH

RSA

AES(256)

SHA256

0xC030

ECDHE-RSA-AES256-GCM-SHA384

TLSv1.2

ECDH

RSA

AESGCM(256)

AEAD

0xC028

ECDHE-RSA-AES256-SHA384

TLSv1.2

ECDH

RSA

AES(256)

SHA384

0x009E

DHE-RSA-AES128-GCM-SHA256

TLSv1.2

DH

RSA

AESGCM(128)

AEAD

0x0067

DHE-RSA-AES128-SHA256

TLSv1.2

DH

RSA

AES(128)

SHA256

0xC02F

ECDHE-RSA-AES128-GCM-SHA256

TLSv1.2

ECDH

RSA

AESGCM(128)

AEAD

0xC027

ECDHE-RSA-AES128-SHA256

TLSv1.2

ECDH

RSA

AES(128)

SHA256

0x0088

DHE-RSA-CAMELLIA256-SHA

SSLv3

DH

RSA

Camellia(256)

SHA1

0x0039

DHE-RSA-AES256-SHA

SSLv3

DH

RSA

AES(256)

SHA1

0xC014

ECDHE-RSA-AES256-SHA

SSLv3

ECDH

RSA

AES(256)

SHA1

0x0045

DHE-RSA-CAMELLIA128-SHA

SSLv3

DH

RSA

Camellia(128)

SHA1

0x0033

DHE-RSA-AES128-SHA

SSLv3

DH

RSA

AES(128)

SHA1

0xC013

ECDHE-RSA-AES128-SHA

SSLv3

ECDH

RSA

AES(128)

SHA1

0x0041

CAMELLIA128-SHA

SSLv3

RSA

RSA

Camellia(128)

SHA1

0x002F

AES128-SHA

SSLv3

RSA

RSA

AES(128)

SHA1

Das Wichtigste in Kürze:

1.3. Konstruktion der Cipher Suites für die LUG-IN-Server

Dieser Abschnitt beschreibt in aller Kürze, wie die Cipher Suites der LUG-IN-Server konstruiert werden. Zur Erläuterung und Begründung einzelner Entscheidungen bitte bei einem Stammtisch-Treffen nachfragen.

1.3.1. Bestandsaufnahme

Installierte OpenSSL-Version:

$ openssl version -a
OpenSSL 1.0.1t
[...]

Welche Verfahren stehen jeweils zur Verfügung?

Und welche Cipher Suites werden können überhaupt angeboten werden?

$ openssl ciphers -V ALL | wc -l
103
$ openssl ciphers -V DEFAULT | wc -l
85

... also zuviele :-(

1.3.2. Reduktion

Im ersten Schritt reduzieren wir die Zahl der Cipher Suites, indem wir Verfahren ausschließen, die wir nicht verwenden können bzw. werden bzw. wollen:

Für reguläre Cipher Suites, d. h. Verfahren ohne elliptische Kurven (Non-ECC), erhalten wir daher (unsortiert):

ALL:!ECDH:!aNULL:!aDSS:!eNULL:!3DES:!DES:!MD5:!PSK:!RC4:!SEED:!SRP

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0x009C

AES128-GCM-SHA256

TLSv1.2

RSA

RSA

AESGCM(128)

AEAD

0x003C

AES128-SHA256

TLSv1.2

RSA

RSA

AES(128)

SHA256

0x002F

AES128-SHA

SSLv3

RSA

RSA

AES(128)

SHA1

0x009D

AES256-GCM-SHA384

TLSv1.2

RSA

RSA

AESGCM(256)

AEAD

0x003D

AES256-SHA256

TLSv1.2

RSA

RSA

AES(256)

SHA256

0x0035

AES256-SHA

SSLv3

RSA

RSA

AES(256)

SHA1

0x0041

CAMELLIA128-SHA

SSLv3

RSA

RSA

Camellia(128)

SHA1

0x0084

CAMELLIA256-SHA

SSLv3

RSA

RSA

Camellia(256)

SHA1

0x009E

DHE-RSA-AES128-GCM-SHA256

TLSv1.2

DH

RSA

AESGCM(128)

AEAD

0x0067

DHE-RSA-AES128-SHA256

TLSv1.2

DH

RSA

AES(128)

SHA256

0x0033

DHE-RSA-AES128-SHA

SSLv3

DH

RSA

AES(128)

SHA1

0x009F

DHE-RSA-AES256-GCM-SHA384

TLSv1.2

DH

RSA

AESGCM(256)

AEAD

0x006B

DHE-RSA-AES256-SHA256

TLSv1.2

DH

RSA

AES(256)

SHA256

0x0039

DHE-RSA-AES256-SHA

SSLv3

DH

RSA

AES(256)

SHA1

0x0045

DHE-RSA-CAMELLIA128-SHA

SSLv3

DH

RSA

Camellia(128)

SHA1

0x0088

DHE-RSA-CAMELLIA256-SHA

SSLv3

DH

RSA

Camellia(256)

SHA1

Und für Cipher Suites mit elliptischen Kurven (ECC) erhalten wir (unsortiert):

EECDH:!ECDSA:!aNULL:!eNULL:!aDSS:!3DES:!DES:!MD5:!PSK:!RC4:!SEED:!SRP

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0xC030

ECDHE-RSA-AES256-GCM-SHA384

TLSv1.2

ECDH

RSA

AESGCM(256)

AEAD

0xC028

ECDHE-RSA-AES256-SHA384

TLSv1.2

ECDH

RSA

AES(256)

SHA384

0xC014

ECDHE-RSA-AES256-SHA

SSLv3

ECDH

RSA

AES(256)

SHA1

0xC02F

ECDHE-RSA-AES128-GCM-SHA256

TLSv1.2

ECDH

RSA

AESGCM(128)

AEAD

0xC027

ECDHE-RSA-AES128-SHA256

TLSv1.2

ECDH

RSA

AES(128)

SHA256

0xC013

ECDHE-RSA-AES128-SHA

SSLv3

ECDH

RSA

AES(128)

SHA1

1.3.3. Reihenfolge

Folgende zusätzliche Kriterien werden bei der Auswahl und Reihenfolge der regulären Cipher Suites berücksichtigt:

Für reguläre Cipher Suites (Non-ECC) erhalten wir daher:

EDH+AESGCM:EDH+AES256+SHA256:EDH+AES128+SHA256:EDH+AES256:EDH+AES128:EDH+CAMELLIA256:EDH+CAMELLIA:!ECDH:!aNULL:!aDSS:!eNULL:!3DES:!DES:!MD5:!PSK:!RC4:!SEED:!SRP

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0x009F

DHE-RSA-AES256-GCM-SHA384

TLSv1.2

DH

RSA

AESGCM(256)

AEAD

0x009E

DHE-RSA-AES128-GCM-SHA256

TLSv1.2

DH

RSA

AESGCM(128)

AEAD

0x006B

DHE-RSA-AES256-SHA256

TLSv1.2

DH

RSA

AES(256)

SHA256

0x0067

DHE-RSA-AES128-SHA256

TLSv1.2

DH

RSA

AES(128)

SHA256

0x0039

DHE-RSA-AES256-SHA

SSLv3

DH

RSA

AES(256)

SHA1

0x0033

DHE-RSA-AES128-SHA

SSLv3

DH

RSA

AES(128)

SHA1

0x0088

DHE-RSA-CAMELLIA256-SHA

SSLv3

DH

RSA

Camellia(256)

SHA1

0x0045

DHE-RSA-CAMELLIA128-SHA

SSLv3

DH

RSA

Camellia(128)

SHA1

Und für Cipher Suites mit elliptischen Kurven (ECC) erhalten wir:

EECDH+AESGCM:EECDH+AES256+SHA384:EECDH+AES128+SHA256:EECDH+AES256+SHA:EECDH+AES128+SHA:!ECDSA:!aNULL:!eNULL:!aDSS:!3DES:!DES:!MD5:!PSK:!RC4:!SEED:!SRP

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0xC030

ECDHE-RSA-AES256-GCM-SHA384

TLSv1.2

ECDH

RSA

AESGCM(256)

AEAD

0xC02F

ECDHE-RSA-AES128-GCM-SHA256

TLSv1.2

ECDH

RSA

AESGCM(128)

AEAD

0xC028

ECDHE-RSA-AES256-SHA384

TLSv1.2

ECDH

RSA

AES(256)

SHA384

0xC027

ECDHE-RSA-AES128-SHA256

TLSv1.2

ECDH

RSA

AES(128)

SHA256

0xC014

ECDHE-RSA-AES256-SHA

SSLv3

ECDH

RSA

AES(256)

SHA1

0xC013

ECDHE-RSA-AES128-SHA

SSLv3

ECDH

RSA

AES(128)

SHA1

1.3.4. Konstruktion

Weitere Kriterien, die bei der Auswahl und Reihenfolge aller Cipher Suites berücksichtigt werden:

  1. ECC-Cipher Suites werden nach den entsprechenden regulären Cipher Suites (Non-ECC) einsortiert. Der Performancegewinn gleicht die bestehenden Vorbehalte gegenüber den aktuell in OpenSSL implementierten ECC-Verfahren nicht aus (Stichworte "NIST-Kurven", Parameterauswahl, etc.).
  2. Cipher Suites mit authentifizierter Verschlüsselung (AEAD, AES-GCM-Verfahren) sollten Vorrang vor jenen Cipher Suites haben, die Hash-Algorithmen der SHA-2-Familie einsetzen. Die geringste Priorität genießen Cipher Suites, die noch SHA-1 verwenden.
  3. Auf AES-basierende Cipher Suites werden aus Performance-Gründen (AES-Hardware-Support) vor der entsprechend auf CAMELLIA basierenden Cipher Suite einsortiert. Des Weiteren wird nach der Schlüssellänge sortiert.

  4. Das Kriterium "Hash-Algorithmus" wird insgesamt aktuell höher bewertet als das Kriterium "Schlüssellänge".

Damit ergibt sich die folgende Cipher Suite-Zeichenkette:

EDH+AESGCM:EDH+AES256+SHA256:EDH+AES128+SHA256:EDH+AES256:EDH+AES128:EDH+CAMELLIA256:EDH+CAMELLIA:EECDH+AESGCM:EECDH+AES256+SHA384:EECDH+AES128+SHA256:EECDH+AES256+SHA:EECDH+AES128+SHA:!ECDSA:!aNULL:!aDSS:!eNULL:!3DES:!DES:!MD5:!PSK:!RC4:!SEED:!SRP

Hex
code

Cipher suite name
(OpenSSL notation)

Protocol
version

Key
exchange

Auth.
alg.

Encryption
algorithm

MAC
alg.

0x009F

DHE-RSA-AES256-GCM-SHA384

TLSv1.2

DH

RSA

AESGCM(256)

AEAD

0x009E

DHE-RSA-AES128-GCM-SHA256

TLSv1.2

DH

RSA

AESGCM(128)

AEAD

0x006B

DHE-RSA-AES256-SHA256

TLSv1.2

DH

RSA

AES(256)

SHA256

0x0067

DHE-RSA-AES128-SHA256

TLSv1.2

DH

RSA

AES(128)

SHA256

0x0039

DHE-RSA-AES256-SHA

SSLv3

DH

RSA

AES(256)

SHA1

0x0033

DHE-RSA-AES128-SHA

SSLv3

DH

RSA

AES(128)

SHA1

0x0088

DHE-RSA-CAMELLIA256-SHA

SSLv3

DH

RSA

Camellia(256)

SHA1

0x0045

DHE-RSA-CAMELLIA128-SHA

SSLv3

DH

RSA

Camellia(128)

SHA1

0xC030

ECDHE-RSA-AES256-GCM-SHA384

TLSv1.2

ECDH

RSA

AESGCM(256)

AEAD

0xC02F

ECDHE-RSA-AES128-GCM-SHA256

TLSv1.2

ECDH

RSA

AESGCM(128)

AEAD

0xC028

ECDHE-RSA-AES256-SHA384

TLSv1.2

ECDH

RSA

AES(256)

SHA384

0xC027

ECDHE-RSA-AES128-SHA256

TLSv1.2

ECDH

RSA

AES(128)

SHA256

0xC014

ECDHE-RSA-AES256-SHA

SSLv3

ECDH

RSA

AES(256)

SHA1

0xC013

ECDHE-RSA-AES128-SHA

SSLv3

ECDH

RSA

AES(128)

SHA1

2. Server untersuchen

Es gibt verschiedene Möglichkeiten, die TLS-Fähigkeiten eines (Web-)Servers zu testen. Im Folgenden werden nur die Kommandos bereit gestellt. Die Details und Erweiterungen (z. B. mittels STARTTLS) werden hier nicht erklärt. Bei Fragen oder Unklarheiten bitte bei einem Stammtisch-Treffen oder auf der Mailingliste nachfragen.

2.1. GnuTLS

Mit dem Paket gnutls-bin:

$ gnutls-cli --insecure --port 443 --print-cert --verbose SERVER
$ gnutls-cli-debug --port 443 --verbose SERVER

2.2. Nmap

Mit dem Paket nmap:

$ nmap --script ssl-enum-ciphers.nse -p 443 SERVER

Weitere Details finden sich im Skript /usr/share/nmap/scripts/ssl-enum-ciphers.nse.

Bitte beachten:

Dieser Scan fällt unter die Kategorie Unfreundliches Verhalten und dauert mehrere Minuten!

2.3. OpenSSL

Mit dem Paket openssl:

$ openssl s_client -connect SERVER:443 -debug -msg -prexit -showcerts  -state -status -tlsextdebug -verify 10

2.4. Qualys SSL Labs

Die Qualys SSL Labs stellen einen sehr detaillierten SSL/TLS Server Test zur Verfügung. Bitte beachten, dass dieser Test die CA-Zertifikate von Mozilla verwendet.

2.5. sslscan

Ein weiterer Wrapper um OpenSSL, den es auch als Paket sslscan gibt. Allerdings scheint das Original-Projekt http://sourceforge.net/projects/sslscan aufgegeben worden zu sein. Ein Fork, der mehr Aufmerksamkeit erhält, befindet sich auf https://github.com/DinoTools/sslscan.

2.6. STARTTLS.info

Unterstützt Dein Mailserver STARTTLS? Dieser Test wurde von Einar Otto Stangvik entwickelt.

2.7. Wireshark

Es gibt die Möglichkeit den Aufbau einer TLS-/SSL-Verbindung und die Kommunikation der aufgebauten Verbindung zwischen Browser und Webserver mit Wireshark zu analysieren. Um den verschlüsselten Datenstrom einsehen zu können, muss man in die Trickkiste greifen und ein Feature des NSS-Systems zusammen mit dem dazugehörigen Wireshark-Feature verwenden.

Konkrete Schritte:

root@bar # dumpcap -b filesize:10000 -B 8 -i eth0 -q -w traffic-dump >/dev/null 2>&1 &
root@bar # chown your_username: traffic-dump*
root@bar # chmod go=r traffic-dump*
foo@bar $ export SSLKEYLOGFILE=$PWD/keys
foo@bar $ iceweasel --no-remote -P someprofile >/dev/null 2>&1 &
foo@bar $ wireshark traffic-dump* >/dev/null 2>&1 &

Allerdings funktioniert dieses Vorgehen bei Verfahren mit der Forward Secrecy-Eigenschaft so nicht...

3. Clients untersuchen

Natürlich kann man auch Clients und ihre TLS-Fähigkeiten untersuchen. Für die folgenden Abschnitte gilt das Gleiche wie für die Server. Bei Fragen oder Unklarheiten bitte bei einem Stammtisch-Treffen oder auf der Mailingliste nachfragen.

3.1. DCSec

Die Forschungsgruppe DCSEC an der Universität Hannover stellt einen Service zur Verfügung, der

Surft man mit einem Browser auf https://cc.dcsec.uni-hannover.de wird dieser untersucht.

3.2. Qualys SSL Labs

Die Qualys SSL Labs bieten auch einen Test an mit dem die SSL/TLS Fähigkeiten von Browsern untersucht werden können.

3.3. tlsfun

Auf der Seite tlsfun.de stellt Hanno Böck einige Tests zur Verfügung.

3.4. ZMap

Forscher der Universität Michigan haben mit ZMap einen Netzwerk-Scanner entwickelt, der Internet-weite Untersuchungen ermöglicht.

4. Brainstorming, Vermischtes und Kommentare

Ein Kommentar. Klicke auf "Kommentare" in der Menüleiste oben, um sie ein- oder auszublenden.

  1. foo
  2. bar

@SIG@


CategoryDocumentation

  1. Im Allgemeinen sind die Artikel der englischsprachigen Wikipedia weniger fehlerhaft und besser gepflegt: Transport_Layer_Security. Exakte Informationen gibt es in den offiziellen Referenzdokumenten... (1)

Dokumentation/TransportLayerSecurity (last edited 2018-12-09 08:23:25 by Mathias)