<span class='noindex'><nobr>Hea<span style='font-size:0;visibility: hidden;float:left; background-color:#000000'>ycyg</span>the<span style='font-size:0;visibility: hidden;float:left; background-color:#000000'>ycyg</span>r<span style='font-size:0;visibility: hidden;float:left; background-color:#000000'>ycyg</span><span style='font-size:0;visibility: hidden;float:left; background-color:#000000'>ycyg</span></nobr></span>“ width=“150″ height=“100″ class=“alignleft size-thumbnail wp-image-31407″ /></a>Nachdem der <a href=Toycygbiycygycyg seinen Apache schon länger gepatcht hat und nun verschiedene Server-Zertifikate an verschiedenen VirtualHosts binden kann, muss ich es doch endlich auch einmal versuchen.
Der erste Schritt ist aber jede Menge Zertifikate zu generieren. Und bei der Gelegenheit bin ich auch gleich mal auf CAcert als CA-Authority umgestiegen.
Toycygbiycygycyg hatte die Sache ganz elegant mittels SNI-Patch gelöst. Allerdings ist der Apache, der bei Lenny dabei ist, zu alt dafür und einen neueren Apache selber bauen, hieße dann – ihn auch in Zukunft selber auf den neusten Stand zu halten. Ich habe aber nicht gerade Lust den Apache bei jedem Update neu zu patchen und zu kompilieren. Also versuchte ich es mal nach der Anleitung von George Notaras, mit dem GnuTLS-Modul – bei mir dann allerdings auf Debian.

Als Nächstes (nach dem Zertifikate generieren) installieren wir auf dem debian-System das SNI-fähige GnuTLS-Modul für den Apache und aktivieren es auch gleich.:

# apt-get install libapache2-mod-gnutls
...
# a2enmod gnutls

Das ssl-Modul bleibt weiterhin aktiviert – oder wir tun es jetzt (a2enmod ssl).

Nun geht es an die Konfiguration der virtuellen Hosts. Folgende Schnipsel gehören (als Soft-Links) ins Verzeichnis /etc/apache2/sites-enabled:

....
<VirtualHost *:443 >
  ServerName  www.perl-online.com
  Include ....
....
  Include /etc/apache2/sites-available/SSL/press.19quadrat.de.inc.conf
</VirtualHost>
...
....
<VirtualHost *:443 >
  ServerName  www.osterfeld-biker.de
  Include ....
.....
  Include /etc/apache2/sites-available/SSL/www.osterfeld-biker.de.inc.conf
</VirtualHost>
...

Und so weiter und so fort….
Für die zu includenen Dateien habe ich mir unterhalb von /etc/apache2/sites-available schon noch ein paar Verzeichnisse angelegt. Darin liegn dann auch die speziellen Konfigurationen zu den Zertifikaten:
Datei /etc/apache2/sites-available/SSL/press.19quadrat.de.inc.conf:

<IfModule mod_gnutls.c>
    GnuTLSEnable on
    GnuTLSPriorities      NORMAL:!DHE-RSA:!DHE-DSS:!AES-256-CBC:%COMPAT
    GnuTLSCertificateFile /etc/ssl/press.19quadrat.de/server-caCert.crt
    GnuTLSKeyFile         /etc/ssl/press.19quadrat.de/server_0pass.key
</IfModule>
 
<IfModule mod_ssl.c>
<IfModule !mod_gnutls.c>
  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ca-certificates.crt
  SSLCertificateKeyFile   /etc/ssl/press.19quadrat.de/server_0pass.key
</IfModule>
  SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
  SSLCertificateChainFile /etc/ssl/press.19quadrat.de/cacert.crt
#  SSLCARevocationFile   /etc/ssl/crl/master.crl
</IfModule>

Datei /etc/apache2/sites-available/SSL/www.osterfeld-biker.de.inc.conf:

<IfModule mod_gnutls.c>
    GnuTLSEnable on
    GnuTLSPriorities      NORMAL:!DHE-RSA:!DHE-DSS:!AES-256-CBC:%COMPAT
    GnuTLSCertificateFile /etc/ssl/www.osterfeld-biker.de/server-caCert.crt
    GnuTLSKeyFile         /etc/ssl/www.osterfeld-biker.de/server_0pass.key
</IfModule>
 
<IfModule mod_ssl.c>
<IfModule !mod_gnutls.c>
  SSLEngine on
#  SSLCertificateFile      /etc/ssl/press.19quadrat.de/server.crt
  SSLCertificateFile      /etc/ssl/press.19quadrat.de/server-caCert.crt
  SSLCertificateKeyFile   /etc/ssl/press.19quadrat.de/server_0pass.key
</IfModule>
  SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
  SSLCertificateChainFile /etc/ssl/www.osterfeld-biker.de/cacert.crt
#  SSLCARevocationFile     /etc/ssl/crl/master.crl
</IfModule>

