Apache - Server Name Indication (SNI)

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.

Deze handleiding beschrijft het configureren van twee websites met SSL: site1.examplesite.net en site2.examplesite.nl. Beide websites maken gebruik van hetzelfde IP-adres maar van een eigen SSL certificaat. Op hetzelfde IP-adres configureren we voor testdoeleinden ook een onbeveiligde website: www.examplesite.net. De onbeveiligde website maakt gebruik van poort 80 in plaats van poort 443.

Benodigd zijn Apache Web server 2.2.12+ met mod_ssl en OpenSSL.

Bij gebruik van Ubuntu 10.04+ of Fedora 10 op de server wordt SNI reeds standaard ondersteund door Apache en OpenSSL. Bij gebruik van Red Hat Enterprise Linux, CentOS 5.x of Debian 5.x is het misschien nodig om Apache en OpenSSL vanuit de source te compileren. SNI wordt ondersteund vanaf Apache versie 2.2.12 en OpenSSL vanaf versie 0.9.8f.

Browser Compatibiliteit

Om het mogelijk te maken dat de SNI servers het juiste certificaat sturen bij het opzetten van een SSL verbinding, zijn er aan de client zijde browsers nodig die SNI ondersteunen. Als een browser geen SNI ondersteunt krijgt de bezoeker een 'untrusted certificate' waarschuwing.
SNI wordt door geen enkele versie van Internet Explorer op Windows XP ondersteund. Recente versies van Internet Explorer op Windows Vista en Windows 7 ondersteunen wel SNI, hetzelfde geldt voor recente versies van Firefox, Chrome en Safari.

Om deze waarschuwingen te voorkomen en toch gebruik te maken van SNI is het mogelijk om een multidomein certificaat in te zetten. Dit certificaat moet alle nodige domeinnamen bevatten en kan vervolgens in de Apache configuratie worden opgenomen in een aparte virtual host. Deze virtual host mag vervolgens geen servername bevatten, waardoor deze de requests af zal vangen waarbij geen hostname wordt opgegeven omdat de client geen SNI ondersteunt. Apache zal vervolgens wel de juiste content tonen van de opgevraagde (SNI) site, maar in combinatie met het multidomein certificaat waardoor waarschuwingen en errors worden voorkomen.

Instructies

  1. Zorg ervoor dat mod_ssl in de Apache installatie is ingeschakeld (door het 'uncommenten' van de juiste regels in httpd.conf, bij Ubuntu of Debian gebruikt u hiervoor 'a2enmod'). Bij de meeste pakket installaties van Apache is mod_ssl standaard ingeschakeld.
  2. Zorg ervoor dat Apache gebruik maakt van poort 443 (voor veilige verbindingen) en u virtuele hosts met namen gebruikt op deze poort.
  3. Ga naar het IfModule mod_ssl.c blok. Deze staat afhankelijk van uw Apache instellingen in het hoofdbestand httpd.conf, het bestand ports.conf of in een specifiek mod_ssl bestand.
  4. In dit blok vindt u de regel:
    Listen 443
  5. Voeg in dit mod_ssl.c blok de volgende regel toe:
    NameVirtualHost *:443

Op basis van deze regel weet Apache dat het gebruik moeten maken van virtuele hosts op de veilige poort.

Let op: Omdat we ook een virtuele host instellen op poort 80 (www.examplesite.net), moet de regel 'NameVirtualHost *:80' ook toegevoegd worden aan uw Apache instellingen. Gebruik hiervoor bij Ubuntu en Debian ports.conf, in de meeste andere gevallen httpd.conf.

Virtuele Hosts

Gebruik voor dit gedeelte van de handleiding aparte submappen van de hoofdmappen van de test gebruiker. Maak eerst mappen voor de domeinen:

    cd /home/demo

    mkdir -p public_html/www.examplesite.net/{public,private,log,cgi-bin,backup}

    mkdir -p public_html/site1.examplesite.net/{public,private,log,cgi-bin,backup}

    mkdir -p public_html/site2.examplesite.net/{public,private,log,cgi-bin,backup}

Ga hierna naar de Apache instellingen map voor het instellen van de virtuele host.

Instellingen onbeveiligde website

Bekijk de instellingen voor de onbeveiligde website:

    <VirtualHost *:80>
        ServerName "www.examplesite.net" 
        ServerAdmin webmaster@examplesite.net 
        DocumentRoot /home/demo/public_html/www.examplesite.net/public 
        ErrorLog /home/demo/public_html/www.examplesite.net/log/error.log 
        LogLevel warn 
        CustomLog /home/demo/public_html/www.examplesite.net/log/access.log combined 
        <Directory /home/demo/public_html/www.examplesite.net/public>
            Options Indexes FollowSymLinks MultiViews 
            AllowOverride None 
            Order allow,deny 
            allow from all 
            </Directory> 
    </VirtualHost> 

Met deze instellingen zal Apache de website 'www.examplesite.net' verbinden met poort 80.

