Mehrere SSL-Zertifikate unter Apache auf derselben IP-Adresse nutzen

SNI (Server Name Indication) – eine Erweiterung des TLS-Standards (Transport Layer Security) – ermöglicht es, mehrere SSL-Zertifikate auf einer IP-Adresse zu nutzen. Da der verschlüsselte Verbindungsaufbau zwischen Server und Client bereits stattfindet, bevor die angefragte URL übertragen wird, ist es mit TLS 1.0/SSL-Verschlüsselung nicht möglich, mehrere Domains unter einer IP-Adresse zu nutzen (Virtual-Hosts). Der Grund hierfür ist, dass der Server nicht weiß, welches Zertifikat – das immer nur für eine Domain gilt – benutzt werden muss, da die Möglichkeit von Virtual-Hosts bei der Definition von SSL/TLS nicht vorgesehen wurde. Durch SNI wird die Domain im server_name-Parameter bereits beim Verbindungsaufbau übergeben, sodass der Server das passende Zertifikat auswählen und beim TLS-Handshake verwenden kann.

Um dank SNI mehrere SSL-Zertifikate unter Apache auf der selben IP-Adresse zu nutzen, müssen Sie sich zunächst für jede Ihrer Domains ein SSL-Zertifikat erwerben. Hier empfehle ich caCert, eine Zertifizierungsstelle, die kostenlos ist und auf gegenseitigem Vertrauen basiert.

Es ist sinnvoll, die SSL-Virtual-Hosts in eine eigene Datei wie bspw. /etc/apache2/http.conf auszulagern. Dort müssen Sie nun für jede gewünschte Domain einen entsprechenden Virtual-Hosts anlegen. Sollte versucht werden, per SSL auf eine Domain zuzugreifen, für die kein SSL-Zertifikat in Ihrer SNI-Liste existiert, wird immer das SSL-Zertifikat des ersten Virtual-Hosts in der Liste verwendet und ggf. in der Fehlermeldung angezeigt.

Dazu wird folgende Einstellung in /etc/apache/httpd.conf vorgenommen:

SSLStrictSNIVHostCheck off

Dann eine Datei für die SSL-Konfiguration unter /etc/apache2/sites-enabled/ssl anlegen:

NameVirtualHost *:443

<VirtualHost *:443>
        ServerName www.excample1.com
        DocumentRoot /srv/www/project1
        SSLEngine on
        SSLCertificateKeyFile /etc/ssl-cacert/apache/apache_private1.key.decrypted
        SSLCertificateFile /etc/ssl-cacert/apache/apache_server1.crt
</VirtualHost>

<VirtualHost *:443>
        ServerName www.excample2.de
        DocumentRoot /srv/www/project2
        SSLEngine on
        SSLCertificateKeyFile /etc/ssl-cacert/apache/apache_private2.key.decrypted
        SSLCertificateFile /etc/ssl-cacert/apache/apache_server2.crt
</VirtualHost>

Die neue VirtualHost-Konfiguration muss noch aktiviert werden:

a2ensite ssl

Nun noch den Apache-Server mit "force-reload" neu starten:

service apache2 force-reload