2

Mehrere SSL Zertifikate auf einem Server / einer IP

Gestern hatte ich ja bereits beschrieben, wie man seinen Root Server mit einem kostenslosen SSL Zertifikat ausstatten kann. Heute führen wir das ganze noch ein wenig weiter, in dem wir für jeden VHost ein eigenes Zertifikat anlegen, also namebased SSL Zertifikate. Das war vor einiger Zeit noch ein großes Problem, da Zertifikate nicht namensbasiert ausgeliefert werden konnten. Eine Erklärung dafür liefert die Apache Webseite:

The reason is very technical, and a somewhat “chicken and egg” problem. The SSL protocol layer stays below the HTTP protocol layer and encapsulates HTTP. When an SSL connection (HTTPS) is established Apache/mod_ssl has to negotiate the SSL protocol parameters with the client. For this, mod_ssl has to consult the configuration of the virtual server (for instance it has to look for the cipher suite, the server certificate, etc.). But in order to go to the correct virtual server Apache has to know the Host HTTP header field. To do this, the HTTP request header has to be read. This cannot be done before the SSL handshake is finished, but the information is needed in order to complete the SSL handshake phase. Bingo!

Seit Lenny kann man auf einem Debian/Apache System aber die Erweiterung mod_gnutls installieren, mit der namensbasierte SSL Zertifikate ziemlich einfach einzurichten sind.

Als erstes das Paket libapache2-mod-gnutls installieren und aktivieren.

apt-get install libapache2-mod-gnutls
a2enmod gnutls

Dann die Datei /etc/apache2/ports.conf anpassen:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Damit die Zertifikate richtig ausgeliefert werden, die beiden Zeilen in /etc/apache2/mods-available/gnutls.conf hinzufügen:

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl

Und zu guter Letzt noch den VHost Eintrag ein wenig abändern:

    GnuTLSEnable On
    GnuTLSCertificateFile /webuser/conf/ssl/udo-telaar.de.crt
    GnuTLSKeyFile /webuser/conf/ssl/udo-telaar.de.key
    GnuTLSPriorities SECURE:!MD5

Server neu starten und schon sollte es funktionieren. In meinem Fall laufen jetzt dieser Blog und mein Bowling Forum mit gültigem SSL Zertifikat.

Nachtrag: Die Angabe des SSLCertificateChainFile fehlt für GnuTLS, von daher muss man das Intermediate-Zertifikat mit in die normale Zertifikatsdatei packen. Ansonsten kann es passieren, dass Browser eine Warnung ausgeben. Wichtig dabei ist auch die Reihenfolge, zuerst das Server Zertifikat und dann das Intermediate-Zertifikat.

cat udo-telaar.de.crt sub.class1.server.ca.pem > udo-telaar.de.gnutls.crt

Und diese dann entsprechend als GnuTLSCertificateFile im VHost angeben.

  1. SpeedyNo Gravatar sagt:

    Was machst du, wenn du eine dritte Webseite ohne Zertifikat hast? Nimmt er sich dann immer das erste in der conf oder wie muss das aussehen?

    • udoNo Gravatar sagt:

      Jede Seite hat doch eigene Vhost Einträge. Wenn ich für die dritte Seite kein SSL-Zertifikat habe, richte ich dort einfach keinen VirtualHost für den Port 443 ein.