Den Ablauf, den ich hier beschreibe, kann man ausschließlich mit Boardmitteln erledigen, es ist keine zusätzliche Softwareinstallation dafür erforderlich.
Ziel ist es, daß Webseitenaufrufe vom Server nur noch dann zugelassen werden, wenn der aufrufende Client (Browser) über ein gültiges Zertifikat verfügt. In dem Beispiel erstelle ich auf einer Keyhelp-Instanz ein Client Zertifikat für den Standardadmin keyadmin, dementsprechend habe ich die Dateinamen für die Zertifikatdateien gewählt.
Zuerst bauen wir eine SSH-Verbindung zum Server auf und melden uns als root an. Dann erstellen wir erstmal ein Arbeitsverzeichnis:
Code: Select all
mkdir ssl && cd ssl
Jetzt legen wir noch einige erforderliche Verzeichnisse und Dateien an, damit wir nicht die ganze OpenSSL-Config umbauen müssen:
Code: Select all
mkdir -p demoCA/newcerts && mkdir demoCA/certs && mkdir demoCA/crl && echo 00 > demoCA/serial && touch demoCA/index.txt
Es wird ein Key mit 4096 Bit Schlüssellänge für die lokale CA erstellt:
Code: Select all
openssl genrsa -out keyhelp_rootca.key 4096
Mit diesem Key wird jetzt das Zertifikat für die CA erstellt, Gültigkeit des Zertifikats ist in diesem Beispiel 10 Jahre:
Code: Select all
openssl req -x509 -new -nodes -key keyhelp_rootca.key -sha256 -days 3650 -out keyhelp_rootca.pem
Das CA-Zertifikat wird nun der Zertifikatsverwaltung des Servers hinzugefügt (zu beachten ist hier die Änderung des Dateityps in crt):
Code: Select all
cp keyhelp_rootca.pem /usr/local/share/ca-certificates/keyhelp_rootca.crt
update-ca-certificates
Jetzt wird der Key für den Client erstellt, Schlüssellänge ebenfalls 4096 Bit:
Code: Select all
openssl genrsa -out keyhelp_keyadmin.key 4096
Mit diesem Key erstellen wir jetzt eine Zertifikatsanforderung:
Code: Select all
openssl req -new -key keyhelp_keyadmin.key -out keyhelp_keyadmin.csr
Mit der Zertifikatsanforderung wird nun das Clientzertifikat (Gültigkeit ebenfalls 10 Jahre) erstellt, welches mit dem Zertifikat der lokalen CA signiert wird:
Code: Select all
openssl ca -in keyhelp_keyadmin.csr -cert keyhelp_rootca.pem -keyfile keyhelp_rootca.key -out keyhelp_keyadmin.crt -days 3650
Da der Client mit dem Format des eben erstellten Zertifikats nichts anfangen kann, wird das Zertifikat in einem weitern Schritt in das PKCS12-Format exportiert. Beim Export wird ein Paßwort abgefragt, welches dann beim Import im Client angegeben werden muß:
Code: Select all
openssl pkcs12 -export -in keyhelp_keyadmin.crt -inkey keyhelp_keyadmin.key -out keyhelp_keyadmin.p12
Das PKCS12-Zertifikat wird nun auf den Client kopiert und dort in die jeweilige Zertifikatsverwaltung importiert.
Zum Schluß müssen wir nur noch die Konfiguration des entsprechenden vHosts anpassen. Zuerst teilen wir dem Apache mit, wo er das CA-Zertifikat findet und bis zu welcher Tiefe er auf Gültigkeit prüfen soll:
Code: Select all
SSLCACertificatePath "/etc/ssl/certs"
SSLVerifyDepth 5
Da die ganze Sache in meinem Test mit TLSv1.3 (noch) nicht funktioniert, habe ich in der vHost Konfiguration noch:
Code: Select all
SSLProtocol -all +TLSv1.2
Jetzt müssen wir dem Apache natürlich noch sagen, was genau er schützen soll. Das geschieht mit dem Parameter:
Code: Select all
SSLVerifyClient require
Zuletzt noch ein Restart des Apache mit:
Code: Select all
service apache2 restart
Anmerkungen:
Dieser Beitrag ist keine Copy/Paste Anleitung sondern nur ein Machbarkeitsnachweis!
Ausreichende Kenntnisse im Umgang mit Zertifkaten habe ich vorausgesetzt. Ich habe bisher auch noch keine Zeit gefunden um herauszufinden, warum es bei meinem Vorgehen nicht mit TLSv1.3 funktioniert.
Weiterhin gilt zu beachten, daß man beim unbedachten Einsatz solch einer zertifikatbasierten Authentifizierung legitime Zugriffe auf den Server ebenfalls blockiert, zB. externes Monitoring. Würde man die Cert based Auth serverweit einsetzen, dürfte u.a. auch die Erstellung/Erneuerung von LE-Zertifikaten nicht funktionieren (hab ich jetzt nicht getestet, erscheint mir aber logisch^^).
Viel Spaß denjenigen, die gerne basteln und nun versuchen, das Beschriebene auf einer ihrer Kisten umzusetzen.