Apache - Server Name Indication (SNI)

Server Name Indication (SNI) er en funktion der udvider SSL og TLS- protokollen, sådan at de angiver hvilken hostname klienten forsøger at forbinde sig med ved starten af handshaking process'en. Dette gør det muligt for serveren at præsentere flere certifikater og derfor bliver det muligt at forbinde flere forskellige SSL sikrede hjemmesider til en IP-adresse og port (port 443). Brug af SNI eliminerer nødvendigheden af at skulle bruge separate IP-adresser til hver enkelt SSL sikrede hjemmeside på en webserver.

Denne vejledning beskriver konfigurationen af to hjemmesider som bruger SSL: site1.examplesite.net og site2.examplesite.dk. Begge hjemmesider bruger den samme IP-adresse, men har også hver deres eget SSL certifikat. På den samme IP-adresse konfigurerer vi også en hjemmeside som ikke bruger SSL: www.examplesite.net. Den hjemmeside som ikke bruger SSL, bruger port 80 i stedet for port 443.

Apache webserver 2.2.12+ med mod_ssl og OpenSSL aktiveret er påkrævet.

Hvis der bruges Ubuntu 10.04+ eller Fedora 10 på serveren bliver SNI allerede understøttet som standard af Apache og OpenSSL. Hvis man bruger Red Hat Enterprise Linux, CentOS 5.x eller Debian 5.x er det måske nødvendigt at kompilere Apache og OpenSSL fra kilden. SNI bliver understøttet fra Apache version 2.2.12 og i OpenSSL fra version 0.9.8f.

Browser Kompatibilitet

SNI-kompatible browsere er påkrævet på kundens side, for SNI baserede servere til at sende det rigtige certifikat. Hvis en browser ikke er kompatibel, vil kunden blive vist en advarsel om ikke-betroet certifikat.

Vær opmærksom på, at Internet Explorer (alle versioner) på Windows XP ikke understøtter SNI. De seneste versioner af Internet Explorer på Windows Vista og Windows 7 understøtter SNI, sammen med de seneste versioner af Firefox, Chrome og Safari.

Instruktioner

  • Vær sikker på at mod_ssl i Apache er aktiveret (enten ved afkommentering de nødvendige linjer i httpd.conf eller ved hjælp af "a2enmod" på Ubuntu eller Debian). Som standard er mod_ssl aktiveret ved de fleste installationer af Apache.
  • Vær sikker på at Apache lytter på port 443 (til sikre forbindelser), og at du bruger navn-baserede virtuelle hosts på denne port.
  • Tag til 'IfModule mod_ssl.c' blokken. Denne står separat fra dine Apache indstillinger i hovedfilen httpd.conf, i filen ports.conf eller i et bestemt mod_ssl fil.

I denne blok finder du den følgende linje:

Listen 443

Tilføj følgende i samme mod_ssl.c blokken:

NameVirtualHost *:443

Denne linje fortæller Apache at den skal bruge navn-baserede virtuelle hosts på den sikrede port.

Bemærk: Da vi også indstiller en VirtualHost til port 80 (www.examplesite.net), skal linjen 'NameVirtualHost *:80' også tilføjes til dine Apache indstillinger. For at kunne gøre dette bruger du ports.conf til Ubuntu og Debian, og httpd.conf i de fleste andre tilfælder.

Virtuele Hosts

Til denne del af vejledningen bruges der separate submapper af test brugerens rodmappe. Opret først mappen til domænerne:

   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}

Herefter tager du til Apache konfigurationsmappen for at indstille VirtualHost'en.

Indstillinger usikre hjemmesider

Her vises indstillingerne til den usikre hjemmeside:

<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>

Disse indstillinger bruges af Apache til at forbinde 'www.examplesite.net' med port 80.

Indstilling sikrede hjemmesider

Indstilling sikrede hjemmesider 1

Opret en konfigurationsfil til den første af de to sikrede hjemmesider; site1.examplesite.net. Konfigurationsfilen ligner den af standard VirtualHost'en. Dog bruger site1.example.net port 443, og vi tilføjer SSL indstillinger til sidst i filen:

<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>

Bemærk at site1.pem er certifikatfilen, og site1.key er nøglefilen.

Indstilling til sikrede hjemmeside 2

Ligesom til hjemmeside 1, bliver VirtualHost filen til site2.examplesite.net som følgende:

<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>

Til site2.example.net bruger du andre certifikat- og nøglefiler, nemlig site2.pem og site2.key.

Baseret på disse indstillinger bruger site2.examplesite.net også port 443. Hvis der er en enkelt offentlig IP-adresse på serveren betyder dette at begge sikrede sider deler denne IP-adresse. Uden brug af SNI ville dette ikke være muligt.

Test sider

Til afslutning af installationen kan du oprette indeks sider for at kunne teste hjemmesiderne.

Opret indeks siden til den usikre hjemmeside på:

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

Tilføj følgende til filen:

<html>
  <head><title>WWW Test</title></head>
  <body>

www.examplesite.net is working.

  </body>
</html>

Placeringen af filen til site1.examplesite.net bør være:

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

Tilføj følgende til filen:

<html>
  <head><title>Site1 Test</title></head>
  <body>

site1.examplesite.net is working.

  </body>
</html>

Placeringen af filen til site2.examplesite.net bør være:

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

Indholdet til filen:

<html>
  <head><title>Site2 Test</title></head>
   <body>

site2.examplesite.net is working.

  </body>
</html>

Nu skal begge hjemmesider indstilles med deres eget certifikat og dokument root.

Aktiver hjemmesiderne

For at aktivere hjemmesiderne skal der sikres at alle VirtualHost indstillinger er korrekte og aktiveret (hvis ikke, så skal de aktiveres).

  • Genstart Apache webserveren
  • Genstart Apache til at anvende de ændrede indstillinger.
  • Sørg for at 'netstat' kommandoen bliver brugt efter genstarten bliver brugt til både den sikrede forbindelse og standard forbindelsen. Delen 'grep' til sidst af kommandoen leder efter procesnavnet:
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    

Hvis webserveren kun lytter på port 80 og ikke 443, så skal der i konfigurationsfilen kontrolleres at mod_ssl er blevet installeret korrekt og at den er aktiveret.

Den usikre hjemmeside burde nu kunne tilgås igennem:

http://www.examplesite.net

Apache virker som den skal hvis meddelelsen 'www.examplesite.net is working' vises.

Herefter besøger du de sikrede hjemmesider igennem en browser som understøtter SNI for at kontrollere de sikrede forbindelser:

https://site1.examplesite.net

https://site2.examplesite.net

Kontroller om browseren viser at forbindelsen er sikret ('hængelås' symbolet), og test at indeks siden bliver vist. Igennem certifikat egenskaber i browseren kan du kontrollere om hjemmesiderne bruger de rigtige SSL certifikater.

Ved denne setup er udgangspunktet at der er 1 IP-adresse til alle hjemmesider. For at holde orden i dit miljø er der også muligt at bruge to IP-adresser: en IP-adresse til alle standard http hjemmesider, og en IP-adresse til alle https hjemmesider som bruger SSL.

SSLCheck

SSLCheck kontrollerer, om dit certifikat er korrekt installeret på din server og om der potentielt er problemer.