26 Stimmen

Gibt es eine Möglichkeit, SSL-Zertifikatsdetails mit JavaScript abzurufen?

Ich möchte bestimmte Details zu einem SSL-Zertifikat auf einer bestimmten Website erfassen. Ich weiß, dass dies mit dem openssl-Tool unter Linux/MacOSX ganz einfach ist. Ist das Gleiche oder etwas Ähnliches auch in JavaScript möglich?

Ich weiß, dass der Browser Socket-Verbindungen verarbeitet und dass der SSL-Handshake stattfindet, bevor eine Partei Daten sendet. Jedoch in einer XMLHTTPRequest, würde ich gerne wissen, ob es möglich ist, diese Details als eine Art von Antwort-Code usw. zu erhalten?

0 Stimmen

Ich glaube nicht, dass dies möglich ist.

0 Stimmen

Ich habe nach einer Javascript-API gesucht, um die bewährten Anmeldeinformationen von seitenübergreifenden Anfragen zu testen, um die Sicherheit der Website zu verbessern. Leider verwirft der Browser diese Informationen, was die Skripte dazu zwingt, blind darauf zu vertrauen, dass Inhalte von Drittanbietern jetzt vertrauenswürdig sind, weil sie in der Vergangenheit vertrauenswürdig waren. Das ist ein trauriger Zustand :-(

1 Stimmen

Manche Leute fügen den Antwortkopfzeilen Zertifizierungsdetails hinzu. In diesem Fall könnten Sie eine xhr-Anfrage stellen und die req.getAllResponseHeaders() lesen

15voto

Nick Craver Punkte 609016

Diese Information wird einfach nicht an Javascript weitergegeben, da sie so selten verwendet wird (eigentlich nie, da sie nicht verfügbar ist, aber sie würde selten verwendet werden), dass es nicht als wichtig genug, um das Javascript-Objektmodell hinzufügen ich vermute, ... gleich für jede sehr selten verwendete Funktion links aus etwas.

Natürlich könnte es auch aus Sicherheitsgründen weggelassen worden sein... Ich bin im Moment nicht kreativ genug, um mir etwas einfallen zu lassen, aber ich bin mir sicher, dass auch hier ein Exploit zu finden ist.

2 Stimmen

@GregS - Mir fällt auch keine ein... aber das habe ich schon 100 Mal gesagt, und irgendjemand wird schon eine Schwachstelle finden, die ich kenne. niemals Ich nehme an, dass ich eine andere Denkweise habe... also habe ich diese Option nur in Betracht gezogen. Wenn Sie das fragliche Javascript hosten würden, hätten Sie dann nicht bereits das Zertifikat? Das ist es, was mich zu der Annahme führt, dass es eine ruchlose Nutzung geben könnte. irgendwie für diese. Wie ich schon sagte, ist das definitiv nicht mein Fachgebiet. Ich überlasse es Ihnen und anderen, die sich auf diesen Bereich spezialisiert haben, herauszufinden, was möglich sein könnte.

0 Stimmen

Danke Nick, ich schätze, ich werde darüber nachdenken müssen, wie man SSL-Details auf der Client-Seite plattformübergreifend abrufen kann, ohne JS oder die Installation alternativer Binärprogramme (wie openssl, curl/wget).

2 Stimmen

Es würde die Sicherheit meiner Seiten verbessern, wenn ich Javascript verwenden könnte, um zu prüfen, ob eine Website eines Drittanbieters, von der ich Inhalte einbette, immer noch dieselbe Entität ist, der ich vertraute, als ich die Seite erstellte. Gegenwärtig macht sich der Browser die Mühe, diese Informationen zu prüfen, und verwirft sie dann, was meine Seiten dazu zwingt, davon auszugehen, dass heute noch eine Vertrauensbeziehung besteht, weil es in der Vergangenheit eine gab. Ich hätte Ihren Beitrag fast mit "1" bewertet, weil er blinden FUD versprüht. Es gibt keine Vorteile, wenn man weiß, mit wem man spricht. Bitte überdenken Sie Ihre Antwort noch einmal.

7voto

John Feminella Punkte 292907

Das Zertifikat ist nicht Teil des DOM, daher ist dies nicht möglich. Entschuldigung!

4 Stimmen

Ja, traurig aber wahr. Wir brauchen also einige besorgte Stakeholder, die dem W3C, Mozilla, Chromium (und Safari und Edge werden nachziehen, sobald es CVEs gegen ihre Plattformen gibt, weil sie nicht folgen) tatsächlich etwas Lärm machen.

3voto

Sean Punkte 781

Nein, das ist nicht möglich.

Es ist möglich, über Javascript zu erkennen, ob die aktuell angezeigte Seite über eine SSL-Verbindung läuft (document.location.protocol=="https:"), aber das war's auch schon.

0 Stimmen

Und dann können Sie das document.location Wert an einen REST-Dienst, um die Zertifikatsinformationen zu erhalten.

0 Stimmen

@Saber der "Mann in der Mitte"-Typ des Angriffs würde immer noch ein Problem darstellen... Ich möchte die Signatur des öffentlichen Schlüssels des Zertifikats überprüfen, um sicherzustellen, dass der Browser direkt mit mi Server. Aber ja, interessante Idee... eine Untersuchung wert...

3voto

Gregor y Punkte 1366

Der aktuelle JS-Sprachstandard stellt keine Zertifikatsinformationen zur Verfügung; darüber hinaus hängt es wahrscheinlich davon ab, wie Sie JavaScript verwenden. Wenn Sie erwarten, dass der Browser des Endbenutzers Zertifikatsinformationen zur Verfügung stellt, dann wird es wirklich problematisch, weil Sie mindestens FF, Chrome, Safari, IE, Edge, ... dazu bringen müssen, sie zur Verfügung zu stellen.

Wie in diesem Artikel erwähnt, ist jedoch Stelle für Informationssicherheit Dies ist keine wünschenswerte Option für diese Browser, da ein Website-Entwickler einen Code schreiben könnte, der fälschlicherweise den Anmeldedaten des Benutzers vertraut.

Es ist nicht so sehr ein Sichtbarkeits-Sicherheitsrisiko, das Javascript daran hindert, auf die aktuellen SSL-Zertifikatsinformationen des Browsers zuzugreifen, sondern eher ein Sicherheitsrisiko der vierten Wand, bei dem sich der JS-Entwickler bewusst sein muss, dass das "vom Benutzer akzeptierte" Zertifikat nicht unbedingt das von der Website bereitgestellte ist. Die HTML-Seite sollte die Sicherheitsprobleme nicht mit clientseitigem Code behandeln, sondern sich darauf verlassen können, dass die Sicherheitsschicht ihre Aufgabe ordnungsgemäß erfüllt. (Ich kann durchaus verstehen, dass man die Sicherheitsebene überprüfen möchte, aber jede Verwaltungsarbeit, die man auf der obersten Ebene leistet, wird entweder nur oberflächlich sein oder eine Überarbeitung der gesamten Biosphäre bedeuten)

Denn nehmen wir einmal an, dass Javascript eine Möglichkeit bietet, mit dem Zertifikat zu arbeiten, dann gibt es keine Möglichkeit, den folgenden Austausch zu stoppen, wenn Bob Mallory bereits vertraut, weil seine Sicherheit gebrochen ist:

Büroangestellter Bob befindet sich auf der einen Seite der großen Firewall von Mega Corp., IT Mallory ist für die Firewall zuständig, die den Datenverkehr in und aus dem Unternehmen leitet, und die fantastische Website von Web Host Alice ist im WWW zu finden.

  1. Gemäß der Firmenpolitik der Mega Corp. ist Bob dazu angehalten, Mallorys Aussagen für bare Münze zu nehmen.
  2. Bob, der die Website von Alice besuchen möchte, aber keinen direkten Zugang von außen hat, versucht, eine sichere Verbindung durch die Firewall herzustellen, indem er sein Zertifikat hochhält (z. B.: "Ich erkläre hiermit, dass ich Bob bin") und Alice auf sehr umständliche Weise fragt: "Welches Zertifikat habe ich dir geschickt?"
  3. Mallory erhält Bobs Anfrage, gibt aber stattdessen ihre eigene weiter (z. B.: "Äh, Bob sagt, ich darf seine Webmail lesen"), und obwohl Mallory Bobs verworrene Frage nicht versteht, wiederholt sie sie gegenüber Alice: "akdvyfenwythnwerhy?".
  4. Alice rechnet nach und findet heraus, dass "akdvyfenwythnwerhy?" die Frage "Welches Zertifikat habe ich dir geschickt?" bedeutet und antwortet Mallory mit dem, was sie sieht ("Hallo Bob, hier ist Alice, wie du gesagt hast: Äh, Bob sagt, ich darf seine Webmail lesen").
  5. Mallory rechnet ein wenig nach, hat einen Aha-Moment "akdvyfenwythnwerhy?=welches Zertifikat habe ich dir geschickt?", und beantwortet Bobs Frage im Namen von Alice("Hallo Bob, hier ist Alice( Mallory ) sagten Sie: Ich erkläre hiermit, dass ich Bob bin").
  6. Bob glaubt, dass das Leben gut ist und liest weiter seine Webmail, denn er weiß, dass Mallory ihn niemals anlügen würde.
  7. Mallory ist nun in der Lage, beide Seiten des Gesprächs zu lesen und leitet Bobs Anfrage, seine Webmail zu lesen, an Alice weiter.
  8. Alice erhält Bobs Anfrage und sagt: "Hey, Moment mal, Bob, du musst diesen JS-Code ausführen, um zu beweisen, dass du weißt, dass du mit Alice sprichst.
  9. Mallory holt sich den Code, führt ihn aus und schickt die Ergebnisse, die besagen, dass sie weiß, dass sie mit Alice spricht, an Alice zurück.
  10. Alice sagt: "Das reicht mir, hier ist deine Webmail.
  11. Mallory liest Bobs Webmail, bevor sie sie an Bob weitergibt, und alle sind glücklich.

(Hinweis: Ich habe nicht auf den Fall, wenn Sie JS-Server-seitig ausgeführt werden, dann würde es davon abhängen, welches Programm Sie verwenden, um Ihre JS-Code ausführen).


Edit 4/4/2018 -- Während das obige nicht falsch ist, ist es mehr aus der Perspektive von eingebettetem und verlinktem JS als über das JS-Objekt `XMLHTTPRequest`; außerdem ist das stärkste Argument gegen die gemeinsame Nutzung von PKI-Details mit `XMLHTTPRequest` folgendes:

Es muss eine klare Trennlinie zwischen dem HTTP-Teil und dem S-Teil des HTTPS-Protokolls bestehen bleiben. JavaScript und seine XMLHTTPRequest Objekt befindet sich auf der HTTP(app layer)-Seite dieser Linie, während der gesamte Zertifikatsaustauschprozess auf der S(trans/sec layer)-Seite dieser Linie stattfindet. Um die Sicherheitsseite atomar (hot-swap-fähig) zu halten, kann ihre interne Arbeitsweise nicht über die Leitung zur Anwendungsseite offengelegt werden; denn es könnte der Tag kommen, an dem die Transport-/Sicherheitsschicht keine PKI-Zertifikate mehr verwendet, um ihren sicheren Kommunikationsdienst zu erleichtern, und wenn dieser Tag kommt, müsste niemand bestehenden JS-Code umschreiben, der sich auf die in diesen Zertifikaten enthaltenen Details verließ, um mit der Ausbreitungswelle fertig zu werden, die dadurch verursacht wird, dass die www-Gemeinschaft langsam ihre bevorzugte Variante einer neuen Sicherheitsschicht annimmt.

Abgesehen davon scheint die Sicherheitsseite auch die Überprüfung von Rechtssubjekten vorzunehmen - zumindest in einigen Fällen wie EV-Zertifikaten -, und das ist IMO ein Manko der RFC7230 Abschnitt 2.7.2 dass sie nicht den Begriff authority der https-URI um eine optionale legalentity die die Sicherheitsschicht verwenden würde, um zu überprüfen, ob die URL, mit der sie kommuniziert, nicht nur der richtige Endpunkt ist, sondern auch unter der Kontrolle der beabsichtigten Geschäftsbeziehung steht.

authority     = [ userinfo "@" ] host [ "#" legalentity ] [ ":" port ]
legalentity   = *( unreserved / pct-encoded / sub-delims )

1 Stimmen

Ihre Antwort geht nicht auf die Frage ein. Die Frage war, ob Javascript auf die Daten im Zertifikat zugreifen kann, was bereits durch die Transportschicht des Browsers bewiesen wurde. Leider verwirft der Browser sie. Nichts in seiner Frage implizierte die Implementierung des Transports in Javascript oder die Umgehung der Transportsicherheit. -1

0 Stimmen

@Wil, bei der Betrachtung Ihrer Kommentare über den Thread verteilt Ich glaube, Sie versuchen, JS zu verwenden, wenn Sie an einer PHP-oder ASP-Lösung suchen sollten. JS ist clientseitig und wenn Sie versuchen, Zertifikatsinformationen auf dem Computer eines Benutzers zu überprüfen, ist das ein wenig zu spät im Spiel.

0 Stimmen

Ich glaube, Sie vernachlässigen die Tatsache, dass echte Anwendungen geschrieben werden, um im Browser zu laufen - Anwendungen, die in der Lage sein sollten, eine einfache Sache zu tun, wie z.B. zu beweisen, dass sie mit der Gegenstelle sprechen, mit der sie sprechen wollen. PHP läuft nicht im Browser. ASP läuft nicht im Browser. Die Zukunft gehört nicht den serverseitigen Anwendungen. Wenn eine Anwendung daran gehindert wird, die Identität einer Gegenstelle nachzuweisen, wird die Sicherheit des Transports von SSL-EV auf SSL-broken cert reduziert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X