2010-12-30 4 views
20

Ich möchte AJAX-Aufrufe an einen sicheren Server senden, der ein selbstsigniertes Zertifikat verwendet. In der Umgebung, in der meine App verwendet wird, ist dies in Ordnung - ich kann das CA-Zertifikat Benutzern zur Verfügung stellen und sie vor der Verwendung der App installieren lassen. Manchmal versucht ein Benutzer jedoch, die App vor der Installation der Zertifikate zu besuchen. In diesen Fällen schlägt die App automatisch fehl - zumindest in Firefox (der am häufigsten auftretende Fall des Problems) scheint der Anruf still zu enden, ohne dass sogar der Fehlerhandler ausgelöst wird. FWIW, wenn der Benutzer eine tatsächliche Seite auf dem Server besucht, erhalten sie eine Zertifikatwarnung.AJAX-Aufrufe an nicht vertrauenswürdige (selbstsignierte) HTTPS schlagen im Hintergrund fehl

Ich könnte in einem Workaround hacken - sagen, eine Heartbeat/Ping-Anfrage machen und einen Watchdog-Timer einrichten, um zu sehen, ob der Server rechtzeitig reagiert - aber das scheint, nun, Hacky. Ich würde es vorziehen, die Verbindung im Voraus zu testen. Was ist der "richtige" Weg, um sicherzustellen, dass der Server, mit dem Sie sprechen möchten, über ein vertrauenswürdiges Zertifikat in Javascript verfügt? Wenn es einen Unterschied macht, mache ich meine AJAX-Anfragen über JQuery.

UPDATE: Es gibt eine tolle Pointe hier. Es stellte sich heraus, AJAX war überhaupt nicht das Problem. Ich war mir sicher, basierend auf den Symptomen, dass es mit den selbstsignierten Zertifikaten zusammenhing, aber das Fehlen von AJAX-Fehlern war beunruhigend, vor allem. Geben Sie die Spezifikation in der Antwort unten an. Ein anderes Teammitglied hat es genagelt: Die AJAX-Fehlerhandler feuern nicht ab, weil JQuery nie geladen wurde! Wir haben JQuery aus einer anderen Subdomain unserer Site übernommen, die ebenfalls auf HTTPS gehostet wurde - und Benutzer hatten Ausnahmen für unsereService.example.com, aber nicht für js.example.com hinzugefügt. Anscheinend, wenn Sie ein <script>-Tag auf nicht vertrauenswürdige sichere Verbindung zeigen, , die auch stumm schlägt.

{/} headdesk

+0

Ist das Verhalten, das Sie sehen, anders, als dass Sie den Server überhaupt nicht kontaktieren können, z. B. wenn Ihre Netzwerkverbindung verloren geht? – martona

Antwort

14

XMLHttpRequests (AJAX-Requests) sind nur zulässig, auf der gleichen Ursprungs-Servern. Das heißt, das Schema: // host: Der Port-Teil der Ziel-URL muss mit dem des aktuellen Dokuments übereinstimmen. Laut Spezifikation sollten Sie nicht einmal die SSL-URL von der Nicht-SSL-Anfrage anfordern können.

Die weniger hackish Lösung, die ich sehe, ist, dass Sie nur zwingen, alle Benutzer auf die SSL-Site umleiten. Auf diese Weise werden sie gezwungen, die Zertifikatswarnung zu sehen, bevor eine AJAX-Anfrage gestellt werden kann.

Hinweis: Die Spezifikation besagt auch, dass im Fall von TLS-Handshake-Fehler (die ich unterstellt, dass dieser Fall in gewisser Weise fällt) eine Ausnahme NETWORK_ERR (Code 19) werfen sollte. Sie könnten versuchen, die Ausnahme abzufangen, wenn Sie die AJAX-Anfrage starten. Weitere Informationen finden Sie unter the spec zur Fehlerbehandlung.

+2

Sie waren im ersten Absatz korrekt und nicht im zweiten. Kein Browser erlaubt frei eine XMLHTTPRequest von HTTP zu HTTPS gemacht werden. Einige Browser (z. B. Firefox) haben einen Opt-in-Erlauben-Mechanismus (z. B. die Zugriffssteuerungs-Erlaube-Origin-Header). IE hat keinen solchen Mechanismus. – EricLaw

+0

Danke für die Bestätigung, ich habe es weg geschnitten. – Seldaek

Verwandte Themen