Einen Webserver mit einer aktuellen, robusten SSL Konfiguration zu versehen kann durchaus einen nicht zu unterschätzenden (Test-)Aufwand verursachen. Hier meine Notizen zur heute durchgeführten Konfiguration eines Apache 2.4 Webservers:
- Basierend auf aktuellem Ubuntu 14.04
- Zertifikat von StartSSL.com (kostenfrei, RSA 4096bit, SHA256)
- SSL-VHost Konfiguration angelehnt an den bettercrypto.org Hardening Guide
SSLEngine on SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder On SSLCompression off SSLUseStapling On Header add Strict-Transport-Security "max-age=15768000 ; includeSubDomains" SSLCipherSuite '-ALL:EECDH+aRSA+AES:EDH+aRSA+AES: aRSA+kRSA+AES:+AES256' SSLCertificateFile /etc/ssl/certs/it-sec.ovh.crt SSLCertificateKeyFile /etc/ssl/private/it-sec.ovh.key SSLCertificateChainFile /etc/ssl/certs/startssl.chain.crt
- Aktivierung von OCSP-Stapeling erfordert noch eine Ergänzung in der
/etc/apache2/mods-enabled/ssl.conf:
SSLStaplingCache shmcb:${APACHE_RUN_DIR}/stapling_cache(128000)
Verwendete Cipher-Suites
Gegenüber der in BetterCrypto.org vorgeschlagenen CipherSuite wurden von mir Veränderungen vorgenommen, um:
- Die ephemeral ECDH key agreement Varianten alle den ephemeral DH Varianten vorzuziehen (Performance!)
- Damit (mit der Vorreihung von ECDH) auch Java 1.7 zu unterstützen, denn die von BetterCrypto.org am Beginn der CipherSuite auftauchenden DH-Varianten verwenden DH-Parameter >1024bit was Java 1.7 verweigert.
- Camellia zu entfernen – alle relevanten Clients ziehen AES ohnehin vor, es würde somit nicht zur Anwendung kommen.
- AES128 gegenüber AES256 vorzureihen, denn AES256 bringt keine praxisrelevante zusätzliche Sicherheit (Performance!).
- Einen übersichtlicheren und damit einfacher wartbareren CipherString zu verwenden.
Die o.a. CipherSuite ergibt mit OpenSSL 1.0.1f folgende geordnete Liste:
CipherSuite KeyEx Enc Mac ECDHE-RSA-AES128-GCM-SHA256 ECDH AES128-GCM AEAD ECDHE-RSA-AES128-SHA256 ECDH AES128 SHA256 ECDHE-RSA-AES128-SHA ECDH AES128 SHA1 DHE-RSA-AES128-GCM-SHA256 EDH AES128-GCM AEAD DHE-RSA-AES128-SHA256 EDH AES128 SHA256 DHE-RSA-AES128-SHA EDH AES128 SHA1 AES128-GCM-SHA256 RSA AES128-GCM AEAD AES128-SHA256 RSA AES128 SHA256 AES128-SHA RSA AES128 SHA1 ECDHE-RSA-AES256-GCM-SHA384 ECDH AES256-GCM AEAD ECDHE-RSA-AES256-SHA384 ECDH AES256 SHA384 ECDHE-RSA-AES256-SHA ECDH AES256 SHA1 DHE-RSA-AES256-GCM-SHA384 EDH AES256-GCM AEAD DHE-RSA-AES256-SHA256 EDH AES256 SHA256 DHE-RSA-AES256-SHA EDH AES256 SHA1 AES256-GCM-SHA384 RSA AES256-GCM AEAD AES256-SHA256 RSA AES256 SHA256 AES256-SHA RSA AES256 SHA1 ECDH = Ephemeral Elliptic curve Diffie–Hellman EDH = Ephemeral Diffie-Hellman GCM = Galois/Counter Mode realisiert zugleich AEAD AEAD = Authenticated Encryption with Associated Data
Alle CipherSuites werden mit RSA authentifiziert. Forward-Secrecy ist mit ECDH und EDH gewährleistet. Eine Übersicht welche Clients damit konkret welche CipherSuite verwenden zeigt die nachfolgende Abbildung:
Wie die mit ssllabs.com erstellte Simulation zeigt, verwenden alle heute relevanten Clients somit Forward Secrecy und performantes und zugleich sicheres AES128. Ein Support von altem, ungepatchtem WinXP mit IE6/IE8 erscheint mittlerweile obsolet, weshalb diese Einschränkung in Kauf genommen werden kann.
StartSSL Certificate Chain
Bleibt noch die Frage, was ist in der startssl.chain.crt enthalten:
StartSSL bietet zwar SHA256 Zertifikate an, jedoch ist das Default Intermediate-Zertifikat leider nur SHA1. StartSSL hat jedoch inzwischen auch ein SHA256 Intermediate-Zertifikat bereitgestellt, welches jedoch durchaus gut versteckt ist. Unter https://www.startssl.com/certs/ wird man allerdings fündig: https://www.startssl.com/certs/class1/sha2/der/sub.class1.server.sha2.ca.crt. Weiters empfiehlt es sich, die die Chain noch das Cross-Zertifikat (welches das neue und alte Stammzertifikat „verbindet“) hinzuzunehmen: https://www.startssl.com/certs/ca-cross-sha2.pem
Aus diesen beiden Zertifikaten erstellen wir uns ein PEM-kodiertes, nur mehr SHA256-Zertifikate beinhaltendes startssl.chain (sha256).
Test des Resultats
Die von mir erstellte Demo-Website findet sich hier: https://it-sec.ovh/
Getestet mit dem SSL Labs SSL Server Test