Apache – Anpassung SSL Protokolle und Cipher Suites

Letzte Aktualisierung am 20.07.2022, 15:07:05 Uhr

Ich nutze im privaten Umfeld seit Weihnachten 2018 einen virtuellen Server mit Ubuntu 18.04. Dort habe ich zur einfachen und schnellen Administration das kostenlose Panel KeyHelp installiert. Die Anwendung wird von KeyWeb entwickelt. Ideen und Wünsche der Community fließen regelmäßig in neue Versionen ein.

Vorwort

Aktuell wird der Webserver Apache2 unter Ubuntu 20.04 mit der Versionsnummer 2.4.29 ausgeliefert. Durch die Installation von KeyHelp und der Verwendung Let’s Encrypt wird auch das Modul SSL des Apache2 installiert und aktiviert. Standardmäßig sind natürlich SSL Protokolle wie TLS 1.0, TLS 1.1 und TLS 1.2 aktiviert. Zusätzlich ist eine große Anzahl von Cipher Suites konfiguriert um eine möglichst große Anzahl von Geräten bzw. Betriebssysteme und Browser zu erreichen.

Um unsichere Protokolle und Cipher Suites zu deaktivieren, ist ein Eingriff via SSH direkt auf die zuständige Konfigurationsdatei des Apache2 bzw. Moduls notwendig. In diesem Fall handelt es sich um die Datei /etc/apache2/mods-enabled/ssl.conf.

Bisher/Standard

<IfModule mod_ssl.c>

    SSLRandomSeed startup builtin
    SSLRandomSeed startup file:/dev/urandom 512
    SSLRandomSeed connect builtin
    SSLRandomSeed connect file:/dev/urandom 512

    ##
    ##  SSL Global Context
    ##
    ##  All SSL configuration in this context applies both to
    ##  the main server and all SSL-enabled virtual hosts.
    ##

    # Some MIME-types for downloading Certificates and CRLs
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl

    # Pass Phrase Dialog:
    SSLPassPhraseDialog     exec:/usr/share/apache2/ask-for-passphrase

    # Inter-Process Session Cache:
    SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
    SSLSessionCacheTimeout  300

    # SSL Cipher Suite:
    SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA::AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!ECDHE-RSA-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!DES-CBC3-SHA:!DSS
    SSLHonorCipherOrder     on

    # The protocols to enable
    SSLProtocol             all -SSLv3 -SSLv2

    # OCSP Stapling
    #SSLUseStapling          on
    #SSLStaplingResponderTimeout 5
    #SSLStaplingReturnResponderErrors off
    #SSLStaplingCache        shmcb:${APACHE_RUN_DIR}/ssl_ocsp(512000)

    # Whether to forbid non-SNI clients to access name based virtual hosts.
    # Default: Off
    #SSLStrictSNIVHostCheck On

</IfModule>

Debian 9 und Ubuntu 18.04

<IfModule mod_ssl.c>

    SSLRandomSeed startup builtin
    SSLRandomSeed startup file:/dev/urandom 512
    SSLRandomSeed connect builtin
    SSLRandomSeed connect file:/dev/urandom 512

    ##
    ##  SSL Global Context
    ##
    ##  All SSL configuration in this context applies both to
    ##  the main server and all SSL-enabled virtual hosts.
    ##

    # Some MIME-types for downloading Certificates and CRLs
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl

    # Pass Phrase Dialog:
    SSLPassPhraseDialog     exec:/usr/share/apache2/ask-for-passphrase

    # Inter-Process Session Cache:
    SSLSessionCache         shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
    SSLSessionCacheTimeout  300

    # SSL Cipher Suite:
    SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA
    SSLHonorCipherOrder     on

    SSLOpenSSLConfCmd DHParameters "/etc/ssl/dhparams4096.pem"
    SSLOpenSSLConfCmd ECDHParameters automatic
    SSLOpenSSLConfCmd Curves secp521r1:secp384r1

    # The protocols to enable
    SSLProtocol             -ALL +TLSv1.2

    # OCSP Stapling
    SSLUseStapling          on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
    SSLStaplingCache        shmcb:${APACHE_RUN_DIR}/ssl_ocsp(512000)

    # Whether to forbid non-SNI clients to access name based virtual hosts.
    # Default: Off
    #SSLStrictSNIVHostCheck On

</IfModule>

DH-Keys erzeugen:

openssl dhparam -out /etc/ssl/dhparams4096.pem 4096

Dieser Vorgang kann je nach System einige Minuten in Anspruch nehmen. Zeit für einen Tee oder Kaffee. 🙂

Debian 10 / Ubuntu 20.04

