Client Zertifikate für Apache Anwender

Es gibt in einigen Firmen Vorgaben bestimmte WEB-Anwendungen in öffentlichen Raum besonders zu schützen. Die Internetadresse sollte von dem Mitarbeiter eine Firma von intern als auch von extern erreichbar sein.
Wegen der Wichtigkeit der Daten reicht es nicht aus, dass die WEB-Seite nur mit Login Daten, Benutzernamen und Passwort geschützt wird. In so einem Fall werden Client Zertifikate für die WEB-Anwendung gebraucht. Nur die Anwender, die einen Client-Zertifikat auf dem Geräte haben, können die Seite von diesem Gerät aufrufen und sich dann anmelden.

Die Vorgehensweise der Konfiguration ist für den internen als auch externen gebracht gleich. Die Domain bzw. Subdomain muss in DNS eingetragen sein.
Es wird davon ausgegangen, dass wir die Domain: mydomain1.firma.lan mit einem Client-Zertifikat schützen möchten. Außerdem wollen wir einen Server in der DMZ der Firma nutzen. Aus diesem Grund brauchen wir nicht unbedingt ein Zertifikat, der von einer Zertifizierungsstelle bestätigt wird. Wir können auch selbst ein Zertifikat erstellen und selbst bestätigen.

Punkt
Es wird angenommen, dass auf dem WEB-Server mit dem Apache Dienst die Server-Zertifikate für die Domain mydomain1.firma.lan erstellt sind und ein VirtualHost konfiguriert ist. Die Erstellung der Server-Zertifikate wurde im Artikel SSL-Zertifikate beschrieben und die Konfiguration des VirtualHost (noch ohne Client-Zertifikat) kann man im Artikel Virtual Hosts finden.
Die Web-Seite https://mydomain1.firma.lan kann man in Browser aufrufen und das Zertifikat ist gültig.
Das CA-Zertifikat haben wir vorher auf unserem Gerät importiert.
Punkt
Wir haben folgende Ausgangssituation (bisherige Einstellungen)
      • die CA- und Serverzertifikate befinden sich im Ordner /etc/apache2/cert
      • Ordner der Zertifikats-Store auf dem Debian Server ist der Ordner /etc/ssl/certs
      • der CA Zertifikat wurde schon auf den Clients importiert.
      • Die Web-Seite https://mydomain1.firma.lan kann man auf dem Client aufrufen
        und das Zertifikat ist gültig
      • die VirtualHost-Datei für die Domain mydomain1.firma.lan sieht folgendermaßen aus

    <VirtualHost  *:443>
         ServerAdmin webmaster@mydomain1.firma.lan
         DocumentRoot /var/www/html/mydomain1
         ServerName mydomain1
         ServerAlias mydomain1.firma.lan

         SSLEngine on
         SSLCertificateFile /etc/apache2/cert/mydomain1.firma.lan.crt
         SSLCertificateKeyFile /etc/apache2/cert/mydomain1.firma.lan.key

         ErrorLog /var/log/apache2/mydomain1.firma.lan_error_log
         CustomLog /var/log/apache2/mydomain1.firma.lan_access_log common
    </VirtualHost>
Punkt
Die Datei /etc/ssl/openssl.cnf wird angepasst. Der dir Ordner in Bereich [ CA_default ] wird für unsere Bedürfnisse angepasst. Wir tragen den gewünschten Pfad ein.

 

# statt
dir = ../demoCA
 
# ... wird dieser Ordner definiert.
dir = /etc/apache2/cert/myClientCert
Punkt
Auf Shell-Ebene der Ordner wird gewechselt.

 

# cd /etc/apache2/cert/myClientCert
Punkt
In diesem Ordner werden weitere Ordner und Dateien ertsellt

 

# mkdir -p newcerts && mkdir certs && mkdir crl && echo 00 > serial && touch index.txt
Punkt
Wir erstellen ein Key für unseren ersten Benutzer. Den Namen können wir frei wählen. Ich kombiniere es immer mit der Domain und Benutzername.

 

# openssl genrsa -out mydomain1_client1.key 4096
Punkt
Für den erstellten Client-Key erstellen wir nun eine CSR Zertifikatsanforderung.

 

# openssl req -new -key mydomain1_client1.key -out mydomain1_client1.csr

 

