Apache wird nicht Verlangen, Meine SSL-Client-Zertifikat
First off, bitte beachten Sie, dass ich bin neu in der SSL-Konfiguration. In der Vergangenheit habe ich immer das Glück zu haben eine IT-Abteilung festlegen, dass für mich vor der Zeit. So vorbereitet werden, für die Möglichkeit, dass ich vielleicht müssen Sie Fragen zur Klärung auf einige Ihrer Antworten. =)
, Was ich Versuche zu Tun,
Ich bin beim einrichten einer intranet-website für die Mitarbeiter. Zum Beispiel, es wird ein browser-start-Seite zeigt den Inhalt angepasst für jeden Mitarbeiter. Als solche, ich muss in der Lage sein, zu identifizieren, sagte ein Mitarbeiter ohne dass ein Benutzername/Passwort oder andere Eingebung (one-time setup ist ok aber, ich will einfach nicht dass Sie dazu aufgefordert werden jedes mal). Natürlich, SSL würde zu sein scheinen der beste Weg zu gehen über das tun dies.
Werde ich eine MySQL-Datenbank-setup zuordnen "Benutzer" - Konten mit SSL_CLIENT_M_SERIAL und SSL_CLIENT_I_DN, die ich nehme, wird einzigartig für jeden client-Zertifikat(?). Ich habe die Idee aus diesem Artikel: http://cweiske.de/tagebuch/ssl-client-certificates.htm
Das erste mal, wenn der Benutzer geht auf die interne website, die Sie nicht haben, ein Zertifikat (ich will NICHT zu sein, erzeugen Sie manuell für den Kunden!), in diesem Fall $_SERVER["SSL_CLIENT_VERIFY"] == "NONE". Wenn das geschieht, wird die Benutzer-Konto-setup-Seite, die auch ein Schritt, wo PHP generiert ein SSL-client-Zertifikat und sendet es an den browser für den Benutzer zu installieren. Schön und einfach. Der Benutzer installiert dann den cert, den Verband gemacht, und nach einem Neustart des browser (für eine gute Maßnahme), der Benutzer geht zurück auf die interne website.
Zu diesem Zeitpunkt, Apache Anfragen soll das client-Zertifikat, das der browser sendet dann. Das PHP-Skript parst dann die notwendigen $_SERVER-Variablen vergleicht, gegen die MySQL-Datenbank, und gute Zeiten werden für uns alle. Wieder schön und einfach.
Was Funktioniert So Weit
Habe ich die server-side-Zertifikate installiert. Und ja, Sie sind selbst-signiert (aus offensichtlichen Gründen). Apache mod_ssl installiert und alles scheint zu funktionieren gut. Erstellt habe ich ein PHP-Skript, dass nur Deponien der $_SERVER-array, und alle SSL_SERVER_* Schlüssel-Werte des Zertifikats übereinstimmen, die ich für ihn erstellt.
Das Problem
Komme ich nicht an die client-Zertifikate an die Arbeit! In das gleiche PHP-Skript, egal was ich mache, SSL_CLIENT_VERIFY == "NONE" und die anderen SSL_CLIENT_* Tasten fehlen. Dies ist, was passiert, wenn ich SSLVerifyClient optional " festgelegt, die in ssl.conf. Nach jedem tutorial das ich gelesen habe, sagen alle, dass der webserver Sie sollten Fragen Sie den browser für ein client-Zertifikat. Die Sache ist, ich kann es nicht mehr zu tun! Es geht eben gerade um das PHP-Skript und meint ich habe keine client-Zertifikate. Dies passiert in Firefox, Chrome und IE.
So, ich habe versucht, SSLVerifyClient erforderlich und der webserver neu gestartet. Mit dieser option wird an Ort und Stelle, kann ich auch nicht herstellen einer SSL-Verbindung. Firefox sagt nur das die Verbindung zurückgesetzt wurde (andere Browser zeigen Ihre eigenen Versionen dieser Fehler als auch). Was ist komisch ist, dass die Protokolle zeigen keine Aktivität auf diese Verbindung versucht! I. e. access_log, error_log, ssl_access_log, ssl_error_log, UND ssl_request_log alle nicht zeigen ALLES; es ist, als ob der Versuch noch nie aufgetreten. Das ist frustrierend, denn es bedeutet, dass ich nicht einmal eine Fehlermeldung aus zu arbeiten. Nur ein webserver passiv-aggressiv erzählte mir, zur Hölle zu gehen.
Ich habe versucht, die Erzeugung/Installation von meinem eigenen client-Zertifikat manuell durch die PHP OpenSSL-Erweiterung. Das Zertifikat problemlos installiert, aber ich kann nicht finden alle Informationen auf, wie ordnen Sie das Zertifikat mit dem server (vorausgesetzt, ich sogar müssen?). Auch, es scheint nicht eh egal, da der Apache noch nicht einmal die Anforderung eines client-Zertifikats, wenn der optionale eingestellt ist. Und falls erforderlich eingestellt ist, es ist einfach explodiert, ohne Erklärung. Ich brauche es auf optional gesetzt werden, jedenfalls für dieses schema zu arbeiten.
Die Umwelt
OS: CentOS 5.7 64-bit (in VirtualBox)
Apache: 2.2.3
PHP: 5.3.10
Ich vermute, Sie brauchen mehr info, um mir zu helfen, so Fragen Sie bitte an! Ich versorge Euch mit dem, was Sie brauchen.
Zusammen zu fassen, ich muss wissen, wie man den Apache zum anfordern eines SSL-client-Zertifikat, da die Bedingungen wie oben beschrieben. Auch, wenn es irgendwelche speziellen Unterzeichnung/etc, was getan werden muss, um das client-Zertifikat "kompatibel" mit dem server-Zertifikat (wieder, OHNE dies manuell über die shell für jeden client-cert!), Ich muss das auch wissen.
Ich bin zu 100% fest auf dieser, wie jetzt. Kann nicht finden, was auch nur entfernt hilfreich, auf Google. Jede Hilfe Sie bereitstellen können, auf das wäre ENORM geschätzt!! Danke! =)
Ich habe versucht, erstellen Sie eine client-cert auf dem server, die openssl verwenden, exportieren als p12, dann installieren Sie in Firefox, aber jetzt bin ich immer einen "unable to get local issuer certificate" - Fehler vom Apache. Ich habe das client-Zertifikat unter Verwendung durch das server-Zertifikat, also warum funktioniert das nicht? Ich habe versucht, uncommenting die SSLCACertificateFile-line-in ssl.conf, aber dann, gerade wieder bei mir um das erste problem, das war die Seite geladen ist in Ordnung, aber ohne zu erkennen, das client-Zertifikat. Also nochmals, ich bin wieder auf Platz eins....
InformationsquelleAutor Kris Craig | 2012-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie brauchen, um zu konfigurieren, Apache Httpd auf Anforderung eines client-Zertifikats. Für diese, benötigen Sie mindestens zu verwenden
SSLVerifyClient optional
auf den Speicherort/Verzeichnis, das Sie wollen, um authentifiziert werden mit dieser Methode.Zweitens, die Zertifikate vom client gesendet wird, muss das Vertrauen der Apache-Httpd auch. (Könnte man im Prinzip verwenden
SSLVerifyClient optional_no_ca
lassen Sie jede client-cert durch den Apache Httpd-SSL/TLS-stack, und nur dann das Zertifikat überprüfen in PHP, aber das ist schon ein bisschen Arbeit, für die Sie müssen ein bisschen vorsichtiger sein, da das nicht unbedingt einfach code; noch wichtiger ist, dies wäre ziemlich nutzlos in diesem Zusammenhang, da Sie sich in einem Szenario, in dem man die Kontrolle der ZERTIFIZIERUNGSSTELLE.)Soweit ich das verstanden habe,
SSL_CLIENT_VERIFY
(eine variable, die ich noch nicht verwendet viel selbst) scheint nur wirklich nützlich, mit derSSLVerifyClient optional_no_ca
. Es könnte funktionieren mitSSLVerifyClient optional
, aber ich Zweifel so.SSLVerifyClient require
ablehnen werden verbindungen mit einem client-Zertifikat nicht vertrauenswürdig ist (von einer der Zertifizierungsstellen, die inSSLCACertificateFile
/SSLCACertificatePath
), oder wenn es kein Zertifikat. Soweit ich weiß,SSLVerifyClient optional
lassen Sie den client durch, ohne ein Zertifikat oder ein vertrauenswürdiges Zertifikat, aber auch ablehnen der Verbindung wenn das Zertifikat nicht vertrauenswürdig ist.Hier, durch die Ablehnung der Verbindung, ich meine das schließen der SSL/TLS-Verbindung abrupt mit einer Warnung. Es gibt keine chance, um zu produzieren, eine HTTP(S) - Fehler-Seite. Alle bekommen Sie in der standard-browser-Fehler, etwas entlang der Linien von
ssl_error_unknown_certificate_...
. (Sollten Sie diesen in Bezug auf die usability.)Ab dann, was Sie brauchen, ist Ihre eigene CA einrichten, möglicherweise web-basiert, mit in-browser-Taste-generation und innerhalb der gleichen website. Sie würde nicht wollen
SSLVerifyClient require
für, die, weil Sie benötigen würden, um die Benutzer, die nicht über ein Zertifikat verfügen, noch (verwenden Sieoptional
statt). Dieses wird gesagt, diese Richtlinie ist nicht anzuwenden auf den gesamten host, sondern kann auf bestimmte Pfade/Verzeichnisse.Integration Ihrer eigenen web-basierte ZERTIFIZIERUNGSSTELLE (oder, allgemeiner, die Erstellung Ihrer eigenen CA) ist nicht unbedingt einfach, wenn man neu auf all dies. Fertige tools gibt (z.B. OpenCA), oder Sie können bauen Sie Ihre eigenen Verwendung von verschiedenen bits von JavaScript/ActiveX, und Sie müssen die server-side-code zum verarbeiten der SPKAC-oder PKCS#10-requests (und zum Thema das eigentliche Zertifikat). (Für solche eine ZERTIFIZIERUNGSSTELLE, um nützlich zu sein, Sie würde wollen, dass der Benutzer ein neues Zertifikat beantragen, um einige Beweis von ID bei der Anmeldung, vielleicht ein Passwort.)
Wenn dies eingerichtet ist, konfigurieren Sie
SSLCACertificateFile
(oder...Path
), das CA-Zertifikat von deiner internen CA (ob es eine web-basierte ZERTIFIZIERUNGSSTELLE oder nicht, auf der gleichen Website ist oder nicht). (Natürlich halten die privaten Schlüssel der ZERTIFIZIERUNGSSTELLE der private, vielleicht konfiguriert innerhalb Ihrer CA-web-basierte Anwendung, Apache Httpd selbst nicht darüber wissen müssen.) Browser nur empfehlen, auch Zertifikate von diesen Zertifizierungsstellen oder Zwischenprodukte (es sei denn du hast auch so konfiguriertSSLCADNRequestFile
, die verwendet werden, zum senden der Liste der akzeptierten CAs statt).Beachten Sie, dass diese zwei Schritte (Einrichtung Ihres CA-und Aufbau Ihrer website für die Verwendung von client-Zertifikaten) wirklich unabhängig sind, in der Tat. Die Tatsache, dass beides Teil der gleichen Website kann bequem sein, ist aber nicht notwendig. Sie könnten versuchen, aus der Apache-Httpd einzurichten, ohne die Bereitstellung eine ganze CA auf der ersten Seite (ich würde empfehlen, dass, selbst wenn es sich nur um zu sehen, was Sie sich einlassen). Es gibt eine Reihe von tools zum erstellen Sie Ihre eigene kleine ZERTIFIZIERUNGSSTELLE, die sind überschaubar mit einer Handvoll Zertifikate: OpenSSL ist CA.pl oder TinyCA zum Beispiel. Sie können auch diese prüfzertifikate (
localhost
undtestclient
,testclient_r
wird widerrufen, wenn Sie wollen, verwenden Sie die CRL, die wahrscheinlich nicht notwendig ist auf den ersten): alle Passwörter sindtesttest
.Da hast du schon vorweggenommen (mit MySQL DB), werden Sie brauchen, um zu verwalten die Zertifikate, die Sie ausstellen und Ihre Zuordnung zu Benutzern.
SSL_CLIENT_M_SERIAL
undSSL_CLIENT_I_DN
sind nicht die richtigen Variablen zu verwenden, obwohl.SSL_CLIENT_I_DN
ist die Issuer-DN (also die CA Betreff-DN). Was würden Sie suchen, istSSL_CLIENT_S_DN
: das client-cert-Subject-DN.SSL_CLIENT_M_SERIAL
ist das Zertifikat, Seriennummer: verwenden Sie es nicht, da es einmalig pro Zertifikat: ein Benutzer kann mehrere Zertifikate mit dem gleichen Subject-DN (z.B. wenn eine abgelaufen ist oder widerrufen wurde).Trotz all dieser, ich bin mir nicht sicher, ob die client-Zertifikate sind der beste Weg, um Ihr Ziel zu erreichen (lassen Sie die Mitarbeiter in Ihrem Unternehmen anmelden, ohne Passwort).
Erstens, sollte der Nutzer zu schützen, die Ihre eigenen Zertifikate mit einem Passwort eh. Was Sie wirklich nach, ist irgendeine form von Single-Sign-On (SSO), denke ich.
Zweitens, je nach dem Grad der computer-literacy Benutzer können Zertifikate tatsächlich sehr schwierig sein, zu verwalten.
Die Tatsache, dass das Wort "Zertifikat" ist, streng genommen, nicht die privaten Schlüssel zu allem, aber manchmal bedeutet die Nutzung des privaten Schlüssels kann verwirrend sein für einige. Auf der einen Seite, Sie hören manchmal "Importieren Sie Ihr Zertifikat in Ihrem browser" und "Ihr Zertifikat zum einloggen"; auf der anderen Seite, können Sie auch hören "senden Sie mir Ihr Zertifikat". Der ehemalige impliziert, Verwendung und Verfügbarkeit von den privaten Schlüssel ("Zertifikat" könnte nur bedeuten
.p12
in diesen Ausdrücken). Letzteres definitiv, sollte nicht mit dem privaten Schlüssel.Browser-Benutzeroberflächen neigen dazu, ziemlich schlecht oder verwirrend für die Verwaltung der Zertifikate oder Abmelden. Wieder, wenn das Zertifikat nicht anerkannt wird, wird das SSL/TLS-Verbindung wird nicht hergestellt werden, so dass der web-server nicht die chance bekommen, zur Anzeige einer HTML-Fehlerseite jeglicher Art.
Vielleicht könnten Sie auch prüfen, andere Formen der SSO (z.B. CAS, etwas SAML-basierte oder Kerberos/SPNEGO.)
InformationsquelleAutor Bruno
Können Sie einen Blick auf die apache-doc wenn nicht bereits erfolgt.
Das Allgemeine Prinzip ist, dass Sie schaffen Sie Ihre selbst-signiertes Zertifikat und überprüfen Sie es, bevor Sie versuchen, es zu benutzen.
Dann sieht es aus wie der client eine Verbindung zu Ihrem intranet-site über http. Von dort aus gibt es viele verschiedene Möglichkeiten zum Umschalten auf https mit ssl-cert. Der einfachste Weg ist die Verwendung des apache-rewrite-Modul. Aber in Ihrem Fall, wie Sie sind, die php/mysql prüft, können Sie leiten Sie Ihre Kunden von http auf https, das ist nicht der einfache Weg.
In jedem von beiden Fällen (apache automatische Weiterleitung über mod_rewrite, oder die Umleitung von cascading-tests (php/javascript/html), die Sie benötigen, um Ihre 2 vhosts (einen für http und einen für https) in der richtigen Weise, aber dies nimmt einige Hypothese.
Beispiel (debian - apache 2.2), wird hier eine automatische Umleitung erfolgt von Apache (z.B. 1. Fall oben beschrieben) :
cat /etc/apache2/sites-available/test
Den zweiten virtuellen host für SSL :
cat /etc/apache2/sites-available/test-ssl -
Ihrem Fall könnte aufzuschieben, etwas von diesem, z.B. Sie haben nicht die redirect-Teil in der 1. vhost, aber nur einen einfachen vhost und der zweite für https (ssl). Die Umleitung erfolgt durch die php/javascript-sobald Sie erreicht haben, Ihre mysql prüft.
Hier ist ein Beispiel Auszug aus einer php-Klasse für den Weg zur Kaskade der Wechsel von http zu https mit php, dann javascript, dann html :
Hoffe, es hilft Ihnen, besser zu verstehen, wie Sie Vorgehen und passen dieses Konzept zu Ihrem konkreten Fall.
Ich habe versucht, erstellen Sie eine client-cert auf dem server, die openssl verwenden, exportieren als p12, dann installieren Sie in Firefox, aber jetzt bin ich immer einen "unable to get local issuer certificate" - Fehler vom Apache. Ich habe das client-Zertifikat unter Verwendung durch das server-Zertifikat, also warum funktioniert das nicht? Ich habe versucht, uncommenting die SSLCACertificateFile-line-in ssl.conf, aber dann, gerade wieder bei mir um das erste problem, das war die Seite geladen ist in Ordnung, aber ohne zu erkennen, das client-Zertifikat.
Sorry, dass ich besser verstehe Ihren Punkt, und jetzt haben keine andere einfache Lösung als Verbindung http-und https Umschalten, sobald mysql-Prüfungen wurden durchgeführt nach der Anmeldung, die aussieht wie ein sicherer Ansatz für mich doch eine Recht große code-Verbraucher durch Erfahrung.
Das hat nichts mit der Frage zu tun.
InformationsquelleAutor hornetbzz
Ich habe ein ähnliches problem mit:
Nach einigen versuchen habe ich dann erkennt mein problem.
Wenn ich
SSLVerifyClient optional
oderSSLVerifyClient optional_no_ca
und ich geben Sie auchSSLCACertificateFile
oderSSLCACertificatePath
Apache erwirbt das client-Zertifikat nur dann, wenn es losgelassen wird, von CA gefunden in der CA-Referenz-Datei/- Pfad in der Konfiguration angegebenen.InformationsquelleAutor lgaggini