PoC - zertifikatbasierte Authentifizierung

For topics beyond KeyHelp. / Für Themen jenseits von KeyHelp.
Post Reply
User avatar
Jolinar
Community Moderator
Posts: 3560
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

PoC - zertifikatbasierte Authentifizierung

Post by Jolinar »

Bezugnehmend auf diesen Post -> viewtopic.php?p=33810#p33810 in einem anderen Thread möchte ich mit diesem Beitrag aufzeigen, mit welch geringem Aufwand es möglich wäre, eine weitere Schutzschicht für den Aufruf sensibler Webseiten zu implementieren. Bitte hierzu auch die Anmerkungen am Ende dieses Beitrages berücksichtigen.
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
eingefügt.

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
Hier wäre zu beachten, daß dieser Parameter an verschiedenen Stellen der Konfiguration gesetzt werden kann, entweder für den gesamten vHost oder in einer Directory-Section für ein einzelnes Verzeichnis.

Zuletzt noch ein Restart des Apache mit:

Code: Select all

service apache2 restart
Und schon funktioniert die zusätzliche Absicherung mit Client Zertifikaten.


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. 8-)
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
User avatar
Tobi
Community Moderator
Posts: 2812
Joined: Thu 5. Jan 2017, 13:24

Re: PoC - zertifikatbasierte Authentifizierung

Post by Tobi »

Zu deiner Anleitung mal zwei Fragen:
1. Warum nicht einfach das Standard-Zertifikat des Servers nutzen?
2. Wie binde ich das ggf. bei einem Windows Client ein?
Gruß,
Tobi


-----------------------------
wewoco.de
Das Forum für Reseller, Digital-Agenturen, Bildschirmarbeiter und Mäuseschubser
User avatar
Jolinar
Community Moderator
Posts: 3560
Joined: Sat 30. Jan 2016, 07:11
Location: Weimar (Thüringen)
Contact:

Re: PoC - zertifikatbasierte Authentifizierung

Post by Jolinar »

Tobi wrote: Tue 22. Mar 2022, 17:13 1. Warum nicht einfach das Standard-Zertifikat des Servers nutzen?
Weil die Anleitung grundsätzlich erstmal unabhängig von der individuellen Umgebung funktionieren sollte.

Tobi wrote: Tue 22. Mar 2022, 17:13 2. Wie binde ich das ggf. bei einem Windows Client ein?
Das ist unterschiedlich...Bei Nutzung von Chromium basierten Browsern (zB: Google Chrome, Opera, etc.) wird das Zertifikat direkt in die Zertifikatsverwaltung von Windows (certmgr.msc) importiert. Firefox hingegen hat AFAIK eine eigene Zertifikatsverwaltung implementiert, in dem Fall müßte es dort importiert werden.
Wenn jemand inkompetent ist, dann kann er nicht wissen, daß er inkompetent ist. (David Dunning)

Data Collector für Community Support
___
Ich verwende zwei verschiedene Schriftfarben in meinen Beiträgen /
I use two different font colors in my posts:
  • In dieser Farbe schreibe ich als Moderator und gebe moderative Hinweise oder begründe moderative Eingriffe /
    In this color, I write as a moderator and provide moderative guidance or justify moderative interventions
  • In dieser Farbe schreibe ich als Community Mitglied und teile meine private Meinung und persönlichen Ansichten mit /
    In this color, I write as a community member and share my personal opinions and views
Post Reply