Hier müssen wir die gleichen Daten eintragen wie bei der CSR-Zertifikatsanforderung für den Server. Der Unterschied ist nur bei "Organizational Unit Name", hier tragen wir den Namen des Clients ein.

 

Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bayern
Locality Name (eg, city) []:Stein
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MBS-IT
Organizational Unit Name (eg, section) []:client1
Common Name (e.g. server FQDN or YOUR name) []:mydomain1.firma.lan
Email Address []:admin@mydomain1.firma.lan

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Punkt
Jetzt können wir ein Client Zertifikat erstellen. In diesem Beispiel machen wir es für 10 Jahre.

 

# openssl ca -in mydomain1_client1.csr -cert ../myCA.crt -keyfile ../myCA.key -out mydomain1_client1.crt -days 3650
Punkt
Danach exportieren wir das Client-Zertifikat in ein übertragungstauglichen Key, in PKCS12-Format, hierzu wird ein Passwort abgefragt. Das Passwort wird später beim Import auf dem Client wieder brauchen.

 

# openssl pkcs12 -export -in mydomain1_client1.crt -inkey mydomain1_client1.key -out mydomain1_client1.p12
Punkt
Im nächsten Schritt kopieren wir auf dem WEB-Server unseres CA Zertifikat in unser CA-Verzeichnis. Das Zertifikat muss die Datei-Erweiterung .crt haben

 

# cp /etc/apache2/cert/myCA.crt /usr/local/share/ca-certificates/
Punkt
Unseren Zertifikats-Store aktualisieren wir mit dem folgenden Befehl

 

# update-ca-certificates

Anpassung der Apache Konfiguration

Punkt
Wir müssen jetzt noch unseren Virtual Host der Apache Konfiguration anpassen. Die 3 Zeilen kommen noch dazu

 

SSLCACertificatePath "/etc/ssl/certs"
SSLVerifyClient require
SSLVerifyDepth 5

 

Letztendlich unsere Konfigurationsdatei für die Domain mydomain1.firma.lan würde so aussehen.

 

<VirtualHost  *:443>

  ServerAdmin webmaster@mydomain1.firma.lan
  DocumentRoot /var/www/html/mydomain1
  ServerName mydomain1
  ServerAlias mydomain1.firma.lan
  SSLEngine on
  SSLCertificateFile /etc/apache2/cert/mydomain1.firma.lan.crt
  SSLCertificateKeyFile /etc/apache2/cert/mydomain1.firma.lan.key


  SSLCACertificatePath "/etc/ssl/certs"
  SSLVerifyClient require
  SSLVerifyDepth 5

  ErrorLog /var/log/apache2/mydomain1.firma.lan_error_log
  CustomLog /var/log/apache2/mydomain1.firma.lan_access_log common
</VirtualHost>

 

Den Apache-Dienst muss man neu starten.

 

# systemctl restart apache2.service
Punkt
Wenn wir jetzt versuchen auf dem Client die WEB-Seite aufzurufen, bekommen wir eine Fehlermeldung, kurz gesagt, wir bekommen kein Zugriff. Um wieder Zugriff auf die WEB-Seite zu erlangen, müssen wir das Client-Zertifikat auf dem Client-Gerät importieren. Beim Import wird das Passwort des Zertifikats verlangt.
Punkt
Import des Client-Zertifikates auf einer Windows-Gerät, In unserem Fall ist es das Zertifikat mydomain1_client1.p12
Als Administrator starten wir "Computerzertifikate verwalten" und importieren das Client-Zertifikat in "Eigene Zertifikate". Selbstverständlich der Benutzer kann auch selbst das Zertifikat in "Benutzerzertifikate verwalten" in "Eigene Zertifikate" importieren.

Punkt
Jetzt können wir versuchen die Web-Seite https://mydomain1.firma.lan wieder zu laden. Es kommt jetzt ein kleines Fenster und wir können das Zertifikat auswählen und mit OK bestätigen.

Punkt
Sollten wir Firefox unter Windows oder unter Linux nutzen, müssen wir die entsprechende Zertifikate in Firefox importieren. Das CA-Zertifikat importieren wir im Bereich "Zertifizierungsstellen".

Punkt
Client-Zertifikat in Firefox importieren in "Ihre Zertifikate"