Virtual hosting met meerdere SSL certificaten

Het is algemeen bekend dat het niet mogelijk is om meerdere domeinen op een name-based virtual hosting server (met maar één ip) te voorzien van een eigen SSL certificaat. Vandaag kwam ik er echter achter dat dit wél kan, maar dat de server én de client dan wel aan een aantal eisen moeten voldoen.

Het idee achter een name-based virtual hosting server, is het hosten van meerdere domeinen vanaf één ip-adres. Een overweging die vooral vanuit kosten oogpunt interessant kan zijn. Deze methode heeft echter een nadeel: wanneer je gebruik wil maken van SSL om een beveiligde verbinding tussen client en server op te zetten, kan dit maar voor één domein op de server.

Internet verkeer wordt gerouteerd op basis van ip-adressen en poortnummers (OSI laag 3). Wanneer je in je browser een website wil bezoeken, wordt er een HTTP-request naar de server gestuurd. Nadat dit HTTP-request bij de server is aangekomen wordt het intern doorgezet naar de webserver applicatie (bijvoorbeeld Apache). De webserver kijkt vervolgens in de header van het HTTP-request naar de host (OSI laag 7) en bepaald aan de hand van deze waarde welke website de client wil bezoeken.

Het probleem ontstaat echter wanneer er voorafgaand aan HTTP-verkeer, eerst een versleutelde SSL verbinding opgezet moet worden. Er komt dan namelijk een “zullen-we-een-ssl-verbinding-opzetten”-verzoek binnen bij de webserver (OSI laag 6), maar de webserver kan uit dat bericht niet afleiden welk domein de client wil bezoeken. Met als gevolg dat de webserver ook niet weet welk SSL certificaat er gekozen moet worden voor het opzetten van de versleutelde verbinding. Elk domein heeft namelijk een eigen certificaat.

Ergens kon ik mij niet voorstellen dat er voor dit probleem geen oplossing bestond. Daarom ging ik eerst met behulp van tshark (commandline versie van Wireshark) de berichten van een SSL-handshake analyseren. Op deze manier kwam ik erachter dat wanneer ik in Windows XP Pro de browser Firefox (versie 3.0.1) gebruik, elk derde frame (het client hello bericht) de extension “server_name” bevatte. In RFC3546 lees ik hierover het volgende:

It is RECOMMENDED that clients include an extension of type “server_name” in the client hello whenever they locate a server by a supported name type.

A server that receives a client hello containing the “server_name” extension, MAY use the information contained in the extension to guide its selection of an appropriate certificate to return to the client, and/or other aspects of security policy.

Deze extension is ook bekend onder de naam Server Name Indication (SNI). En ook wikipedia zegt dan het met met SNI mogelijk is, om de webserver het juiste SSL-certificaat te laten selecteren:

An extension to TLS called Server Name Indication (SNI) addresses this issue by sending the name of the virtual host as part of the TLS negotiation[1]. This enables the server to “switch” to the correct virtual host early and present the browser with the certificate containing the correct CN.

Deze functionaliteit is geen standaard onderdeel van een webserver, maar kan wel worden toegevoegd. De reden dat mijn server op dit moment maar één SSL-certificaat kan gebruiken, is omdat apache2 (nog) niet kan omgaan met SNI. Daarvoor zal ik eerst een module (mod_gnutls of openSSL library vanaf versie 0.9.8f) moeten installeren.

Ook las ik dat er een vrij nieuwe browser nodig is om dit te laten werken. Het blijkt dat Firefox vanaf versie 2.0 ondersteuning biedt voor SNI. Maar Internet Explorer 7 doet dat bijvoorbeeld alleen wanneer het draait op Vista (of nieuwer). Dat heb ik meteen maar even getest en inderdaad; bij het gebruik van Internet Explorer 7 onder Windows XP Pro, bevat het derde frame (client hello) niet de extension “server_name”.

Kortom, op internet kun je er nog niet vanuit gaan dat elke client of server deze functionaliteit gebruikt. Grote kans dat bijvoorbeeld iemand je SNI-ready server bezoekt met een browser die SNI niet ondersteund. En dan werkt het natuurlijk niet. Maar in een private infrastructuur, waar je eisen kunt stellen aan de omgeving, biedt deze functionaliteit absoluut mogelijkheden.

Afbeelding van ZDNET.

0 antwoorden

Plaats een Reactie

Meepraten?
Draag gerust bij!

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.