Ein Apache mit mod_ssl ermöglicht die Public-Key Authentifizierung von
Clients. Dafür wird ein CA-Zertifikat auf dem Server benötigt. Die
Clients benötigen Zertifikate, die von dieser CA signiert wurden.
(Diese Methode ist nur mit mod_ssl
möglich. Ein apache-ssl
unterstützt sie nicht)
Um eine zertifikatbasierte Authentifizierung von Clients zu realisieren, werden pkcs12 Zertifikate benötigt. Der Client erzeugt hierfür ein CSR (Certificate Sign Request) und läßt diesen von der CA signieren. Das signierte Zertifikat wird dann in ein pkcs12 Zertifikat konvertiert.
openssl req -new -keyout client-req.csr -out client-req.csr -days 365
Hier werden der Private Key sowie der CSR in das gleiche File geschrieben [kann, muß aber nicht]. Wenn mögllich sollte der Private Key getrennt vom Zertifikat gehandhabt werden und das lokale System nicht verlassen. Er wird später für die Konvertierung in das pkcs12 Format benötigt.
Der oben erzeugte CSR wird der CA übergeben, die diesen signiert:
openssl ca -policy policy_anything -config private/openssl.conf \ -out client-cert.pem -infiles client-req.csr
Das signierte Zertifikat wird danach dem Client zurückgeschickt.
Der Browser benötigt ein Zertifikat im pkcs12 Format. Dieses Format wird aus dem X509 Format mit dem Kommandoaufruf:
openssl pkcs12 -export -in client-cert.pem -inkey client-cert.csr \ -out client-cert.p12 -name "Martin Werthmoeller Auth Cert"erzeugt.
Das pkcs12 Zertifikat wird an den Client übermitttelt. Dieser importiert das Zertifikat in den Browser. Die Importfunktion liegt beim Mozilla unter Einstellungen/Sicherheit/Zertifikate.
Beim Zugriff auf einen entsprechend konfigurierten Webserver ermittelt der Browser welches der installierten Zertifikate zum Zertifikat auf dem Webserver passt. Das heißt, welches der lokal installierten Zertifikate von der CA des Zertifikats des Servers signiert wurde. Dieses wird dann zwecks Authentisierung an den Server ausgeliefert.
Der Apache wird global, per virtuellem Host oder Directory Sektion für die Authentifizierung mittels Zertifikaten konfiguriert:
SLCACertificateFile /etc/apache/ssl/ca_cert.crt <Directory /secure> SSLVerifyClient require SSLVerifyDepth 1 </Directory>
Der Zugriff auf das Verzeichnis /secure ist jetzt nur mit einem Zertifikat möglich, das von der CA signiert worden ist,
Wenn nur einzelne von der CA signierte (Client-) Zertifikate für den Zugriff zugelassen werden sollen, wird die Konfiguration des Apache Servers geändert.
SSLVerifyClient none SSLCACertificateFile /home/martin/data/SSL/ca/ca.crt <Directory /srv/www/htdocs/customers> SSLVerifyClient require SSLVerifyDepth 1 SSLOptions +FakeBasicAuth SSLRequireSSL SSLRequire %{SSL_CLIENT_S_DN_O} eq "LWsystems" and \ %{SSL_CLIENT_S_DN_OU} in {"cst_1", "cst_2"} </Directory>
Das Verzeichnis customers
dürfen nur Clients
lesen, deren Zertifikate mit dem Parameter O=LWsystems und
OU=cst_1 bzw. OU=cst_2 im Distinguished Name
ausgestellt wurden. Allen Clients mit anderen Zeritifikaten der CA
wird der Zugriff verweigert.