Verschiedene ssl-Zertifikate an VirtualHosts binden

Mi 16.September 2009 von Uwe Kommentieren »
Heather

Nachdem der Tobi 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.
Tobi hatte die Sache ganz elegant mittels SNI-Patch gelöst. 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, – 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 >
  ServerAlias www.perl-online.com
  Include ....
....
  Include /etc/apache2/sites-available/SSL/www.perl-online.com.inc.conf
</VirtualHost>
...
....
<VirtualHost *:443 >
  ServerAlias 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/www.perl-online.com.inc.conf:

<IfModule mod_gnutls.c>
    GnuTLSEnable on
    GnuTLSPriorities      NORMAL:!DHE-RSA:!DHE-DSS:!AES-256-CBC:%COMPAT
    GnuTLSCertificateFile /etc/ssl/www.perl-online.com/server-caCert.crt
    GnuTLSKeyFile         /etc/ssl/www.perl-online.com/server_0pass.key
</IfModule>
 
<IfModule mod_ssl.c>
<IfModule !mod_gnutls.c>
  SSLEngine on
  SSLCertificateFile      /etc/ssl/certs/ca-certificates.crt
  SSLCertificateKeyFile   /etc/ssl/www.perl-online.com/server_0pass.key
</IfModule>
  SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
  SSLCertificateChainFile /etc/ssl/www.perl-online.com/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/www.perl-online.com/server.crt
  SSLCertificateFile      /etc/ssl/www.perl-online.com/server-caCert.crt
  SSLCertificateKeyFile   /etc/ssl/www.perl-online.com/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>
Hermannsdenkmal

Bei 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 Bowser 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!

Zeche Osterfeld und der Gasometer

-Falls 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. Root Certificate (PEM Format) für Mozilla und Verwandte
  2. Internet Explorer 5.x/6.x
  3. Root Certificate (DER Format) für Intenet Explorer
Schlagworte:, ,

Hinterlasse eine Antwort