njör.de

Start > Texte > SSL-Client-Authentifizierung mit der eigenen CA

SSL-Client-Authentifizierung mit der eigenen CA

Voraussetzungen

Für die Verwaltung der Zertifikate wird die Software xca eingesetzt. Als Webserver-Software wird hiawatha eingesetzt, andere Webserver wie der Apache-Webserver können ebenso für den Einsatz mittels SSL-Client-Authentifizierung eingerichtet werden.

Wichtig für die Sicherheit des Gesamtsystems ist die Sicherheit der Schlüsselerzeugung. Der Rechner, auf dem xca eingesetzt wird, sollte nur zu diesem Zweck benutzt werden und keine Verbindung mit einem Netzwerk besitzen. Die Schlüssel können mittels eines USB-Sticks - der auch nur zu diesem Zweck benutzt werden sollte - verbreitet werden.

Einrichtung einer SSL-Client-Authentifizierung für HTTPS

Mittels der SSL-Client-Authentifizierung kann der Zugriff auf einen bestimmten Host eingeschränkt werden. Nur Besitzer eines gültigen Zertifikates sind in der Lage, sich mit dem Host zu verbinden. Fragt man zusätzlich für den Zugriff noch ein Kennwort ab, lassen sich sehr hohe Sicherheitsanforderungen umsetzen (Multi-Faktor-Authentifizierung).

Nach dem ersten Start von xca muss eine neue Datenbank angelegt werden, in welcher all unsere Zertifikate gespeichert werden. Diese Datenbank muss mit einem Kennwort gesichert werden. Das Kennwort kann jederzeit mittels Datei->"Datenbankpasswort ändern" geändert werden.

CA erstellen

Im Reiter "Zertifikate" kann mittels "Neues Zertifikat" ein neues Zertifikat - in unserem Fall ein CA-Zertifikat - erzeugt werden. Im folgenden Dialog wählen wir im Reiter "Herkunft" unten unter "Vorlage für das neue Zertifikat" "[default] CA" aus. Unter "Signatur algorithmus" wählen wir SHA-512 aus. Anschließend müssen wir die Auswahl mittels "Alles übernehmen" übernehmen.

Im Reiter "Inhaber" füllen wir die Felder nach unseren Anforderungen aus.

commonName, organizationName, organizationUnitName sind später in den Server-Zertifikaten sichtbar.

Im unteren Teil müssen wir für unser Zertifikat noch einen privaten Schlüssel erzeugen. Dazu gehen wir auf "Erstelle einen neuen Schlüssel", geben dem Schlüssel einen Namen, wählen als Schlüsseltyp "RSA" und als Schlüssellänge 4096bit. Unter "EC" können auch Schlüssel mittels elliptischer Kurven erzeugt werden. Nach den NSA Enthüllungen und der damit bekannt gewordenen Kompromittierung der NIST-Kurven kann hier keine Empfehlung für eine bestimmte Kurve gegeben werden. (Curve25519 von djb ist hier nicht auswählbar)

Ist der neue Schlüssel erzeugt, wird dieser automatisch in "Privater Schlüssel" ausgewählt.

Im Reiter "Erweiterungen" können wir die Voreinstellungen so belassen. Diese wurden bereits mit der Vorlage im Reiter "Herkunft" ([default] CA) sinnvoll vorbelegt. Lediglich die Gültigkeit können wir hier auf 10 Jahre einstellen. Nach Änderung der Zeitspanne klicken wir auf "Übernehmen".

Im Reiter "Key usage" können wir alle Einstellungen so belassen.

Im Reiter "Netscape" kann der Ort der Zertifikatsperrliste und andere Angaben eingestellt werden. Dies ist für unseren Anwendungsfall bei der CA-Erstellung nicht notwendig, da hier nur der Server die Zertifikate prüfen muss.

Mit "OK" wird unser CA-Zertifikat erstellt. Da wir noch keine Zertifikatsperrliste erzeugt haben, wird im Feld "Rücknahme" "CRL ungültig" angezeigt. Dazu kommen wir später.

