Jeden adres IP, wiele domen z SSL

https in URL
Wiemy już, że możemy mieć darmowy i zaufany certyfikat SSL dzięki Let’s Encrypt. Potrafimy również, bardzo dobrze skonfigurować nginx pod wygenerowany certyfikat SSL.
A dzisiaj obalimy mit, że 1 domena z SSL = 1 adres IP.

SNI

Wiele lat temu obowiązywała zasada, że jeśli chcemy skonfigurować dla naszej domeny https:// musimy mieć również dedykowany adres IP. Ale Internet się rozrastał, serwery były coraz bardziej wydajne. Z tego powodu zasada 1/1/1 (1 serwer, 1 IP, 1 domena) przestawała powoli obowiązywać. Na pojedynczym serwerze zaczęto hostować setki domen, szczególnie przez dużych usługodawców, a adresów IPv4 nie przybywało.
Dlatego w 2003 roku powstała koncepcja rozszerzenia do TLS pod nazwą Server Name Indication (SNI). SNI rozwiązuje powyższy problem poprzez dodanie nazwy domeny jako część negocjacji TLS. Dzięki temu serwer potrafi wybrać poprawną wirtualną domenę z certyfikatem, nie bazując na adresie IP.
W 2004 roku został opracowany patch do OpenSSL dodający obsługę TLS/SNI, który został włączony w 2006 roku do wersji rozwojowej OpenSSL. A w 2007 roku TLS/SNI został oficjalnie włączony do OpenSSL 0.9.8.

Wymagania

Po stronie klienta SNI obecnie jest obsługiwane przez następujące przeglądarki od wersji:

  • Opera 8.0
  • Firefox 2.0
  • MS IE 7.0 (dla Windows Vista i nowszy)
  • Safari 3.2.1 (w wersji Windows musi być Vista lub nowszy)
  • Chrome (w wersji Windows musi być Vista lub nowszy)

I to jest największy problem z SNI. Jeśli musimy oferować wsparcie dla starszych wersji systemów operacyjnych lub bibliotek, przy pomocy których zostały stworzone systemy obsługujące np. API nie jesteśmy w stanie skorzystać z SNI.

Takiego problemu nie mamy od strony serwerowej. Wystarczy posiadać nginx (praktycznie każda wersja, teoretycznie taka z OpenSSL ze wsparciem SNI) albo chociażby Apache 2.2.12 z odpowiednim modułem (mod_ssl lub mod_gnutls).

Konfiguracja nie różni się niczym od tego co wiemy już dotychczas – nie musimy nic zmieniać. Najważniejsze, to sprawdzić czy faktycznie nginx posiada wsparcie dla TLS SNI:

Wsparcie jest. Możemy podbijać świat! Tym bardziej, że SSL to nie tylko zabezpieczenie komunikacji klient<>serwer, ale również przychylniejsze spojrzenie np. przez wujka Google.