6.7.5. Authentifizierung von Benutzern
Bei der Authentifizierung kann man entweder direkt gegen die offiziellen CAs verifizieren oder eine normale Basic Authentifizierung nachahmen.
6.7.5.1. FakeBasicAuth
Mit der SSL-Option FakeBasic-Authentifkation wird das gelesene Zertifikat an den normalen Basic-Authentifikations-Mechanismus übergeben. Dazu muss in der "htpasswd" der DN des Zertifikats mit dem Passwort "password" hinterlegt werden (DES: "xxj31ZMTZzkVA'", MD5: "$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/").

Der Benuterzname kann aus einem Zertifikat mit dem Befehl
     openssl x509 -noout -subject -in certificate.crt
ermittelt werden.

Beispiel:
               # Zertifikate nur für bestimmte Bereiche
               SSLVerifyClient      none
               # Das Directory soll geschützt werden:
               <Directory /apache/htdocs/secure/area>
                    SSLVerifyClient      require
                    SSLVerifyDepth       5
                    SSLCACertificateFile conf/ssl.crt/ca.crt
                    SSLCACertificatePath conf/ssl.crt
                    SSLOptions           +FakeBasicAuth
                    SSLRequireSSL
                    AuthName             "Sicherheitsabfrage"
                    AuthType                Basic
                    AuthBasicProvider    file
                    AuthUserFile           /Apache/conf/httpd.passwd
                    require                    valid-user
               </Directory>

Die passende htpasswd sähe dann wie folgt aus:

          /C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA
          /C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA
          /C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA

oder Alternative Lösung:

     SSLVerifyClient      none
     <Directory /apache/htdocs/secure/area>

            SSLVerifyClient      require
            SSLVerifyDepth       5
            SSLCACertificateFile conf/ssl.crt/ca.crt
            SSLCACertificatePath conf/ssl.crt
            SSLOptions           +FakeBasicAuth
            SSLRequireSSL
            SSLRequire       %{SSL_CLIENT_S_DN_O}  eq "Snake Oil, Ltd." \
                    and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
     </Directory>
6.7.5.2. Erzeugung eines Client-Zertifikats
Offizielle Schlüssel kann man sehr komfortabel bei den Unternehmen und im Browser erstellen lassen.

Wenn man per openssl aber für Testzwecke ein Client-Zertifikat erstellen will, kann man fast wie bei dem Serverzertifikat vorgehen:

     # openssl genrsa -des3 -out client.key 1024
     # openssl req -new -key client.key  -out client.csr

Diese muss man jetzt on seiner Dummy-CA signieren:

     # openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything  -out client.crt -in client.csr

Netscape und IE unterstützen den Import von Zertifikaten aber nur im PKS12-Format. Dies wandelt man wie folgt um:

     # openssl pkcs12 -export -inkey client.key -in client.crt -out client.p12

Eine Rückumwandlung geschieht mit:

     # openssl pkcs12 -in client.p12 -out client.pem

Jetzt muss man dem Browser zwei Dinge mitteilen:
     - die pem-Datei der CA (da er diese ja sonst nicht kennt)
     - die client.p12
6.7.5.3. Client-Zertifikate
Wenn der Client ein Zertifikat mitliefert und man nur selbsterzeugte Zertifikate freischalten will, reichen die nachfolgenden Direktiven aus:

          # require a client certificate which has to be directly
          # signed by our CA certificate in ca.crt
          SSLVerifyClient require
          SSLVerifyDepth 1
          SSLCACertificateFile conf/ssl.crt/ca.crt

Sollen auch externe Anweisungen akzeptiert werden, benötigt man die offiziellen ca.pem- Informationen und muss die SSLVerifyDepth hoch setzen.