Server-Zertifikat erstellen

Um eine verschlüsselte Verbindung mittels HTTPS aufzubauen, benötigen wir ein Server-Zertifikat. Da wir bereits ein CA-Zertifikat erstellt haben, bietet es sich an, das Server-Zertifikat mit dem CA-Zertifikat zu signieren.

Es ist auch möglich, hier ein gekauftes SSL-Zertifikat einzusetzen.

Da wir unser CA-Zertifikat sowieso auf allen unseren Geräten installieren und ihm vertrauen müssen, bietet der Einsatz eines gekauften SSL-Zertifikates hier keine Vorteile.

Dazu gehen wir im Hauptfenster von xca wieder auf den Reiter "Zertifikate" und wählen "Neues Zertifikat".

Nun gehen wir auf den Reiter "Herkunft" und wählen bei "Unterschreiben" "Verwende dieses Zertifikat zum Unterschreiben" und unser vorher erstelltes CA-Zertifikat aus. Damit wird dieses Server-Zertifikat mit unserem CA-Zertifikat signiert.

Als "Signatur algorithmus" wählen wir hier wieder SHA-512.

Unter "Vorlage für das neue Zertifikat" wählen wir "[default] HTTPS_server" und klicken anschließend auf "Alles übernehmen".

Im Reiter "Inhaber" füllen wir die Felder nach unseren Anforderungen aus.

commonName: Hier muss der DNS-Namen unseres Webservers eingegeben werden.

commonName, organizationName, organizationUnit, serialNumber sind später in den Server-Zertifikaten sichtbar.

Im unteren Bereich erzeugen wir wieder einen privaten Schlüssel. Nach einem Klick auf "Erstelle einen neuen Schlüssel" wählen wir einen Schlüsselnamen, den Schlüsseltyp RSA und die Schlüssellänge 4096bit und erzeugen den Schlüssel mit einem Klick auf "Erstellen".

Im Reiter "Erweiterungen" sind die Felder wieder sinnvoll vorbelegt. Als Zeitspanne legen wir 2 Jahre fest und bestätigen mit "Übernehmen".

Die Einstellungen im Reiter "Key usage" können wir wieder so belassen.

Mittels "OK" wird unser Server-Zertifikat erzeugt.

Nun haben wir alle Zertifikate erzeugt und müssen diese exportieren und an die richtige Stelle für unsere Webserver zugänglich machen.

Fangen wir mit unserem CA-Zertifikat an. Dieses wählen wir im Hauptfenster aus und klicken dann rechts auf "Export". Nun werden wir nach einem Dateinamen und dem Exportformat gefragt. Als Namen wählen wir "ServerCA.crt", als Format wählen wir PEM. Keinesfalls sollte hier "PEM Cert + key", da sonst der private Schlüssel mit exportiert wird und damit unsere komplette PKI-Infrastruktur kompromittiert ist.

Nun wählen wir unser Server-Zertifikat und klicken auf "Export". Da unser Webserver sowohl den öffentlichen Schlüssel als auch den privaten Schlüssel benötigt, wählen wir hier "PEM Cert + key" aus. Als Dateiname wählen wir "ServerCert.pem" .

Client-Zertifikat erstellen

Alle Clients, die sich mit unserer gesicherten Webseite verbinden können sollen, benötigen ein Client-Zertifikat. Dieses wird mit unserem CA-Zertifikat signiert. Somit kann der Webserver die Vertraulichkeit prüfen und den Zugriff gestatten oder nicht.

Wir gehen im Hauptfenster von xca wieder auf den Reiter Zertifikate -> "Neues Zertifikat"

Im nun öffnenden Dialog gehen wir auf den Reiter "Herkunft". Hier wählen wir unter "Unterschreiben" -> "Verwende dieses Zertifikat zum Unterschreiben" unser zuvor erstelltes CA-Zertifikat aus.

Als "Signatur algorithmus" wählen wir SHA-2, nicht SHA-512 wie bei den anderen Zertifikaten. Hintergrund ist, dass nicht alle Browser in der Lage sind, SHA-512 zu benutzen (Stand 09/2014). 