Instelling beveiligde websites

  •     Instelling beveiligde website 1

    Maak een configuratiebestand voor de eerste van de twee beveiligde websites, site1.examplesite.net. Het configuratiebestand lijkt op die van de standaard virtuele host. Echter gebruikt site1.example.net poort 443 en voegen we aan het einde SSL instellingen toe:
    <VirtualHost *:443>
        ServerName "site1.examplesite.net" 
        ServerAdmin webmaster@examplesite.net 
        DocumentRoot /home/demo/public_html/site1.examplesite.net/public 
        ErrorLog /home/demo/public_html/site1.examplesite.net/log/error.log 
        LogLevel warn 
        CustomLog /home/demo/public_html/site1.examplesite.net/log/access.log combined 
        <Directory /home/demo/public_html/site1.examplesite.net/public>
            Options Indexes FollowSymLinks MultiViews 
            AllowOverride None 
            Order allow,deny 
            allow from all 
        </Directory> 
        SSLEngine On 
        SSLCertificateFile /var/www/certs/site1.pem 
        SSLCertificateKeyFile /var/www/keys/site1.key 
    </VirtualHost> 

Merk op dat certificaatbestand site1.pem is en het sleutelbestand site1.key.

 

  •     Instelling beveiligde website 2

Net zoals voor website 1, wordt het VirtualHost bestand voor site2.examplesite.net als volgt:

    <VirtualHost *:443>
        ServerName "site2.examplesite.net" 
        ServerAdmin webmaster@examplesite.net 
        DocumentRoot /home/demo/public_html/site1.examplesite.net/public 
        ErrorLog /home/demo/public_html/site2.examplesite.net/log/error.log 
        LogLevel warn 
        CustomLog /home/demo/public_html/site2.examplesite.net/log/access.log combined 
        <Directory /home/demo/public_html/site2.examplesite.net/public>
            Options Indexes FollowSymLinks MultiViews 
            AllowOverride None 
            Order allow,deny 
            allow from all 
        </Directory> 
        SSLEngine On 
        SSLCertificateFile /var/www/certs/site2.pem 
        SSLCertificateKeyFile /var/www/keys/site2.key 
    </VirtualHost> 

Voor site2.example.net gebruikt u andere certificaat- en sleutelbestanden, namelijk site2.pem en site2.key.

Op basis van deze instellingen gebruikt site2.examplesite.net ook poort 443. In het geval van een enkel publiek IP-adres op de server betekent dit dat beide beveiligde websites dit IP-adres delen. Zonder gebruik van SNI zou dit niet mogelijk zijn.

Test Pagina's

Ter afronding van de installatie kunt u voor het testen van de websites enkele index pagina's maken.

Maak de index pagina voor de onbeveiligde website op:

/home/demo/public_html/www.examplesite.net/public/index.html

Voeg aan het bestand toe:

    <html>
        <head><title>WWW Test</title></head> 
        <body>
                www.examplesite.net is working. 
        </body> 
    </html> 



De locatie voor de pagina voor site1.examplesite.net zou moeten zijn:
/home/demo/public_html/site1.examplesite.net/public/index.html

Voeg aan het bestand toe:

    <html>
        <head><title>Site1 Test</title></head> 
        <body>
                site1.examplesite.net is working. 
        </body> 
    </html> 

 

De locatie voor de pagina voor site2.examplesite.net zou moeten zijn:

/home/demo/public_html/site2.examplesite.net/public/index.html

Inhoud voor het bestand:



    <html>
        <head><title>Site2 Test</title></head> 
        <body>
                site2.examplesite.net is working. 
        </body> 
    </html> 


Hierna moeten beide websites ingesteld worden met de eigen certificaten en documenten root.

De websites aanzetten

Voor het aanzetten van de websites zorgt u ervoor dat alle virtuele host instellingen kloppen en aan staan en/of aan te zetten.

  • Herstart de Apache webserver
  • Herstart Apache voor het toepassen van de gewijzigde instellingen.
  • Zorg er na de herstart voor dat Apache zowel voor de beveiligde als standaard verbinding gebruikt maakt van het 'netstat' commando. De 'grep' aan het einde van het commando zoekt naar de procesnaam:
    sudo netstat -tnlp | grep apache
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN  :9965/apache2
    tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN  :9965/apache2


Als de webserver alleen gebruik maakt van poort 80 en niet van 443, controleer dan in het configuratiebestand of mod_ssl goed is geïnstalleerd en ingeschakeld.

De onbeveiligde website zou nu bereikbaar moeten zijn via:

    http://www.examplesite.net

Apache werkt correct als u 'www.examplesite.net is working' ziet.

Bezoek vervolgens de beveiligde websites via een voor SNI geschikte webbrowser om de beveiligde verbindingen te controleren:

    https://site1.examplesite.net
    https://site2.examplesite.net

Controleer of de browser een beveiligde verbinding weergeeft (dit is doorgaans het symbool van een 'slotje'), en of de test index pagina wordt weergegeven. Via de certificaat eigenschappen in uw browser kunt u controleren of de websites de juiste SSL certificaten gebruiken.

Bij deze set-up is het delen van 1 IP-adres door alle websites het uitgangspunt. Voor het op orde houden van uw omgeving is het ook mogelijk gebruik te maken van 2 IP-adressen: 1 IP-adres voor alle standaard http websites, en 1 IP-adres voor alle https websites met SSL.

SSLCheck

De SSLCheck controleert of je certificaat goed op je server is geïnstalleerd en of er mogelijke problemen zijn.