Wie deaktiviere ich TLS 1.1 & 1.2 in Apache?

12

Ich habe einen Ubuntu 12.04.2 LTS-Server, auf dem Apache 2.2.22 mit mod_ssl und OpenSSL v1.0.1 ausgeführt wird.

In meiner vhosts-Konfiguration (alles andere, was sich erwartungsgemäß verhält) habe ich die SSLProtocolZeile mit -all +SSLv3.

Mit dieser Konfiguration sind TLS 1.1 und 1.2 aktiviert und funktionieren ordnungsgemäß - was für mich nicht intuitiv ist, da ich davon ausgehen würde, dass bei dieser Konfiguration nur SSLv3 aktiviert wird.

Ich kann TLSv1 ganz gut mit aktivieren / deaktivieren -/+TSLv1, und es funktioniert wie erwartet. Aber +/-TLSv1.1und +/-TLSv1.2sind keine gültigen Konfigurationsoptionen - daher kann ich sie nicht auf diese Weise deaktivieren.

Was den Grund betrifft, warum ich das tun möchte - ich habe es mit einer Drittanbieteranwendung zu tun (über die ich keine Kontrolle habe), die bei TLS-fähigen Servern ein fehlerhaftes Verhalten aufweist, und ich muss sie vollständig deaktivieren, um fortzufahren.

Kyle Lowry
quelle
Nur aus Neugier - darf ich fragen, warum Sie TSL überhaupt deaktivieren möchten? Soweit ich erfuhr, soll es sicherer sein als SSLv1 / 2/3, daher kann ich mir nur Gründe vorstellen, warum ich nur v1.2 und nicht v1.1 zulassen wollte (das hat mich hierher gebracht), aber nicht, um es zu deaktivieren zugunsten von SSL, außer vielleicht einige Kompatibilitätsprobleme mit älterer Software?
Kodierung
@codeling Arbeiten mit alter Software von Drittanbietern, die Fehler mit TLS aufweist.
Kyle Lowry

Antworten:

22

Fasziniert von diesem Fehler (und ja, ich konnte ihn reproduzieren) habe ich mir den Quellcode für die neueste stabile Version von angesehen mod_sslund eine Erklärung gefunden. Tragen Sie mit mir, das wird Amateur-Stapel-Überlauf bekommen:

Wenn das SSLProtocolgeparst wurde, charsieht es ungefähr so ​​aus:

0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1

Beim Einleiten eines neuen Serverkontexts werden ALLE verfügbaren Protokolle aktiviert, und die oben genannten werden charmithilfe einiger geschickter bitweiser UND-Operationen überprüft, um zu bestimmen, welche Protokolle verwendet werden sollen deaktiviert werden sollen . In diesem Fall, in dem SSLv3 das einzige Protokoll ist, das explizit aktiviert wurde, werden die drei anderen deaktiviert.

OpenSSL unterstützt eine Protokolleinstellung für TLSv1.1. Da SSLProtocoldiese Option jedoch nicht berücksichtigt wird, wird sie niemals deaktiviert. OpenSSL v1.0.1 hat einige bekannte Probleme mit TLSv1.2, aber wenn es unterstützt wird, gehe ich davon aus, dass dies auch für TLSv1.1 gilt. es wird von mod_ssl nicht erkannt / behandelt und ist daher niemals deaktiviert.

Quellcode- Referenzen für mod_ssl:

SSLProtocolwird in Zeile 925 in analysiert. pkg.sslmod/ssl_engine_config.c
Die in der obigen Funktion verwendeten Optionen werden in Zeile 444 in definiertpkg.sslmod/mod_ssl.h
Zeile 586 werden alle Protokolle aktiviert, und in pkg.sslmod/ssl_engine_init.cden folgenden Zeilen werden bestimmte Protokolle deaktiviert

Wie kann ich es dann deaktivieren?

Sie haben einige Möglichkeiten:

  1. Deaktivieren Sie es in der OpenSSL-Konfigurationsdatei mit:
    Protocols All,-TLSv1.1,-TLSv1.2
  2. Umschreiben mod_ssl;-)