Als "Vorlage für das neue Zertifikat" wählen wir "[default] HTTPS_client", danach klicken wir auf "Alles übernehmen".

Im Reiter "Inhaber" füllen wir die Felder unter "Distinuished name" nach unseren Anforderungen aus.

Tipp: Das Ablaufdatum des Client-Zertifikates ist weder am Server noch am Client automatisch anzeigbar. Nur wenn man sich das Client-Zertifikat anzeigen lässt, kann man sehen, wann dieses ablaufen wird.

Um den Benutzer die Arbeit mit dem Zertifikat zu erleichtern, tragen wir das Ablaufdatum in das Feld organizationalUnitName im folgenden Format ein: Abteilungsname;tag.monat.jahr

Somit ist es möglich, das Ablaufdatum auf Serverseite automatisiert auszuwerten und dem Benutzer vor Ablauf eine entsprechende Warnung anzuzeigen, bzw. 14 Tage vor Ablauf gleich ein entsprechendes Ticket in unserer IT-Abteilung zu eröffnen.

Im unteren Bereich erstellen wir wieder einen privaten Schlüssel, Schlüsseltyp RSA, Schlüssellänge 4096bit.

Im Reiter "Erweiterungen" sind wieder bereits alle Felder sinnvoll vorbelegt, lediglich die Gültigkeit unseres Clientzertifikates können wir hier an unsere Anforderungen anpassen.

Da auch die anderen Reiter sinnvoll vorbelegt sind und für unsere Konfiguration so belassen werden können, erzeugen wir unser Client-Zertifikat mit einem Klick auf "OK".

Nun müssen wir das Client-Zertifikat exportieren und in allen Browsern installieren, die auf unseren Webserver unter dem jeweiligen commonName zugreifen sollen. Diese Vorgehensweise müssen wir für jeden commonName (Benutzer) wiederholen.

Im Hauptfenster wählen wir das Client-Zertifikat aus, und klicken auf "Export". Dann wählen wir als Dateiname "commonName.p12" und als Exportformat "PKCS#12". Zur Sicherheit muss beim Export ein Kennwort vergeben werden, welches beim Import wieder abgefragt wird.

In jedem Browser, der auf unseren Webserver zugreifen soll, müssen wir den öffentlichen Schlüssel unseres CA-Zertifikates installieren. Unter Firefox wählen wir dazu Edit->Preferences->Advanced->Certificates->"View Certificates"->Autorities->Import.

Unter Chromium gehen wir folgenden Weg: Bearbeiten->Einstellungen->"Erweiterte Einstellungen anzeigen"->"Zertifikate verwalten..."->Zertifizierungsstellen->Importieren...

Das Client-Zertifikat können wir an der gleichen Stelle bei Firefox unter "Your Certificates" und im Chromium unter "Ihre Zertifikate" importieren.

Das CA-Zertifikat wird unter organizationName->commonName installiert.

Das Client-Zertifikat wird im Firefox unter organizationName(des CA-Zertifikates)->commonName(des Client-Zertifikates) installiert.

Im Chromium ist unser Client-Zertifikat nach der Installation unter organizationName(des Client-Zertifikates)->commonName(des Client-Zertifikates) zu finden.

Beim ersten Zugriff auf die Webseite wird abgefragt, mit welchem Client-Zertifikat wir uns anmelden wollen. 

Im Firefox kann man diese Abfrage verhindern, indem man unter Edit->Preferences->Advanced->Certificates.>"Select one automatically" aktiviert.

Wenn man sich mit der Webseite verbunden hat, kann die Identität des Zertifikates anhand der Hash-Werte (SHA-1 und MD5) im Browser geprüft werden. In xca sind diese Hash-Werte zu sehen, wenn das Server-Zertifikat ausgewählt wird und anschließend "Details anzeigen" geklickt wird.

Webserver einrichten

