Jak wyłączyć TLS 1.1 i 1.2 w Apache?

13

Mam serwer Ubuntu 12.04.2 LTS z Apache 2.2.22 z mod_ssl i OpenSSL v1.0.1.

W mojej konfiguracji vhosts (wszystko inne, co zachowuje się tak, jakbym się spodziewał), mam SSLProtocollinię z -all +SSLv3.

Przy tej konfiguracji TLS 1.1 i 1.2 są włączone i działają poprawnie - co jest dla mnie sprzeczne z intuicją, ponieważ spodziewałbym się, że tylko SSLv3 byłby włączony przy tej konfiguracji.

Mogę włączyć / wyłączyć TLSv1 w porządku -/+TSLv1, i działa zgodnie z oczekiwaniami. Ale +/-TLSv1.1i +/-TLSv1.2nie są ważne opcje konfiguracyjne - więc nie mogę wyłączyć je w ten sposób.

Jeśli chodzi o to, dlaczego chciałbym to zrobić - mam do czynienia z aplikacją innej firmy (nad którą nie mam kontroli), która ma pewne błędy w działaniu serwerów obsługujących TLS i muszę ją całkowicie wyłączyć, aby przejść dalej.

Kyle Lowry
źródło
tylko z ciekawości - czy mogę zapytać, dlaczego chcesz wyłączyć TSL? z tego, co zebrałem, powinien być bardziej bezpieczny niż SSLv1 / 2/3, więc mogę sobie wyobrazić powody, dla których chcę zezwolić tylko na wersję 1.2, a nie 1.1 (to mnie tu przywiodło), ale nie na wyłączanie jej na korzyść protokołu SSL, z wyjątkiem problemów z kompatybilnością ze starszym oprogramowaniem?
kodowanie
@codeling Praca ze starym, zewnętrznym oprogramowaniem, które ma błędy w TLS.
Kyle Lowry

Odpowiedzi:

23

Zaintrygowany tym błędem (i tak, udało mi się go odtworzyć) rzuciłem okiem na kod źródłowy najnowszej stabilnej wersji mod_ssli znalazłem wyjaśnienie. Miejcie ze sobą, to spowoduje przepełnienie amatorskiego stosu:

Po SSLProtocolprzeanalizowaniu, charwygląda to tak:

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

Po zainicjowaniu nowego kontekstu serwera WSZYSTKIE dostępne protokoły zostaną włączone, a powyższe charzostanie sprawdzone za pomocą kilku sprytnych operacji bitowych AND w celu ustalenia, które protokoły powinny zostać wyłączone . W takim przypadku, gdy SSLv3 jest jedynym protokołem, który został jawnie włączony, pozostałe 3 zostaną wyłączone.

OpenSSL obsługuje ustawienie protokołu dla TLSv1.1, ale ponieważ SSLProtocolnie uwzględnia tych opcji, nigdy nie zostanie wyłączone. OpenSSL v1.0.1 ma pewne znane problemy z TLSv1.2, ale jeśli jest obsługiwany, to chyba tak samo jest z TLSv1.1; nie jest rozpoznawany / obsługiwany przez mod_ssl i dlatego nigdy nie jest wyłączany.

Odnośniki do kodu źródłowego dla mod_ssl:

SSLProtocolzostaje przeanalizowany w wierszu 925 w pkg.sslmod/ssl_engine_config.c
Opcje użyte w powyższej funkcji są zdefiniowane w wierszu 444 we pkg.sslmod/mod_ssl.h
Wszystkie protokoły zostają włączone w wierszu 586, pkg.sslmod/ssl_engine_init.cpo czym określone protokoły zostają wyłączone w kolejnych wierszach

Jak to wtedy wyłączyć?

Masz kilka opcji:

  1. Wyłącz go w pliku konfiguracyjnym OpenSSL za pomocą:
    Protocols All,-TLSv1.1,-TLSv1.2
  2. Przepisz mod_ssl;-)
Mathias R. Jessen
źródło
Wygląda na idealną odpowiedź, wystarczy zweryfikować: który / co / gdzie plik konfiguracyjny OpenSSL?
Kyle Lowry
openssl.cnf- lokalizacja zależy od instalacji. W przypadku Debiana squeeze znalazłem go w /etc/ssl/openssl.cnf, w OS X w /System/Library/OpenSSL/openssl.cnfi na Windows 7 w %systemdrive%\openssl\openssl.cnf.
Mathias R. Jessen
1
Patrzę teraz na plik konfiguracyjny; składnia wygląda nieco inaczej niż oczekiwałbym na podstawie twojej odpowiedzi i nie mogę znaleźć niczego online, co wyraźnie wskazywałoby, że możesz kontrolować protokoły, które są włączone / wyłączone z tego pliku konfiguracyjnego. Czy masz na to jakieś referencje? Dzięki.
Kyle Lowry
Inna opcja - użyj: SSLProtocolw ten sam sposób powyżej ( SSLProtocol All -TLSv1.1 -TLSv1.2(przecinki nie powinny być potrzebne)), ale w ramach globalnej lub określonej konfiguracji Apache, aby „zastąpić” dowolną konfigurację globalną SSL wspomnianą powyżej. (Jeśli nie chcesz, aby zmienić wszystkie podstawowych szyfrów SSL -> Ponieważ szyfr trzeba uważany jest za słaby.)
bshea
2

Problem został również rozwiązany w komentarzach na stronie mod_ssl Apache: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136

Gdyby Ubuntu 12.04 miał Apache 2.2.23, problem nie wystąpiłby. Zgodnie z komentarzami możliwe jest włączenie TLSv1.1 i TLSv1.2, ale TLSv1.0 jest również włączony:

SSLProtocol All -SSLv2 -SSLv3
Coanda
źródło
1

Przede wszystkim musisz zidentyfikować domyślny vhost dla portu 443 na twoim serwerze (pierwszy vhost SSL załadowany przez Apache) i edytować jego plik konfiguracyjny. Większość użytkowników ma na swoich serwerach plik ssl.conf, na którym jest skonfigurowany vhost dla portu 443. Ponieważ nazwa tego pliku zaczyna się od „s”, ładuje się przed vhostami skonfigurowanymi w vhosts.conf (który zaczyna się od „v”). Sprawdź więc, czy tak jest w Twoim przypadku (odpowiedź brzmi „tak” dla praktycznie każdego) i zmień protokoły w tym pliku . Wystarczy!

Podobny problem został opublikowany tutaj: Jak wyłączyć TLS 1.1 i 1.2 w Apache? . Według HBruijn:

O ile nie masz IP VirtualHosts, w praktyce ustawienia od pierwszego wystąpienia dyrektywy SSLProtocol są używane dla całego serwera i / lub wszystkich VirtualHostów opartych na nazwie obsługujących TLS

I jeszcze jedno: czy można ustawić protokół SSL w Apache dla pojedynczego VirtualHost (pudla)? . Według vallismortis:

SSLProtocol można ustawić tylko dla pierwszego VirtualHost w pliku konfiguracyjnym. Wszystkie kolejne wpisy VirtualHost odziedziczą to ustawienie od pierwszego wpisu i po cichu zignorują własne ustawienie z powodu błędu OpenSSL.

Nawiasem mówiąc: domyślnym vhostem na serwerze dla danego portu jest ten, który odpowiada na żądania dla tego portu, które docierają do serwera bez identyfikacji nazwy serwera (lub z niewłaściwą nazwą serwera). Przykład: adres IP wpisany w pasku adresu przeglądarki lub błędne przekierowanie spowodowane nieprawidłową tabelą DNS.

aldemarcalazans
źródło