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 SSLProtocol
linię 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.1
i +/-TLSv1.2
nie 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.
Odpowiedzi:
Zaintrygowany tym błędem (i tak, udało mi się go odtworzyć) rzuciłem okiem na kod źródłowy najnowszej stabilnej wersji
mod_ssl
i znalazłem wyjaśnienie. Miejcie ze sobą, to spowoduje przepełnienie amatorskiego stosu:Po
SSLProtocol
przeanalizowaniu,char
wygląda to tak:Po zainicjowaniu nowego kontekstu serwera WSZYSTKIE dostępne protokoły zostaną włączone, a powyższe
char
zostanie 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ż
SSLProtocol
nie 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:
SSLProtocol
zostaje przeanalizowany w wierszu 925 wpkg.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.c
po czym określone protokoły zostają wyłączone w kolejnych wierszachJak to wtedy wyłączyć?
Masz kilka opcji:
Protocols All,-TLSv1.1,-TLSv1.2
mod_ssl
;-)źródło
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.cnf
i na Windows 7 w%systemdrive%\openssl\openssl.cnf
.SSLProtocol
w 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.)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:
źródło
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:
I jeszcze jedno: czy można ustawić protokół SSL w Apache dla pojedynczego VirtualHost (pudla)? . Według vallismortis:
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.
źródło