Oft liest man in diversen „Sicherheitsforen“, dass sich sichere, schnelle und browserkompatible Verschlüsselung ausschließen. Ich habe mich dem Thema nun gewidmet und einen gangbaren Mittelweg gefunden, der im SSLLabs.com-Sicherheitscheck eine A+ Benotung erzieht, keine heute gebräuchlichen Browser aussperrt und die zwei Cores meines kleinen ARM-Boards nicht übermäßig belastet. Die Anleitung bezieht sich auf Gentoo-Linux für meinen Cubietruck und Nginx als Webserver, lässt sich aber auch leicht auf andere Systeme übertragen.
Schritt 1
Eine hinreichend moderne OpenSSL-Version kompilieren und – wichtig – das bindist-Useflag ausschalten (es würden ansonsten wichtige Chiffren fehlen).
USE="-bindist"emerge -av openssl
Schritt 2
Die Nginx-Konfiguration anpassen und im server-Abschnitt folgende Chiffren eintragen:
server { listen 443 ssl spdy; server_name ***********.de; # re-use session as often as possible keepalive_timeout 70; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-RSA-AES128-SHA DHE-RSA-AES128-SHA ECDHE-RSA-AES128-SHA256 !ADH !EXP !LOW !RC2 !3DES !SEED !RC4 +HIGH +MEDIUM"; ... }
Dabei ist unbedingt zu beachten, dass ECDHE-RSA-AES128-SHA256 vor den anderen Chiffren stehen muss, um dieser den Vorrang zu geben. Sie hat nur einen Overhead beim Handshake von ca. 30%, DHE-RSA-AES128-SHA dagegen ist die „teuerste“ Variante und verringert die Performance um ca. Faktor 3-4.
Die drei Chiffren ECDHE-RSA-AES128-SHA, DHE-RSA-AES128-SHA und ECDHE-RSA-AES128-SHA256 bieten jeweils Perfect Forward Security und werden von 90% aller heute relevanten Browser verstanden. Außen vor bleiben lediglich die Windows XP-Varianten vom Internet Explorer 6 und 8, die jedoch keine aus heutiger Sicht starke Verschlüsselung mit PFS bieten und somit sowieso nicht unterstützt werden sollten.
Auf der Haben-Seite stehen dabei alle Android-Browser ab 2.3.7, Chrome, Firefox, Internet Explorer (ab Windows Vista) ab Version 7 und Safari (OS X sowie iOS).