Namebased SSL Apache
In diesem Artikel beschreibe ich, wie man name based ssl virtual hosts auf einem Ubuntu Server einrichten kann. Namensbasierte VirtualHosts sind bei SSL grundsätzlich nicht möglich und müssen IP-basiert erfolgen, d. h. pro vHost eine eigene IP. Es gibt allerdings einen kleinen Workaround. Mit folgendem Beispiel möchte ich die Einrichtung beschreiben.
Vorbereitung
Bevor man loslegt, sind bestimmte Sachen zu beachten. Der Server sollte auf jeden Fall einen FQDN haben, also einen vollständigen Namen und eine feste IP-Adresse. In diesem Tutorial wurden folgende Werte verwendet:
- IP: 192.168.0.50
- FQDN: nbssl.localdomain
- vHost1: subdomain1.nbssl.localdomain
- vHost2: subdomain2.nbssl.localdomain
Wenn man von einem anderen PC auf diesen Server über den Namen zugreifen möchte, ist ein Eintrag in der /etc/hosts
fällig.
Apache
Zunächst einmal benötigt man einen Webserver, z. B. apache2. Da ich das ganze auf einem Ubuntu 10.10 x64 gemacht habe, ist die Installation ziemlich simpel:
apt-get install apache2
Jetzt noch eben php5 installieren (ist für die Realisierung aber nicht zwingend erforderlich)
apt-get install php5
Apache2 starten
service apache2 start
URL im Browser öffnen und prüfen, ob der Apache funktioniert. Es sollte eine Seite mit "It works!" angezeigt werden
http://nbssl.localdomain
Nun legen wir noch den entsprechenden Content an. Dazu gehen wir in das Verzeichnis /var/www/
mkdir subdomain1
mkdir subdomain2
In beiden Ordnern platzieren wir eine index.php. Einmal lassen wir subdomain1 ausgeben und einmal subdomain2.
<?php
echo "subdomain1";
?>
GnuTLS
GnuTLS tritt an Stelle von mod_ssl. Das Paket ist in den Repositories und kann folgendermaßen installiert werden:
apt-get libapache2-mod-gnutls
Nun deaktiviert man das Standard-SSL
a2dissite mod_ssl
und aktiviert GnuTLS
a2enmod gnutls
Damit die Änderungen aktiv werden, einen Reload ausführen
service apache2 reload
Wenn man noch keine SSL-Zertifikate hat, ist nun der richtige Zeitpunkt, welche zu erzeugen. Das passiert mit folgendem Befehl:
mkdir /etc/apache2/ssl
openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/subdomain1.crt -keyout /etc/apache2/ssl/subdomain1.key
Bei common-name die entsprechende Domain eintragen, hier subdomain1.nbssl.localdomain. Jetzt noch ein weiteres Zertifikat für die andere Domain erzeugen
openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/subdomain2.crt -keyout /etc/apache2/ssl/subdomain2.key
und bei common-name wieder die entsprechende Domain eintragen, hier subdomain2.nbssl.localdomain.
VirtualHosts konfigurieren
Ein Großteil der Arbeit ist getan. Jetzt benötigen wir nur noch 2 vHosts. Hierzu wechseln wir ins Verzeichnis /etc/apache2/sites-available/
touch subdomain1
touch subdomain2
Dann fügen wir den beiden Dateien noch einen Inhalt hinzu. subdomain1 bekommt:
NameVirtualHost *:443 <VirtualHost *:443> ServerName subdomain1.nbssl.localdomain ServerAlias subdomain1.nbssl.localdomain ServerAdmin admin@localdomain DocumentRoot /var/www/subdomain1/ GnuTLSEnable On GnuTLSPriorities NORMAL GnuTLSCertificateFile /etc/apache2/ssl/subdomain1.crt GnuTLSKeyFile /etc/apache2/ssl/subdomain1.key </VirtualHost>
und subdomain2 schaut wie folgt aus:
<VirtualHost *:443> ServerName subdomain2.nbssl.localdomain ServerAlias subdomain2.nbssl.localdomain ServerAdmin admin@easycow.de DocumentRoot /var/www/subdomain2/ GnuTLSEnable On GnuTLSPriorities NORMAL GnuTLSCertificateFile /etc/apache2/ssl/subdomain2.crt GnuTLSKeyFile /etc/apache2/ssl/subdomain2.key </VirtualHost>
Hinweis: Diese Option NameVirtualHost *:443
ist zwingend erforderlich und muss bei den SSL-Vhosts ganz oben stehen. Dabei auch beachten, dass dies der erste vHost sein muss, den Apache bearbeitet. Apache sortiert alphanumerisch aufsteigend.
Nun braucht man die vHosts nur noch zu aktivieren
a2ensite subdomain1
a2ensite subdomain2
und die Konfiguration neu zu laden
service apache2 reload
Es sollten hier keinerlei Fehler oder Warnungen ausgegeben werden.
Test
Nun testen wir, ob die Installation erfolgreich war. Da ich eine Serverinstallation ohne Desktopumgebung verwendet habe, musste ich von einem anderen Client aus testen. Hierfür waren Einträge in der /etc/hosts
notwendig. Rufen wir doch mal die subdomain1 auf:
https://subdomain1.nbssl.localdomain
Die Zertifikatswarnungen bitte ignorieren. Diese sind bei self-signed Zertifikaten normal. Wenn alles nach Plan verläuft sollte der Browser
subdomain1
ausgeben. Nun rufen wir die subdomain2 auf:
https://subdomain2.nbssl.localdomain
hier wieder die Zertifikatswarnungen ignorieren. Der Browser sollte jetzt
subdomain2
ausgeben. Mit etwas Glück hat es auf Anhieb geklappt. Gratulation!
Links
http://www.der-eremit.de/ssl-enabled-name-based-virtual-hosts-with-mod_gnutls/
http://www.administrator.de/Gnutls_und_vhosts_SSL_hosting.html