Namebased SSL Apache

Aus Cowwwiki
Version vom 20. Mai 2015, 18:05 Uhr von Benjaminfras (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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.


Hinweis: Ab Apache v2.2.12 und OpenSSL v0.9.8 ist es dank SNI auch mit mod_ssl möglich, mehrere VirtualHosts mit unterschiedlichen Zertifikaten als SSL zu hosten. Siehe Namebased SSL Apache SNI


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:

  1. IP: 192.168.0.50
  2. FQDN: nbssl.localdomain
  3. vHost1: subdomain1.nbssl.localdomain
  4. 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