Authentifizierung über Client-Zertifikate

Client Zertifikate als Ersatz für Benutzername und Passwort.

Client-Zertifikate lassen sich als Ersatz/Zusatz für den klassischen Login verwenden.
Voraussetzung für den Einsatz dieser Zertifikate ist eine über HTTPS verschlüsselte Verbindung.

Zum Erstellen der Client-Zertifikate wird ein Root-Zertifikat benötigt.
Dies kann ein selbst erstelltes oder z.B. das Webserver-Zertifikat sein.
Mit den folgenden Befehlen kann ein Client-Zertifikat erstellt und signiert werden.

openssl genrsa -des3 -out user.key 
openssl req -new -key user.key -out user.req
openssl ca -cert /pfad/zum/serverzertifikat.crt -keyfile /pfad/zum/serverzertifikat.key -out user.crt -in user.req

Damit das soeben erstellte Zertifikat genutzt werden kann, muss es meist in das PKCS#12 Format umgewandelt werden.
Dafür kann folgender Befehl verwendet werden:

openssl pkcs12 -export -inkey user.key -name "user" -in user.crt -certfile /pfad/zum/serverzertifikat.crt -out user.p12

Im nächsten Schritt muss nun die Webserver Konfiguration angepasst werden.
Hier als Beispiel mit dem Apache Webserver:

<VirtualHost *:443>
...
SSLCACertificateFile /pfad/zum/serverzertifikat.crt
SSLVerifyClient require|optional
SSLVerifyDepth 1
SSLOptions +StdEnvVars
...
</VirtualHost>

Zu den SSLOptions kann zusätzlich noch “+ExportCertData” hinzugefügt werden. Dann steht das Zertifikat auch in PHP zur Verfügung.

Zuletzt muss das Client-Zertifikat noch in den Browser importiert werden.
In Google Chrome wird das unter folgenden Seite importiert:
Optionen -> Details -> HTTPS -> Zertifikate

Das Client-Zertifikat wird nun den Server gesendet.
In PHP lässt sich über die $_SERVER Variable auf die Zertifikatsdaten zugreifen.