Wir verfügen über eine C # -Web-App, über die Nutzer mithilfe eines in ihren Browsern gespeicherten digitalen Zertifikats eine Verbindung herstellen können.
Aus den Beispielen, die wir gesehen haben, wird die Überprüfung ihrer Identität einfach, sobald wir SSL aktivieren, da wir mit Request.ClientCertificate auf die Felder im Zertifikat zugreifen können, um den Namen des Benutzers zu überprüfen.
Wir wurden jedoch auch gebeten, die vom Benutzer gesendeten Daten (einige einfache Felder und eine Binärdatei) zu signieren, damit wir zweifelsfrei nachweisen können, welcher Benutzer jeden Datensatz in unserer Datenbank eingegeben hat.
Unser erster Gedanke war, eine kleine Textsignatur einschließlich der Felder (und, wenn möglich, des MD5 der Datei) zu erstellen und sie mit dem privaten Schlüssel des Zertifikats zu verschlüsseln, aber ...
Soweit ich weiß, können wir nicht auf den privaten Schlüssel des Zertifikats zugreifen, um die Daten zu signieren, und ich weiß nicht, ob es eine Möglichkeit gibt, die Felder im Browser zu signieren, oder wir haben keine andere Möglichkeit als Verwenden eines Java-Applets. Und wenn es das Letztere ist, wie würden wir es machen (Gibt es ein Open-Source-Applet, das wir verwenden können? Wäre es besser, wenn wir selbst eines erstellen würden?)
Natürlich wäre es besser, wenn es eine Möglichkeit gäbe, die auf dem Server empfangenen Felder zu "signieren", indem wir die Daten verwenden, auf die wir vom Zertifikat des Benutzers zugreifen können. Aber wenn nicht, würde jede Information über den besten Weg zur Lösung des Problems geschätzt werden.
Ich empfehle Ihnen, Java-Applet zu verwenden. Dieser Ansatz ist für alle Browser einheitlich. Wir verwenden es in unseren Projekten. Um die Benutzerdaten zu signieren, müssen Sie die JCA API ( Ссылка <) verwenden / a>). Außerdem müssen Sie das Problem beim Zugriff auf den Windows-Zertifikatsspeicher von Java lösen.
Sie können es auf diese Weise lösen:
%Vor%Sie müssen Ihre Rechtsabteilung fragen, ob dies ein starkes "Signieren" ist, aber bei jedem Posten der Felder muss der Server die Feldwerte und den Fingerabdruck des Zertifikats vom Handshake des Client-Zertifikats aufzeichnen. Ja, das ist "fälschbar", da jeder, der den Fingerabdruck kennt, einen gefälschten Datensatz in der Datenbank erstellen könnte, aber mit angemessener Datenbanksicherheit können Sie diesen Angriffsvektor entfernen und eine Aufzeichnung darüber haben, wer was gepostet hat (da Sie den Fingerabdruck nicht fälschen können) des Client-Zertifikats in einer Zwei-Wege-Authentifizierung von SSL)
Wir können nicht auf den privaten Schlüssel des Zertifikats zugreifen, um die Daten zu signieren,
Wenn dies nicht der Fall war, konnte sich der Server das Zertifikat selbst merken und es verwenden, um bei anderen Diensten als echter Client zu erscheinen.
i.e. würde die Verwendung von Client-Zertifikaten für die Authentifizierung des Clients vollständig ungültig machen.
und ich weiß nicht, ob es eine Möglichkeit gibt, die Felder im Browser zu signieren,
Wie wäre es, diese Frage mit geeigneten clientseitigen Tags (z. B. JavaScript, Browser) zu stellen, um die richtige Zielgruppe zu erreichen? (Ich bin sicher, dass es mit der Browsererweiterung oder dem ActiveX-Objekt gemacht werden könnte - aber das erzeugt seine eigenen Probleme.)
Es gibt eine JavaScript-Methode crypto.signText, die es ermöglicht, beliebigen Text mit Client-Zertifikat zu signieren. Hier sind einige Dokumente und ein signiertes Formularbeispiel . Es scheint, derzeit nur Firefox unterstützt es.
Für IE gibt es CAPICOM ActiveX-Objekt (verfügbar als Download von MS). Hier ist ein Beispiel für seine Verwendung.
Ich bin mir nicht sicher über die Unterstützung für diese Funktionen in verschiedenen Browser- und Betriebssystemversionen, Sie müssen es wahrscheinlich für Ihre Konfiguration überprüfen.
Tags und Links asp.net-mvc javascript c# browser x509certificate