Server Name Indication (SNI) op NginX

Server Name Indication is een uitbreiding van SSL (Secure Socket Layer) en TLS die aan het begin van het handshaking proces aangeeft met welke hostname de client verbinding zoekt. Dit maakt het mogelijk voor de server om meerdere certificaten te presenteren, en daardoor aan één IP-adres en poort (poort 443) verschillende websites met SSL beveiliging te verbinden. Door gebruik van SNI vervalt de noodzaak voor het gebruik van aparte IP-adressen voor iedere website met SSL beveiliging op een webserver.

NgingX compileren en installeren

Voor het compileren van OpenSSL met TLS SNI ondersteuning heeft u de nieuwste source nodig. Deze kunt u downloaden en uitpakken in een tijdelijke map. Voor deze handleiding gebruiken we ~/src.

    $ cd ~/src
    $ wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
    $ tar zxvf ./openssl-1.0.1c.tar.gz
    $ cd ./openssl-1.0.1c

TLS ondersteuning configureren

    $ ./config enable-tlsext
    $ make
    $ make install
    $ cd ..


NginX SNI ondersteuning verifiëren

Na compilatie en installatie kunt u controleren of TLS SNI is ingeschakeld met het volgende commando: nginx -V

Onderstaand een voorbeeld van de output van dit commando:


    [root@host src]# nginx -V
    nginx version: nginx/1.0.1c
    built by gcc 4.1.2 20080704 (Red Hat 4.1.2-46)
    TLS SNI support enabled
    configure arguments: --prefix=/usr/local/nginx
    --add-module=/usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.5/ext/nginx
    --pid-path=/usr/local/nginx/logs/nginx.pid --sbin-path=/usr/local/sbin/nginx
    --with-md5=/usr/lib --with-sha1=/usr/lib --with-http_ssl_module
    --with-http_realip_module --with-http_gzip_static_module
    --with-openssl=/root/src/openssl-1.0.1c/


Na inschakeling is het mogelijk meerdere met SSL beveiligde websites te hosten op een enkel IP-adres. Om gebruik te maken van SNI maakt u op de reguliere wijze een server aan in NGINX maar voegt hier, in tegenstelling tot reguliere HTTPS servers, een server_name aan toe welke de domeinnaam bevat.

Multidomein certificaat met SNI

Om errors en waarschuwingen te voorkomen bij clients die geen SNI ondersteunen kunt u SNI combineren met een multidomein certificaat. Hiertoe maakt u een losse server aan in uw configuratie die luistert op hetzelfde IP-adres als de SNI sites. Deze site mag echter geen server_name regel bevatten en moet bij voorkeur ingesteld worden als default_server voor SSL op het gebruikte IP-adres. Als het instellen als default server niet werkt dan kunt u werken met een enkel configuratie bestand voor alle SNI sites en de site met het MDC certificaat hier als eerste in opnemen. NGINX zal vervolgens clients die geen SNI ondersteunen het MDC certificaat tonen, maar wel de content weergeven van de opgevraagde website.

Hieronder een voorbeeld configuratie waarbij geen default_server is gebruikt:

server {
listen 443;

ssl on;
ssl_certificate MDC.crt;
ssl_certificate_key MDC.key;

root /usr/share/nginx/www;
index index.html index.htm;

}

server {

listen 443;
server_name site1.sslcertificaten.nl;

root /usr/share/nginx/www/site1;
index index.html index.htm;

ssl on;
ssl_certificate /etc/nginx/ssl/site1/site1.crt;
ssl_certificate_key /etc/nginx/ssl/site1/site1.key;
}

server {

listen 443;
server_name site2.sslcertificaten.nl;

root /usr/share/nginx/www/site2;
index index.html index.htm;

ssl on;
ssl_certificate /etc/nginx/ssl/site2/site2.crt;
ssl_certificate_key /etc/nginx/ssl/site2/site2.key;

point up