Apache Client-Zertifikats-Fehler abfangen
Akela
- webserver
0 Edgar Ehritt
Hallo,
mein Apache ist so eingestellt, daß eine Anmeldung per Client-Zertfikaten (SSLVerifyClient) erfolgt. Das funktioniert soweit auch gut und ich kann per PHP auch die SSL_CLIENT_*-Variablen auslesen.
Wenn ich allerdings ohne ein gültiges Zertifikat ankomme, generiert der Apache eine Fehlermeldung (ssl_error_handshake_failure_alert). Wie kann ich es anstellen, dem User eine Anzeige zu bieten, die ihn auf ein falsches Zertfikat hinweist?
Ciao Akela
Hallo Akela,
mein Apache ist so eingestellt, daß eine Anmeldung per Client-Zertfikaten (SSLVerifyClient) erfolgt. Das funktioniert soweit auch gut und ich kann per PHP auch die SSL_CLIENT_*-Variablen auslesen.
daraus mutmaße ich jetzt mal, dass die Konfiguration des Apachen SSLOptions +ExportCertData
einschließt.
Wenn ich allerdings ohne ein gültiges Zertifikat ankomme, generiert der Apache eine Fehlermeldung (ssl_error_handshake_failure_alert).
Der Apache? Der Browser generiert solche Fehlermeldungen z. B.: Mozilla
Wie kann ich es anstellen, dem User eine Anzeige zu bieten, die ihn auf ein falsches Zertfikat hinweist?
Davon ausgehend, dass der Browser diese Meldung aufgrund der Abgewiesenen Verbindung zu einem Server generiert, muss das ganze wieder auf die Ebene des Webservers verlagert werden. Im Detail ist also wieder default SSLVerifyClient none
zu verwenden. Durch SSLOptions +ExportCertData
hast Du die Möglichkeit mittels PHP aus den $_SERVER-Variablen eine Überprüfung des Zertifikats zu machen. Je nach Prüfungsausgang hast Du dann die Möglichkeit, serverseitige Ausgaben zu erstellen.
Gruß aus Berlin!
eddi
Hallo eddi,
ein Nachtmensch wie ich sehe ;-)
Danke für Deine Beschreibung.
Meine config sieht so aus.
<VirtualHost xx.xx.xx.xx:443>
SSLEngine On
# Server-Zertifikate
SSLCertificateFile C:/irgendwo/server-cert.pem
SSLCertificateKeyFile C:/irgendwo/priv-server.key
# Client-Zertifikate
SSLCACertificateFile C:/irgendwo/sso_ca.crt
SSLVerifyClient require
SSLVerifyDepth 2
SSLOptions +StdEnvVars +ExportCertData
</VirtualHost>
Ich habe Deinem Hinweis folgend SSLVerifyClient none gesetzt. Dann bekomme ich allerdings keine SSL-Umgebungsvariablen mehr!
Ich dachte eher an eine Lösung wie z.B. eine Umleitung der Seite nach dem Prinzip des Errordocument unter Apache. Aber welchen Errorcode kann ich da anwenden?
ciao Akela
Hallo,
ich habe es jetzt wie folgt gelöst:
<VirtualHost xx.xx.xx.xx:443>
SSLEngine On
# Server-Zertifikate
SSLCertificateFile c:/irgendwo/server-cert.pem
SSLCertificateKeyFile c:/irgendwo/priv-server.key
# Client-Zertifikate
SSLCACertificateFile c:/irgendwo/sso_ca.crt
SSLVerifyClient optional
SSLVerifyDepth 2
SSLOptions +StdEnvVars +ExportCertData
# Fehler abfangen
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteRule .* /error.html [L]
</VirtualHost>
Wichtig war hierbei SSLVerifyClient NICHT auf require zu setzen, wie eddi das schon bemerkt hatte. Weiter muß mit dem Rewrite-Modul eine Umleitung erfolgen, wenn die Server-Umgebungsvariable SSL_CLIENT_VERIFY nicht SUCCESS ist. Die Umgebungsvariablen für SSL stehen allerdings nur dann zur Verfügung, wenn "SSLOptions +StdEnvVars" gesetzt ist.
ciao Akela
Re:
Wichtig war hierbei SSLVerifyClient NICHT auf require zu setzen...
Aha, danke; dann habe ich auch was dazu gelernt. :)
Gruß aus Berlin!
eddi