Kommen wir zu der Einrichtung unseres Webservers. Alle Angaben beziehen sich auf den hiawatha-Webserver. Dieser muss mit der Option "-DENABLE_SSL=ON" kompiliert worden sein. Geprüft werden kann dies, indem man "./hiawatha -v" aufruft. In der Ausgabe muss SSL enthalten sein, in Klammern folgt die Version von polarssl.

In der Konfigurationsdatei des Webservers muss ein Binding an den TCP-Port 443 angelegt werden. Dabei muss bereits die Option SSLcertFile mit einem Server-Zertifikat gesetzt werden. Das Server-Zertifikat, welches hier angegeben wird, wird für Verbindungen genutzt, die keinem VirtualHost zugeordnet werden können.

Für unseren VirtualHost müssen wir auch einen neuen Bereich definieren, der unser vorher erstelltes Binding nutzt. Hier kann man den bereits bestehenden an Port 80 gebundenen VirtualHost-Bereich kopieren und um die Felder SSLcertFile und RequireSSL ergänzen. Will man die Clients zwingen, SSL zu benutzen, muss im Port-80-VirtualHost-Bereich auch ein Feld RequireSSL gesetzt werden.

Ohne die Option "RequireCA" ist der Zugriff auf unsere Resource uneingeschränkt möglich. Nun können wir die SSL-Verschlüsselung mit folgendem Test prüfen lassen: https://www.ssllabs.com/ssltest/index.html

Da wir nur Zugriffe mit SSL-Client-Autentifizierung erlauben möchten, müssen wir zusätzlich RequiredCA setzen.

Beispiel: 

SSLcertFile = /etc/service/www/conf/ServerCert.pem
RequireSSL = yes
RequiredCA = /etc/service/www/conf/ServerCA.crt, /etc/service/www/conf/ServerCA-CRL.pem

Die unter dem Punkt "Server-Zertifikat erstellen" auf den Webserver kopierten Zertifikate werden nun an die entsprechende Stelle verschoben. Dateirechte soweit wie möglich einschränken und Dateiattribute Benutzer:Gruppe der Zertifikate prüfen.

Erzeugen der Zertifikatsperrliste

Um eine Zertifikatsperrliste zu erzeugen, gehen wir wie folgt vor: im Hauptfenster von xca klicken wir mit der rechten Maustaste auf unser CA-Zertifikat, dann auf "CA" -> "CRL erstellen". Nun können wir einen Zeitraum angeben, in welchem unsere Zertifikatsperrliste gültig ist.

Für unsere Konfiguration können wir hier einen sehr langen Zeitraum wählen, da wir für alle Änderungen eine neue Zertifikatsperrliste erzeugen und nur unser Server auf diese Liste zugreifen muss.

Alle anderen Einstellungen lassen wir wie voreingestellt und erzeugen die Liste mit einem Klick auf "OK".

Über den Reiter "Rücknahmelisten" im Hauptfenster von xca sind die Zertifikatsperrlisten zugänglich.

Nun gehen wir aus dem Hauptfenster von xca auf den Reiter "Rücknahmelisten", wählen unsere Liste aus und exportieren diese über "Export". Als Format wählen wir hier PEM, als Dateiname "ServerCA-CRL.pem". Die Datei muss nun an die entsprechende Stelle auf den Webserver kopiert werden. Abschließend müssen wir unseren Webserver neu starten, damit dieser die Zertifikatsperrliste neu einließt.

Ablauf zur Sperrung eines Client-Zertifikates

Wenn wir verhindern wollen, das ein bestimmtes Client-Zertifikat weiterhin auf unseren Webserver zugreifen kann, gehen wir wie folgt vor.

Wir klicken auf das Client-Zertifikat aus dem Hauptfenster von xca mit der rechten Maustaste und wählen "Rücknahme". Die Felder wählen wir entsprechend aus und bestätigen mit "OK"

Da sich nun Daten in unserer Zertifikatsperrliste geändert haben, müssen wir diese neu erstellen und auf den Webserver kopieren. Gehe dazu wie in "Erzeugen der Zertifikatsperrliste" beschrieben vor. Wichtig: bitte nicht vergessen, den Webserver neu zu starten.

Kommentar schreiben

Name

Kommentar