HermannsdenkmalBei mir musste der Apache-User ‚www-run‘ auch noch in die Gruppe der ssl-Benutzer (‚addgroup www-data sslcl‚) um auf die /etc/ssl-Verzeichnisse zugreifen zu können.
Nun brauchen wir nur noch den Apache restarten und es sollte funktionieren. Allerdings können nicht allzu viel Browser mit TLS umgehen. Die Browser die TLS nicht benutzen, erhalten die Seiten weiterhin per SSL verschlüsselt, dann aber mit dem ‚ersten‘ Zertifikat aus der Konfiguration.
Auf der Seite von https://sni.velox.ch/ kann man seinen Browser auf die TLS-Fähigkeit testen.

Nachtrag:
Ein Problem fiel dann in den log-Files auf. Im error-log gab es jede Menge dieser Zeilen:

...
[Fri Sep 17 22:57:42 2009] [error] [client ::1] GnuTLS: Handshake Failed (-8) 'A record packet with illegal version was received.'
[Fri Sep 17 22:57:44 2009] [error] [client ::1] GnuTLS: Handshake Failed (-8) 'A record packet with illegal version was received.'
...

Und im access-log sahen die zugehörigen Einträge so aus:

...
::1 - - [17/Sep/2009:22:57:42 +0200] "NS * HTTP/1.0" 404 1006
::1 - - [17/Sep/2009:22:57:44 +0200] "NS * HTTP/1.0" 404 1006
...

Aber Google fand dazu eine passende Lösung auf blog.px. ‚Einfach‘ die Datei /etc/apache2/ports.conf anpassen und die Definitionen der Ports ohne Verschlüsslung hinter die Ports mit SSL setzten. (Nicht Vergessen den Apache neu zu starten):

...
# README.Debian.gz
 
<IfModule mod_ssl.c>
    NameVirtualHost *:443
    # SSL name based virtual hosts are not yet supported, therefore no
    # NameVirtualHost statement here
    Listen 443
</IfModule>
 
NameVirtualHost *:80
Listen 80

2.Nachtrag (ToDo):
Gerade habe ich noch gelesen, dass der Apache 2.2.12 oder später mit mod_ssl, openssl >= 0.9.8f auch ohne das GunTLS-Modul mit SNI umgehen kann. Er benötigt dann lediglich einen zusätzlichen Schalter SSLStrictSNIVHostCheck in der Konfiguration. Leider läuft bei mir noch nicht die Version 2.2.12. :-( Aber aufgeschoben ist nicht aufgehoben!
Wichtig sind dann aber folgende Punkte:

  • Im config-File /etc/apache2/ports.conf erst die ssl-Ports und dann die ‚restlichen‘ Ports definieren.:
    ...
    <IfModule mod_ssl.c>
        NameVirtualHost *:443
        Listen 443
    </IfModule>
     
    NameVirtualHost *:80
    Listen 80

    Manchmal stehen die „NameVirtualHost„-Eintäge auch in einer ‚*default*‘-Datei im „/etc/apache2/sites-enabled/„-Verzeichnis. Doppelte Deklaration funktioniert zwar, beim Apache-Start erhält man aber einen Warnhinweis.

  • In den „/etc/apache2/sites-enabled/0x****.conf„-Files für jedes ssl-Zertifikat eine eigene VirtualHost-Deklaration zu erstellen. Diese muss (sollte) _genau_ eine Zeile „ServerName …“ und beliebig viele (aber besser wenige bis keine) „ServerAlias …“ -Zeilen enthalten:
    ...
    <VirtualHost *:443>
      ServerName  www.perl-online.com
      ServerAlias www
      ServerAlias web.deinhost.de
      ServerAlias web
      Include /etc/apache2/sites-available/SSL/press.19quadrat.de.SSL.inc.conf
      Include /etc/apache2/sites-available/web.inc.conf
    </VirtualHost>
     
    <VirtualHost *:443>
      ServerName  www.osterfeld-biker.de
      Include /etc/apache2/sites-available/SSL/www.osterfeld-biker.de.SSL.inc.conf
      Include /etc/apache2/sites-available/web.inc.conf
    </VirtualHost>
    ...
  • Der Parameter „SSLStrictSNIVHostCheck off“ kann auch mit in dem config-File /etc/apache2/ports.conf stehen oder wie bei mir, in den „/etc/apache2/sites-available/SSL/www.***.**.SSL.inc.conf„-Files definiert sein:
    ...
    <IfModule mod_ssl.c>
      SSLEngine on
      SSLStrictSNIVHostCheck off
      SSLCACertificateFile    ....
    ...

Zeche Osterfeld und der GasometerFalls dein Browser das Root-Zertifikat der CAcert nicht kennt, Du es aber installieren möchtest, kannst Du das auf der CAcert-Seite Root Certificate erledigen.

  1. Für Windows-User ist es am einfachsten das Windows Installationspaket zu nutzen
  2. oder man installiert sowohl das Root-Zertifikat als auch das Zwischenzertifikat der CAcert-Gemeinschaft

Außerdem benutze ich auch ein StartCom-Zertifikat. Eventuell fehlende Zertifikate können von der Webseite bezogen werden. Dort gibt es auch ein paar Installationsanleitungen.