Die Zertifikate einer eigenen CA (siehe miniHowTo: Eigene CA und Zertifikate erstellen - Teil 1) sollen jetzt in den Apache Webserver integriert werden.
Lokaler Apache - Standardinstallation
Die Zertifikate werden standardmässig unter /etc/apache2/ssl installiert.
Im 1. Teil wurden die Zertifikate für apache erstellt, diese finden sich in den Verzeichnissen certs bzw. private:
- Code: Alles auswählen
server:~/sslCA# ls -l certs/ private/
certs/:
insgesamt 8
lrwxrwxrwx 1 root root 14 2005-11-01 21:28 1fc24127.0 -> apacheCert.pem
lrwxrwxrwx 1 root root 13 2005-11-01 21:27 46ecc354.0 -> ../cacert.pem
-rw-r--r-- 1 root root 1164 2005-11-01 21:28 apacheCert.pem
-rw-r--r-- 1 root root 643 2005-11-01 21:28 apacheReq.pem
private/:
insgesamt 8
-rw------- 1 root root 887 2005-11-01 21:27 apacheKey.pem
-rw-r--r-- 1 root root 1743 2005-11-01 21:26 cakey.pem
server:~/sslCA#
Im Verzeichnis certs wurde jeweils ein Link angelegt, der dem Hash-Wert des verlinkten Zertifikates entspricht. Apache sucht Zertifikate zum Teil über diesen Namen. Das File certs/apacheReq.pem ist der Antrag des apache-Zertifikates (das File wird meines Wissens nicht mehr benötigt).
Im Verzeichnis private finden sich die zugehörigen Schlüssel der Zertifikate, hier also apacheKey.pem.
Zertifikate in Apache integrieren
- Code: Alles auswählen
server:~/sslCA# mkdir /etc/apache2/ssl/ssl.crt /etc/apache2/ssl/ssl.crl
server:~/sslCA# cp certs/apacheCert.pem private/apacheKey.pem /etc/apache2/ssl
server:~/sslCA# ln -sf apacheCert.pem /etc/apache2/ssl/1fc24127.0
server:~/sslCA# cp cacert.pem /etc/apache2/ssl/ssl.crt/cacert.crt
Die Zertifikate samt der Schlüssel werden in das Apache SSL-Verzeichnis kopiert. Den Hash-Link setzen wir zusätzlich als Link. Das Zertifikat der CA selbst wird in das Unterverzeichnis ssl.crt kopiert. Im Unterverzeichnis ssl.crl werden von Apache später die zurückgezogenen Zertifikate gesucht.
Mit den folgenden SSL-Direktiven (Einträgen im entsprechenden Abschnitt der Konfigurationsdateien) werden die Zertifikate dem Apache bekannt gegeben:
- Code: Alles auswählen
...
NameVirtualHost *:443
<VirtualHost *:443>
...
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apacheCert.pem
SSLCertificateKeyFile /etc/apache2/ssl/apacheKey.pem
SSLCACertificatePath /etc/apache2/ssl/ssl.crt
SSLCACertificateFile /etc/apache2/ssl/ssl.crt/cacert.crt
SSLCARevocationPath /etc/apache2/ssl/ssl.crl
...
</VirtualHost>
Diese Einträge habe ich (Standardkonfiguration, z.B. /etc/apache2/sites-enabled/000-default) in die Konfiguration der Default-Site eingefügt, indem ich den vorhandenen <VirtualHost> Abschnitt (für den Standard Port 80) kopiert habe, und dann auf den Port 443 (https) geändert habe.
Nach einem Reload der Konfiguration kann auf die Webseite über https://server.home.local veschlüsselt zugegriffen werden.
- Code: Alles auswählen
server:~/sslCA# /etc/init.d/apache2 reload
Reloading web server config...done.
server:~/sslCA#
Zertifikate verifizieren - bzw. im Browser bekanntgeben
Da das Root-Zertifikat unserer CA dem Browser noch nicht als Vertrauenswürdig bekannt ist, wird beim Aufruf der Seite eine Warnung ausgegeben:

Import des CA-Root-Zertifikates in den Browser
Durch den Import des CA-Root-Zertifikates cacert.pem wird unsere eigene CA als vertrauenswürdig eingestuft. Damit entfallen diese Warnungen zukünftig (natürlich in dem Browser, in dem das Zertifikat installiert wurde).
Das macht man den Anwendern am einfachsten, indem man das Zertifikat cacert.pem umbenennt (cacert.crt), und auf der Website zum Download zur Verfügung stellt. In der Standard-Konfiguration ist das z.B. im Verzeichnis /var/www/apache2-default/.
- Code: Alles auswählen
server:~/sslCA# cp cacert.pem /var/www/apache2-default/cacert.crt
server:~/sslCA#
Ruft man im Browser diese URL (http://server.home.local/cacert.crt) auf, öffnet sich der Download Dialog. Mit "Öffnen" gelangt man in den Assistenten, der das CA-Root-Zertifikat im Browser installiert.
Weitere Hinweise
Man benötigt für jede mögliche Server-Adresse der URL (Servername/FQDN, Servername kurz oder IP-Adresse) ein eigenes Zertifikat, in welchem der CommonName (CN) auf genau diesen Wert (Servername, IP-Adresse etc.) gesetzt ist. Ansonsten erscheint ebenfalls eine Warnung, das der Servername nicht mit dem Zertifikat übereinstimmt - der 2.te grüne Haken in obigen Bild ist dann ebenfalls ein gelbes Warndreieck.
D.h. dass für einen Apache-Server in einer UML, welcher aus dem Internet z.B. über einen DynDNS Eintrag über den Namen ansprechbar sein soll, ein eigenes Zertifikat mit dem DynDNS-Namen (z.B. ctserver.dyndns.org) ausgestellt sein muss. Da ich den Server auch aus dem LAN ansprechen möchte, erstelle ich zusätzlich je ein Zertifikat mit dem Servernamen, mit dem es aus dem internen LAN angesprochen wird (z.B. dmzserver.home.local oder kurz dmzserver).
Die unterschiedlichen Zertifikate können mit mehreren <VirtualHost> Abschnitten bekannt gegeben werden:
- Code: Alles auswählen
NameVirtualHost *:80
<VirtualHost *:80>
... # Standard Konfig ohne SSL
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
ServerName ctserver.dyndns.org
ServerAdmin webmaster@ctserver.dyndns.org
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apacheDYNDNSCert.pem
SSLCertificateKeyFile /etc/apache2/ssl/apacheDYNDNSKey.pem
...
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
ServerName dmzserver.home.local
ServerAdmin webmaster@home.local
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apacheFQDNCert.pem
SSLCertificateKeyFile /etc/apache2/ssl/apacheFQDNKey.pem
...
</VirtualHost>
NameVirtualHost *:443
<VirtualHost *:443>
ServerName dmzserver
ServerAdmin webmaster@home.local
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apacheCert.pem
SSLCertificateKeyFile /etc/apache2/ssl/apacheKey.pem
...
</VirtualHost>



