2010-12-30 10 views
20

Chcę wykonywać wywołania AJAX na bezpieczny serwer korzystający z samopodpisanego certyfikatu. W środowisku, w którym jest używana moja aplikacja, wszystko jest w porządku - mogę dostarczyć certyfikat CA użytkownikom i zainstalować je przed użyciem aplikacji. Czasami jednak użytkownik próbuje odwiedzić aplikację przed zainstalowaniem certyfikatów. W takich przypadkach aplikacja po cichu zawiedzie - przynajmniej w Firefoksie (najczęstszy przypadek problemu), wygląda na to, że połączenie cichnie umiera, nawet bez odpalania procedury obsługi błędów. FWIW, jeśli użytkownik odwiedza na serwerze rzeczywistą stronę, otrzyma ostrzeżenie zaświadczenie.Połączenia AJAX z niezaufanym (samopodpisanym) HTTPS nie działa dyskretnie

Mogę włamać się do obejścia - powiedzmy, zrób zapytanie o puls/ping i skonfiguruj zegar watchdoga, aby sprawdzić, czy serwer zareaguje na czas - ale to wydaje się, cóż, hacky. Wolałbym przetestować połączenie z wyprzedzeniem. Jaki jest "właściwy" sposób, aby upewnić się, że serwer, z którym chcesz rozmawiać, ma zaufany certyfikat z poziomu Javascript? Jeśli to robi różnicę, robię moje żądania AJAX przez JQuery.

AKTUALIZACJA: Tutaj jest niesamowita cisza. Okazuje się, że AJAX nie był problemem. Byłem pewny na podstawie symptomów, które były związane z samopodpisanymi certyfikatami, ale brak błędu AJAX był niepokojący, szczególnie. biorąc pod uwagę specyfikację związaną z odpowiedzią poniżej. Inny członek zespołu przybił do niego: programy do obsługi błędów AJAX nie uruchamiały się, ponieważ JQuery nigdy nie została załadowana! Uwzględniliśmy JQuery z innej subdomeny naszej witryny, również hostowanej na HTTPS - i użytkownicy dodali wyjątki dla naszej usługi Service.example.com, ale nie js.example.com. Wygląda na to, że jeśli wskażesz znacznik <script> na niezaufanym bezpiecznym połączeniu, to również ulegnie awarii po cichu.

{/ headdesk}

+0

Czy obserwowane zachowanie różni się od niemożności skontaktowania się z serwerem w ogóle, na przykład po zaniku połączenia sieciowego? – martona

Odpowiedz

14

XMLHttpRequests (żądań AJAX) są dozwolone tylko na serwerach tego samego pochodzenia. Oznacza to, że schemat: // host: część portu docelowego adresu URL musi być zgodna z bieżącym dokumentem. Zgodnie ze specyfikacją nie powinno się nawet zezwalać na żądanie adresu URL SSL z adresu innego niż SSL.

Mniej hackowskie rozwiązanie, które widzę, to po prostu wymuszenie przekierowania wszystkich użytkowników do witryny SSL. W ten sposób będą zmuszeni zobaczyć ostrzeżenie o certyfikacie, zanim będzie można wysłać żądanie AJAX.

Uwaga: Specyfikacja mówi również, że w przypadku niepowodzenia uzgadniania TLS (co przypuszczam, że ten przypadek jest objęty, w pewnym sensie) powinien spowodować wyjątek NETWORK_ERR (kod 19). Możesz spróbować uchwycić wyjątek podczas inicjowania żądania AJAX. Więcej informacji na temat obsługi błędów można znaleźć w artykule the spec.

+2

Masz rację w pierwszym akapicie, a nie w drugim. Żadna przeglądarka nie zezwoli na wysyłanie żądania XMLHTTPRequest z protokołu HTTP do HTTPS. Niektóre przeglądarki (na przykład Firefox) mają mechanizm zezwolenia na akceptację (na przykład nagłówki Access-Control-Allow-Origin). IE nie ma takiego mechanizmu. – EricLaw

+0

Dzięki za potwierdzenie, wydałem je. – Seldaek

Powiązane problemy