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.
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> |
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 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 .... ...
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.
- Für Windows-User ist es am einfachsten das Windows Installationspaket zu nutzen
- 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.
Hinterlasse einen Kommentar