Wielu znas widząc HTTPS przyzwyczaiło się mówić, że to HTTP z SSL-em. Ale najczęściej tak nie jest, ponieważ już w 1999 roku został opublikowany następca SSL, czyli TLS 1.0. Wtedy to jeszcze nie był przełom, ale delikatne rozwinięcie SSL 3.0 z możliwością szybkiego powrotu do starego protokołu komunikacji.
Ale już kolejne wersje (TLS 1.1 w 2006 oraz TLS 1.2 w 2008) wprowadzały nowe rozwiązania w bezpieczeństwie komunikacji (np. cipher-block chaining, wprowadzenie SHA-256 zamiast MD5-SHA-1) i stały się jedynym słusznym wyborem podczas zabezpieczania komunikacji nie tylko HTTP.
TLS 1.3
W sierpniu 2018 roku został zaprezentowany TLS 1.3. Jest to przełomowa wersja. Przede wszystkim zostaje skrócony początkowy proces połączenia (uścisku dłoni / handshake) o ~1/3, coś na co narzekało sporo przeciwników wdrażenia HTTPS na serwerach. Dlatego TLS 1.3 jest kluczowym punktem zwrotnym, szczególnie w ruchu mobilnym HTTPS.
Dodatkowo dopracowano integralność danych, poprzez usunięcie starych rozwiązań z TLS, które przyczyniały się do osłabiania konfiguracji (np. DROWN, Vaudenay, Lucky 13, POODLE, SLOTH, CRIME).
Obecnie TLS 1.3 obsługuje już Firefox (od wersji 63), Chrome (od wersji 56), Opera (od wersji 54), jak również systemy od Apple (MacOS od 10.13 i iOS od 11).
HTTP/2
Od kilku lat większość oprogramowania serwerowego, jak również klienciego obsługuje HTTP/2. HTTP/2 jest równie przełomowym krokiem wydajnościowym, który dobrze połączyć z TLS 1.3.
Nowa wersja protokołu do całej komunikacji wykorzystuje tylko 1 stałe połączenie na domenę, a same dane nagłówka są kompresowane i wysyłane w zwięzłym binarnym formacie (zamiast plain/text).
nginx
Nginx od wersji 1.9.5 (wrzesień 2015) wspiera w pełni HTTP/2 w naszych aplikacjach internetowych, czy blogach. „Aktywacja” jest bardzo prosta, wystarczy do dyrektywy listen dodać opcję http2:
1 2 3 |
server { listen 127.0.0.1:443 ssl http2; ... |
Natomiast TLS 1.3 to nowość w świecie oprogramowania. Nginx obsługuje protokół TLS 1.3 od wersji 1.15.4 (od 1.15.3 wsparcie dla BoringSSL). I jedyne co należy zrobić w samej konfiguracji to dodać wartość TLSv1.3 dla pozycji ssl_protocols,a przy okazji usuńcie (jeśli macie) TLSv1.
1 |
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; |
Ale to nie wszystko, aby nasz serwis był serwowane po TLS 1.3. A to dlatego, że większość dystrybucji Linuksa nie oferuje w swoich paczkach OpenSSL w wersji 1.1.1, który dostarcza pełne wsparcie dla nowej technologii.
Co musimy zrobić? Pobrać kod źródłowy OpenSSL 1.1.1, rozpakować, skompilować, a następnie podczas konfiguracji receptury nginx wskazać nową wersję OpenSSL za pomocą opcji –with-openssl=katalog. Cała konfiguracja może wyglądać w ten sposób:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
make clean ./configure \ --sbin-path=/usr/local/sbin \ --with-pcre-jit \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --without-mail_pop3_module \ --without-mail_imap_module \ --without-mail_smtp_module \ --with-openssl=../../openssl-1.1.1 \ --with-openssl-opt='enable-ec_nistp_64_gcc_128 enable-tls1_3' make |
I oczywiście na koniec instalacja (make install). Od teraz mamy pełne wsparcie dla HTTP/2 oraz TLS 1.3. W połączeniu z dobrą konfiguracją samej komunikacji (ciphers, Diffie-Hellman, stapling, HSTS) możemy cieszyć się oceną A+ w SSL Labs.
Oczywiście, jak chcecie lepiej zoptymalizować działanie Waszej aplikacji web możecie skorzystać z dodatkowych modułów nginx, aby pominąć wykonywanie kodu PHP lub w innym języku i zatrzymać proces na poziomie samego nginx, np.:
- srcache-nginx-module – transparent subrequest-based caching layout for arbitrary nginx locations
- memc-nginx-module – an extended version of the standard memcached module that supports set, add, delete, and many more memcached commands
- ngx_http_redis – nginx HTTP redis module
- echo-nginx-module – brings „echo”, „sleep”, „time”, „exec” and more shell-style goodies to Nginx config file
- ngx-fancyindex – makes possible the generation of file listings, like the built-in autoindex module does, but adding a touch of style
- headers-more-nginx-module – set, add, and clear arbitrary output headers