Czy można ustawić protokół SSL w Apache dla pojedynczego VirtualHost (pudla)?

13

Próbuję przetestować poprawkę pod kątem podatności pudla, która obejmuje wyłączenie SSLv3 na moim serwerze internetowym. Aby przetestować to najpierw w środowisku nieprodukcyjnym, ustawiam SSLProtocol na VirtualHost dla innego serwera testowego. Moja konfiguracja wygląda mniej więcej tak:

<VirtualHost *:443>
    SSLEngine On
    SSLProtocol All -SSLv2 -SSLv3
    ServerName test.mysite.com
    # bunch of other stuff omitted
</VirtualHost>

Jednak nawet po ponownym uruchomieniu apache moja witryna testowa nadal jest podatna na ataki. Czy to ma zadziałać? Zastanawiam się, czy muszę to ustawić w globalnej konfiguracji ssl, czy też jest coś subtelnego, co powoduje, że ustawienie nie przyjmuje i / lub nie działa.

Cory
źródło

Odpowiedzi:

16

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 .

Istnieje odpowiedni raport o błędzie dla mod_ssl , ale jak opisano w raporcie o błędzie, problem musi zostać rozwiązany w OpenSSL (certyfikat jest dziedziczony, ale nie protokoły).

Zestawy szyfrów muszą być ustawione niezależnie dla każdego VirtualHost, w przeciwnym razie pojawi się lista domyślna, zawierająca wiele niepewnych szyfrów. Należy również pamiętać, że starsi klienci, którzy nie obsługują wskazania nazwy serwera (SNI), zawsze będą używać domyślnego hosta (o ile nie zostanie zablokowanySSLStrictSNIVHostCheck ), co może zakłócać testowanie.

Krótko mówiąc, powinieneś być w stanie określić niestandardowe zestawy szyfrów i certyfikaty dla każdego wirtualnego hosta, ale dopóki błąd nie zostanie naprawiony, nie oczekuj poprawnego działania z niestandardowymi protokołami dla każdego wirtualnego hosta.

Napotkałem ten problem z Apache 2.4 i modssl z OpenSSL 1.0.1k, i spodziewam się, że Apache 2.2 będzie podlegał tym samym problemom.

Aktualizacja (październik 2016 r.): Błąd OpenSSL został oznaczony jako rozwiązany w dniu 13 października 2016 r. Był to jednak część masowego zamknięcia otwartych problemów i chociaż dostarczono „częściowej poprawki”, problem nigdy nie został w pełni rozwiązany.

Aktualizacja (kwiecień 2018 r.): Ponownie zgłoszony błąd OpenSSL ma teraz dostępną łatkę (od 9 kwietnia 2018 r.). Ta poprawka zmieni zachowanie instancji Apache skonfigurowanych z wieloma wirtualnymi hostami SNI:

Odrzuć połączenia niezgodne z vhost SSLProtocol

Zostało to opracowane i przetestowane w wersji 2.4.27 oraz w wersji produkcyjnej z tą wersją. Łatka została zmodyfikowana do wersji 2.4.33 i lekko przetestowana.

Sprawdza to wersję połączenia z protokołem SSLProtocol skonfigurowanym dla wirtualnego hosta, który jest dopasowany na podstawie SNI. Ponieważ połączenie jest początkowo nawiązywane z SSLProtocol skonfigurowanym dla domyślnego hosta dla portu, domyślny host musi zawierać wszystkie protokoły, które będą obsługiwane przez dowolny host wirtualny.

Ta poprawka dodaje dodatkowy status zwracany przez APR_EMISMATCH do funkcji init_vhost, dzięki czemu wywołanie zwrotne ssl_callback_ServerNameIndication zarejestrowane w OpenSSL może zwrócić fatalny alert SSL_AD_PROTOCOL_VERSION. Ma to na celu wygenerowanie takiej samej odpowiedzi na ClientHello, jak w przypadku określenia protokołu SSL, który nie obejmuje danej wersji. Ponieważ wywołanie zwrotne SNI jest wywoływane podczas przetwarzania ClientHello i przed wygenerowaniem odpowiedzi, wydaje się, że właśnie to robi.

Jeśli nagle zobaczysz komunikaty w następującym formacie:

Rejecting version [version] for servername [hostname]

Następnie powinieneś dwukrotnie sprawdzić SSLProtocolswój domyślny host.

vallismortis
źródło
Dodatkowe informacje dodane przez @anx dotyczące SSLStrictSNIVHostChecksą bardzo mile widziane. Jednak z cytowanej dokumentacji należy również zauważyć, że jeśli jest włączony w jakimkolwiek innym hoście wirtualnym, nieświadomi klienci SNI nie mają dostępu do tego konkretnego hosta wirtualnego .
vallismortis
5

Możesz mieć różne protokoły SSL dla każdego Vhosta, jeśli nasłuchują na innym adresie IP.

Przykład z konkretnym hostem zezwalającym na TLSv1 i wszystkimi innymi zezwalającymi tylko na TLSv1.1 i TLSv1.2 - i jednym zezwalającym tylko na TLSv1.2:

<VirtualHost *:443>
  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3 -TLSv1
  ServerName test.mysite.com
  # bunch of other stuff omitted
</VirtualHost>

<VirtualHost 10.0.0.2:443>
  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ServerName test2.mysite.com
</VirtualHost>

<VirtualHost 10.0.0.3:443>
  SSLEngine On
  SSLProtocol TLSv1.2
  ServerName test2.mysite.com
</VirtualHost>
BitLegacy01
źródło
Ponadto, jeśli potrzebujesz go tylko do celów testowych, możesz użyć innego portu zamiast innego adresu IP, np. Wspólnego alternatywnego portu HTTPS 8443.
Esa Jokinen
0

Jeśli używasz nazwy serwera (SNI) z vhostem, w rzeczywistości nie możesz zdefiniować wielu wersji SSL.

Jeśli jednak używasz serwera dedykowanego, prawdopodobnie możesz dodać inny adres IP do swojego serwera. W ten sposób będziesz mógł używać innej wersji SSL dla każdego adresu IP. Musisz tylko zmienić ustawienia vhost zgodnie z oczekiwaniami IP: 443.

tryp
źródło
-2

Lub możesz użyć:

SSLProtocol TLSv1 TLSv1.1 TLSv1.2

Zostałem przetestowany na wielu serwerach i działa dla mnie! Możesz przetestować swoją witrynę na tej stronie

Rodrigo Moreno
źródło
4
Ta linia SSLProtocol wygląda tak, jakby działała, ponieważ Apache na nią nie narzeka. W rzeczywistości używana jest tylko SSLProtocol w pierwszym wpisie VirtualHost.
vallismortis