Mathias R. Jessen
quelle
Sieht aus wie eine perfekte Antwort, muss nur überprüft werden: Welche / welche / wo OpenSSL-Konfigurationsdatei?
Kyle Lowry
openssl.cnf- Der Speicherort hängt von der Installation ab. Auf Debian Squeeze fand ich es unter /etc/ssl/openssl.cnf, unter OS X unter /System/Library/OpenSSL/openssl.cnfund unter Windows 7 unter %systemdrive%\openssl\openssl.cnf.
Mathias R. Jessen
1
Ich schaue mir jetzt die Konfigurationsdatei an. Die Syntax sieht ein bisschen anders aus als erwartet, basierend auf Ihrer Antwort, und ich kann nichts online finden, das ausdrücklich angibt, dass Sie die Protokolle steuern können, die in dieser Konfigurationsdatei aktiviert / deaktiviert sind. Haben Sie Referenzen dafür? Vielen Dank.
Kyle Lowry
Eine weitere Option - Verwenden Sie: SSLProtocolauf die gleiche Weise wie oben ( SSLProtocol All -TLSv1.1 -TLSv1.2(es sollten keine Kommas erforderlich sein)), aber unter einer globalen oder spezifischen Apache-Konfiguration, um alle oben erwähnten globalen SSL-Konfigurationen zu überschreiben. (Wenn Sie nicht alle zugrunde liegenden SSL-Verschlüsselungen ändern möchten -> Da die von Ihnen benötigte Verschlüsselung als schwach eingestuft wird.)
bshea
2

Das Problem wird auch in den Kommentaren auf der Apache-Seite mod_ssl behandelt: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136

Wenn Ubuntu 12.04 Apache 2.2.23 hätte, wäre das Problem nicht aufgetreten. Nach den Kommentaren ist es möglich, TLSv1.1 und TLSv1.2 zu aktivieren, aber TLSv1.0 ist dann auch aktiviert:

SSLProtocol All -SSLv2 -SSLv3
Coanda
quelle
1

Zunächst müssen Sie den vhost-Standard für Port 443 in Ihrem Server (den ersten von Apache geladenen SSL-vhost) identifizieren und die Konfigurationsdatei bearbeiten. Die meisten Benutzer haben eine ssl.conf- Datei auf ihren Servern, auf der ein vhost für Port 443 konfiguriert ist. Da der Name dieser Datei mit "s" beginnt, wird sie vor den in vhosts.conf konfigurierten vhosts geladen (was mit "v" beginnt). Überprüfen Sie daher, ob dies der Fall ist (die Antwort lautet für praktisch alle "Ja"), und ändern Sie die Protokolle in dieser Datei . Das ist genug!

Ein ähnliches Problem wurde hier veröffentlicht: Wie deaktiviere ich TLS 1.1 & 1.2 in Apache? . Nach HBruijn:

Sofern Sie nicht über IP VirtualHosts verfügen, werden in der Praxis die Einstellungen ab dem ersten Auftreten der SSLProtocol-Direktive für den gesamten Server und / oder alle namensbasierten VirtualHosts verwendet, die TLS unterstützen

Und noch eine hier: Ist es möglich, ein SSL-Protokoll in Apache für einen einzelnen VirtualHost (Pudel) festzulegen? . Laut Vallismortis:

Sie können das SSL-Protokoll nur für den ersten VirtualHost in der Konfigurationsdatei festlegen. Alle nachfolgenden VirtualHost-Einträge übernehmen diese Einstellung vom ersten Eintrag und ignorieren ihre eigene Einstellung aufgrund eines OpenSSL-Fehlers unbemerkt.

Übrigens: Der Standard-vhost auf einem Server ist für einen bestimmten Port derjenige, der die Anforderungen für diesen Port beantwortet, die ohne Angabe eines Servernamens (oder mit einem falschen Servernamen) auf dem Server eintreffen. Beispiel: Eine in die Adressleiste Ihres Browsers eingegebene IP-Adresse oder eine fehlerhafte Weiterleitung aufgrund einer falschen DNS-Tabelle.

aldemarcalazans
quelle