Co potřebuji pro SNI řešení?
Na straně serveru toho moc dělat nemusíte — níže uvedené nastavení je předpokladem a ve valné většině případů postačí výchozí nastavení aktuálních verzí Apache a OpenSSL.
Apache | Apache Tomcat | nginx | Microsoft IIS | IBM HTTP Server |
2.2.12+ | 9+ | 0.5.23+ | 8+ | 9.0.0+ |
- OpenSSL verze 0.9.8k, která již má ve výchozí konfiguraci povolené TLS rozšíření. Podpora TLS je možná již u OpenSSL verze 0.9.8f, ovšem s ruční konfigurací. Verzi OpenSSL zjistíte jednoduchým příkazem openssl version.
- Apache server musí být nakofigurován s podporou mod_ssl a běžet jako run-time (init.d) proces.
Podpora SNI je potřeba i ze strany webového prohlížeče na klientském počítači. SNI podporují:
- Google Chrome
- Firefox 2.0 a novější
- Safari 3.2.1 a novější
- Edge
- Internet Explorer 7.0 a novější (na operačním systému XP musí být nainstalován Service Pack 3)
- Opera 8.0 s povolenou podporou TLS a novější.
Ostatní s podporou SNI:
- cURL 7.18.1 a novější
- wget 1.14 a novější
- JAVA 1.7 a novější
- Perl 1.56 a novější
- PHP 5.3 a novější
- Python 2.7.9 a novější
- Ruby 2.0 a novější
Jak ověřím podporu SNI na serveru?
Nejprve vytvořte dva různé VirtualHosty se sdílenou IP adresou a přiřaďte každé příslušný SSL certifikát. Jak to udělat, se dočtete ve článku Instalace SSL.
Ověření podpory SNI na serveru pak závisí na typu chybové hlášky. Pakliže server při startu hlásí "You should not use name-based virtual hosts in conjunction with SSL!", pak byl Apache nakonfigurován bez podpory SNI rozšíření. Naopak pokud je Apache správně nakonfigurován s podporou SNI, mělo by se objevit varovné hlášení ve znění podobnému tomuto: "[warn] Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)".
Jiným problémem by bylo, kdyby se v Apache log souboru objevilo "[error] No hostname was provided via SNI for a name based virtual host" — to by šlo o chybějící podporu SNI ve webovém prohlížeči klientského počítače. S tím bychom se dnes ovšem již setkat neměli, nanejvýš by se jednalo o uživatele zastaralých Internet Explorer na již nepodporovaném systému Windows XP (Windows Vista, 7 a 8 mají plnou podporu SNI zabudovanou). V takovém případě bude požadavek při výchozí konfiguraci Apache zpracován jako kdyby SNI podporu neměl (tedy standardním způsobem bez SNI).
Konfigurace serveru s podporou SNI
- Společnost Alpiro je prodejcem SSL certifikátů a digitálních osobních (S/MIME) certifikátů. Instalaci SSL certifikátů zajišťuje sám klient vlastními silami a prostředky. Společnost Alpiro nenese odpovědnost za případné komplikace s instalací certifikátu na server. V případě obtíží s instalací certifikátu se obraťte na výrobce serverového softwaru nebo příslušnou dokumentaci, kterou si můžete od výrobce vyžádat.
- Přestože byl postup instalace SSL certifikátu podle tohoto návodu úspěšně otestován, mějtě na paměti, že tento návod je pouze příkladný a nemusí odpovídat konkrétní konfiguraci nebo verzi vašeho serveru. Společnost Alpiro neručí za jakékoliv případné škody způsobené použitím tohoto materiálu.
Ujistěte se, že Apache naslouchá na portu 443 (HTTPS) a že naslouchá pro všechny VirtualHosty na portu 443:
Listen 443
NameVirtualHost *:443
Přestože se to týká prakticky jen prohlížeče Internet Explorer na již nepodporovaných Windows XP, ujistíme se, že server bude přijímat i požadavky od webových prohlížečů bez podpory SNI přidáním následující direktivy:
SSLStrictSNIVHostCheck off
První definovaný VirtualHost je výchozí — ten bude vyřizovat požadavky, které neodpovídají ServerName žádného jiného VirtualHostu:
<VirtualHost 1.2.3.4:443>
ServerName www.ssls.cz
ServerAlias ssls.cz
DocumentRoot /public_html/www.ssls.cz
SSLEngine on
SSLProtocol all -SSLv3 -SSLv2
SSLCertificateFile /cesta/k/ssls.cz.crt
SSLCertificateKeyFile /cesta/k/ssls.cz.key
SSLCACertificateFile /cesta/k/ca_intermediate_1.crt
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression off
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
Všimněte si doporučené konfigurace hlavičky "Strict-Transport-Security" (HSTS). Více o konfiguraci HSTS…
Následovat pak mohou ostatní VirtualHosty:
<VirtualHost 1.2.3.4:443>
ServerName www.alpiro.cz
ServerAlias alpiro.cz
DocumentRoot /public_html/www.alpiro.cz
SSLEngine on
SSLProtocol all -SSLv3 -SSLv2
SSLCertificateFile /cesta/k/alpiro.cz.crt
SSLCertificateKeyFile /cesta/k/alpiro.cz.key
SSLCACertificateFile /cesta/k/ca_intermediate_2.crt
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression off
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
Všimněte si, že jsme u obou VirtualHost použili stejnou IP adresu — tu nahraďte příslušnou IP adresou serveru.
Jak to spojení vůbec probíhá?
Ze všecho nejdříve Apache na základě požadavku klientského počítače standardní cestou ověří přítomnost nastavení odpovídající IP adresy a portu standardní cestou bez SNI rozšíření (na bázi IP/port).
Poté Apache ověří přítomnost NameVirtualHost, který musí být uveden před prvním VirtualHost. Pokud odpovídající NameVirtualHost není přítomný, Apache nemůže pokračovat ve výběru z VirtualHostů pomocí SNI.
Pakliže TLS požadavek na spojení od klientského počítače obsahuje i název hostitele, Apache jej porovná s hodnotami direktiv ServerName a ServerAlias ve VirtualHostech a následně vybere první odpovídající VirtualHost.
Takové spojení tedy neprobíhá na základě požadavku v HTTP hlavičce, ale na základě informací v TLS požadavku. Za poznámku stojí skutečnost, že se při tomto procesu nedbá na obsah samotných SSL certifikátů — ověření validity SSL certifikátu probíhá až potom.