Was ist PFS
Durch den Einsatz von PFS lässt sich eine höhere Sicherheit bei HTTPS-Übertragungengewährleisten, als ohne. Da stellt sich natürlich die Frage, warum HTTPS vorher unsicher war. Dies versteht man am besten an einem Beispiel, wie ein HTTPS-Verbindungsaufbau statt findet.
- Client: Ruft https://blog.cscholz.io auf.
- Server: Übermittelt dem Client einen öffentlichen Schlüssel, der von einer Zertifikatsstelle bestätigt wurde.
- Client: Wendet sich an die Zertifizierungsstelle und prüft die Echtheit des Zertifikates. Nachdem diese bestätigt wurde, schlägt der Client dem Server ein Sitzungsschlüssel vor, welchen er mit dem öffentlichen Schlüssel verschlüsselt und zurück an den Server schickt.
- Server: Entschlüsselt nun mit seinem privaten Schlüssel die Übertragung und verwendet den erhaltenen Sitzungsschlüssel für die weitere Übertragungen.
Schneidet jemand die verschlüsselte Übertragung mit, kann er erstmal nichts damit Anfangen, solange, bis er in der Zukunft irgendwann mal an den privaten Schlüssel des Servers kommt. Denn dann kann den Part der Übertragung entschlüsseln, in dem sich Client und Server auf den gemeinsamen Sitzungsschlüssel geeinigt haben. Und mit diesem kann anschliessend die gesamte restliche Übertragung entschlüsselt werden.
PFS verhindert diesen Ansatz, in dem mit Hilfe eines Mathematischen Ansatzes (Diffie-Hellmann Schlüsselaustausch) sich beide Parteien auf einen Sitzungsschlüssel einigen, der jedoch nie über die Leitung übertragen wurde. Somit kann man selbst dann den Datenstrom nicht entschlüsseln, wenn man den Mitschnitt sowie den privaten Schlüssel des Servers besitzt.
Erst IE Versionen größer 8 können jedoch überhaupt mit PFS umgehen.
PFS mit Apache 2.2
Im Apache 2.2 kann nur CDE (Elliptisch Kurve Algorithmus) aktiviert werden, was zwar etwas langsamer, aber dennoch sicherer ist. Um es zu aktivieren müssen der Datei /etc/Apache2/mods-available/ssl.conf nachfolgende Zeilen geämdert/hinzugefügt werden. Bitte darauf achten, dass die Parameter nicht mehrmals definiert sind, denn greift die zuletzt gesetzte Einstellung.
SSLCipherSuite HIGH:MEDIUM:!ADH SSLProtocol all -SSLv2
Zu bedenken ist, dass die Kombination Apache 2.2 mit IE 10 nicht zur PFS-Verwendung führt, da diese Kombination erst ab Apache 2.4 funktioniert
PFS mit Apache 2.4
Ebenfalls in der Datei /etc/apache2/mods-available/ssl.conf folgende Einstellungen vornehmen:
SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:DHE+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5 SSLHonorCipherOrder on
Apache PFS testen
Ob die PFS nun auch verwendet wird, kann man entweder über die bash oder über ein Firefox Plugin testen.
openssl s_client -cipher 'ECDHE:DH' -connect mx02.blog.cscholz.io:443
ist das Ergebnis eine Ciphersuite, welche mit DH bzw. ECDH beginnt, bietet der Server PFS an.
PFS mit Dovecot & Postfix
Für Dovecot & Postfix gibt es vom Heinlein-Support schon eine sehr umfangreiche Anleitung, weswegen ich mir hier eine erneute Ausführung spare.
Weitere Links
- Heise: Forward Secrecy testen und einrichten
- SSL Server Test
- How installing Apache 2.4 on Debian 6 will throw you three years back in time
- Configuring Apache, Nginx, and OpenSSL for Forward Secrecy
- SSL/TLS & Perfect Forward Secrecy
Nachtrag 08.07.2014
Sollte es trotz der Änderungen kein ECDH bei einer SSL-Verbindung verwendet zu werden, lohnt sich ein Blick auf die CipherSuiten des Servers:
openssl ciphers -v 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA
bzw. ein Blick in die Apache conf-Datei in der das Zertifikate angegeben ist, ob dort wiedersprüchliche Angaben existieren:
<VirtualHost *:443> ... SSLEngine on SSLCertificateFile /path/to/signed_certificate SSLCertificateChainFile /path/to/intermediate_certificate SSLCertificateKeyFile /path/to/private/key SSLCACertificateFile /path/to/all_ca_certs SSLProtocol all -SSLv2 SSLCipherSuite ... SSLHonorCipherOrder on SSLCompression off </VirtualHost>
Ein Kommentar
Hallo,
der Cipher-Suite-String funktioniert nicht bei RHEL / Centos 5, da damit keine Cipher übrig bleibt (OpenSSL in Version 0.98).
Besser ist
ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ALL:!aNULL:!ADH:!3DES:!EXP:!RC4:!kRSA:!kKRB5:!aDSS:!DES:!aPSK:!kECDH
Der String funktioniert auch bei neueren OpenSSL-Versionen. Er erlaubt nur Ciphers mit FS.
Mehr dazu steht unter http://www.tuxad.de/blog/archives/ssl/index.html
Viele Grüße
Frank