Wie Sie festgestellt haben, können Sie die Zertifikatsüberprüfung auf SSL / TLS-Handshake-Ebene in Apache Httpd mithilfe von deaktivieren SSLVerifyCLient optional_no_ca
.
Das zweite Problem, mit dem Sie konfrontiert werden, besteht darin, den Client zum Senden des Zertifikats zu bewegen. Da Ihr Zertifikat nicht für eine PKI vorgesehen ist, kann es selbstsigniert sein und verschiedene Aussteller haben.
Wenn ein Client-Zertifikat angefordert wird, sendet der Server während des Handhsakes eine CertificateRequest
TLS-Nachricht an den Client. Diese Nachricht enthält die certificate_authorities
Liste:
Eine Liste der definierten Namen akzeptabler Zertifizierungsstellen. Diese definierten Namen können einen gewünschten definierten Namen für eine Stammzertifizierungsstelle oder für eine untergeordnete Zertifizierungsstelle angeben; Somit kann diese Nachricht verwendet werden, um sowohl bekannte Wurzeln als auch einen gewünschten Autorisierungsraum zu beschreiben. Wenn die Liste certificate_authorities leer ist, kann der Client jedes Zertifikat des entsprechenden ClientCertificateType senden, es sei denn, es liegt eine gegenteilige externe Vereinbarung vor.
Browser verwenden dies, um auszuwählen, welches Client-Zertifikat gesendet werden soll (falls vorhanden).
(Beachten Sie, dass der Teil über die leere Liste nur in der Spezifikation ab TLS 1.1 enthalten ist. SSL 3.0 und TLS 1.0 enthalten keine Informationen dazu und funktionieren in der Praxis auch.)
Sie erhalten dafür zwei Möglichkeiten.
Wenn die von Ihnen erwarteten Client-Zertifikate selbst signiert werden, haben alle unterschiedliche Aussteller. Da Sie nicht wissen, was Sie erwartet, muss der Server eine leere Liste senden. Verwenden Sie dazu die SSLCADNRequestFile
Direktive und zeigen Sie auf eine Datei, die nur eine leere Zeile enthält (wenn ich mich gut erinnere, funktioniert sie nicht mit einer vollständig leeren Datei).
Die zweite (weniger saubere) Option. Soll sich auf einen Aussteller-DN einigen, der allen von Ihnen erwarteten Client-Zertifikaten gemeinsam ist, unabhängig davon, ob sie tatsächlich von diesem CA-Zertifikat ausgestellt wurden oder nicht (oder ob diese CA überhaupt existiert oder nicht). Auf diese Weise würden Sie das PKI-Modell erheblich brechen (mehr).
Wenn Sie sich auf einen Emittenten-DN wie CN=Dummy CA
(zum Beispiel) einigen . Jeder kann ein selbstsigniertes Zertifikat erstellen, das CN=Dummy CA
als Betreff-DN (und Aussteller-DN) verwendet wird, möglicherweise mit unterschiedlichen Schlüsseln. Obwohl die SSLCADNRequestFile
Direktive erwartet, mit Zertifikaten zum Erstellen der Liste konfiguriert zu werden, werden diese nicht zum Überprüfen des Client-Zertifikats verwendet. Dies ist nur eine komplizierte (aber im Kontext der anderen Direktiven natürliche) Methode zum Konfigurieren der certificate_authorities
Liste. Wenn Sie als Dienst ein selbstsigniertes Zertifikat mit diesen Namen einfügen SSLCADNRequestFile
, wird die CertificateRequest
TLS-Nachricht CN=Dummy CA
in der certificate_authorities
Liste verwendet (dies sind nur Namen, derzeit keine Zertifikate). Der Client kann dann sein eigenes Zertifikat mit dem Aussteller-DN abholenCN=Dummy CA
, ob seine Signatur durch dieses Zertifikat überprüft werden konnte oder nicht (dieselben Schlüssel) oder nicht, da an diesen Schritten ohnehin keine Signaturprüfung beteiligt ist.
SSLVerifyCLient optional_no_ca
Denken Sie jedoch daran, dass mit keine echte Zertifikatsüberprüfung durchgeführt wird (ich nehme an, Sie könnten die SSL_CLIENT_VERIFY
Variable überprüfen , wenn Ihre manuelle Überprüfung nur eine Ersatzlösung für eine PKI ist, die Sie ohnehin konfiguriert haben). Zu diesem Zeitpunkt wissen Sie lediglich, dass der Client über den privaten Schlüssel für das von ihm vorgelegte öffentliche Schlüsselzertifikat verfügt (garantiert durch die TLS- CertificateVerify
Nachricht): Sie müssen eine Form der Überprüfung durchführen, wenn eine Authentifizierung für einige erfolgen soll Sortieren. (Sie können keinem Inhalt des Zertifikats vertrauen, dh keiner Bindung zwischen seinem öffentlichen Schlüssel und den darin enthaltenen Namen / Attributen.)
Dies funktioniert für Dateien nicht gut, aber Sie können dies für eine Anwendung tun (z. B. PHP / CGI / ... sogar Java, wenn Sie das Zertifikat an den Proxy-Java-Server übergeben). Eine grundlegende Möglichkeit wäre, eine bereits bekannte Liste öffentlicher Schlüssel zu haben, oder Sie könnten sich die Ideen in FOAF + SSL / WebID ansehen .