<IfModule mod_ssl.c>
    SSLRandomSeed startup builtin
    SSLRandomSeed startup file:/dev/urandom 512
    SSLRandomSeed connect builtin
    SSLRandomSeed connect file:/dev/urandom 512

    # Some MIME-types for downloading certificates and CRLs
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl

    # Pass phrase dialog
    SSLPassPhraseDialog                 exec:/usr/share/apache2/ask-for-passphrase

    # Inter-process session cache
    SSLSessionCache                     shmcb:${APACHE_RUN_DIR}/ssl_scache(512000)
    SSLSessionCacheTimeout              300

    # SSL configuration
    SSLProtocol                         all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite                      ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA
    SSLHonorCipherOrder                 on
    SSLCompression                      off
    SSLSessionTickets                   off

    SSLOpenSSLConfCmd                   Curves secp521r1:secp384r1

    # OCSP stapling
    SSLUseStapling                      on
    SSLStaplingResponderTimeout         5
    SSLStaplingReturnResponderErrors    off
    SSLStaplingCache                    shmcb:${APACHE_RUN_DIR}/ssl_ocsp(512000)

    # Whether to forbid non-SNI clients to access name based virtual hosts.
    # Default: Off
    #SSLStrictSNIVHostCheck On
</IfModule>

 

Abschließend muss  die neue Konfiguration noch in den Webserver Apache2 geladen werden:

service apache2 reload

Resultat

Daas Ergebnisbei Qualys SSL Server Test für Debian 9 / Ubuntu 18.04:

Daas Ergebnisbei Qualys SSL Server Test für Debian 10 / Ubuntu 20.04:

12.07.2019, 15:30 Uhr
Anpassung von SSLCipherSuite für die neuste Version des Apache2 bzw. OpenSSL unter Ubuntu 18.04.2 LTS.

02.08.2019, 22:29 Uhr

Anpassung von SSLCipherSuite für Qualys SSL Server Test.

25.11.2019, 11:25 Uhr

Divsere Anpassungen damit Key Exchange 100 Punkte erhält.

27.11.2019, 10:38 Uhr

Ich habe immer wieder per E-Mail Nachfragen bezüglich der Kompatiblität zu Debian 10 (Buster) erhalten. Ich habe daher die obige Konfiguration heute Vormittag getestet. Soweit keine Probleme oder grobe Ausfälligkeiten. Bis auf eine Sache: Mit der verwendung von TLS 1.3 (ist unter Debian 10 möglich, unter Ubuntu 18.04.x aktuell noch nicht)  sind aktuell bei SSL Labs in der Kategorie „Cipher Strength“ maximal 90 Punkte möglich. Dies ist auf die Cipher Suite „TLS_AES_128_GCM_SHA256“ zurückzuführen. Ich habe dazu ein Issue auf Github bei SSL Labs gefunden. Dort werden auch mögliche Workarounds aufgeführt, falls jemand unbedingt 100 Punkte haben möchte.

17.09.2020, 21.39 Uhr

Den kompletten Artikel für Debian 10 und Ubuntu 20.04 überarbeitet.  Zusätzlich noch einen Screenshot für das Referenz Ergebnis hinzugefügt.

Abonnieren
Benachrichtige mich bei
6 Comments
neueste
älteste
Inline Feedbacks
View all comments
Apache Guacamole – Remote Desktop Gateway (RDG) – Aus der IT – Praxis…
25.10.2020 15:50

[…] Die Seite wird nun ausschließlich über SSL (HTTPS) ausgeliefert. Wer gerne noch die Sicherheits erhöhen möchte, empfehle ich den Artikel Apache – Anpassung SSL Protokolle und Cipher Suites. […]

Apache als Reverse Proxy für UCServer – Aus der IT – Praxis…
04.05.2020 21:11

[…] Für die Anpassung der SSL Protokolle und dazugehörigen Cipher Suites verweise ich auf den Beitrag Apache – Anpassung SSL Protokolle und Cipher Suites. […]

Nginx – Anpassung SSL Protokolle und Cipher Suites – Aus der IT – Praxis…
20.04.2020 23:00

[…] werde immer wieder gefragt, ob es zu dem Beitrag Apache – Anpassung SSL Protokolle und Cipher Suites auch eine Referenz für Nginx gibt? Der einzigste Beitrag, der das kurz und bündig beschreibt ist […]

Christoph
08.04.2020 16:59

Vielen Dank für die ausführliche Erklärung. Wer, wie ich „Let’s Encrypt“ nutzt und trotz geänderter ssl.conf Einstellungen keine Verbesserung sieht, der hat die Rechnung ohne einer ssl Einstellung von Let’s Encrypt gemacht. Sie kommt leider erst nach der globalen Einstellung von apache2 zum Tragen. Die Lösung: Man muss entweder die /etc/letsencrypt/options-ssl-apache.conf ebenfalls bearbeiten: SSLProtocol -all +TLSv1.2 +TLSv1.3 Oder die Datei aus den vhost Einstellungen entfernen. Der Grund dafür ist, dass die Einstellungen des apache2 zwar global gelten, aber durch die nachfolgenden Einstellungen von let’s encrypt überschrieben werden. Siehe auch hier: (Kommentar von ZetaRevan: https://community.letsencrypt.org/t/disabling-tls-1-0-and-tls-1-1/112816/10 Jetzt bin ich bei der Bewertung… Weiterlesen »

Julian
02.11.2019 11:37

Danke, habe durch dich jetzt auch A+ erreicht 🙂