Подтвердить что ты не робот

AJAX обращается к ненадежным (самоподписанным) HTTPS сбойным путем

Я хочу сделать AJAX-вызовы на безопасный сервер, который использует самозаверяющий сертификат. В среде, где мое приложение используется, все в порядке - я могу предоставить сертификат CA для пользователей и установить их перед использованием приложения. Однако иногда пользователь пытается посетить приложение перед установкой сертификатов. В этих случаях приложение тихо проваливается - по крайней мере, в Firefox (наиболее распространенный случай проблемы), похоже, что звонок бесшумно умирает, даже не отключая обработчик ошибок. FWIW, если пользователь посещает фактическую страницу на сервере, они получают предупреждение о сертификации.

Я мог бы взломать обходной путь - скажем, сделать запрос heartbeat/ping и настроить сторожевой таймер, чтобы увидеть, отвечает ли сервер вовремя, - но это кажется, ну, взломанным. Я предпочел бы иметь возможность проверить соединение раньше времени. Какой "правильный" способ убедиться, что сервер, с которым вы хотите поговорить, имеет надежный сертификат из Javascript? Если это имеет какое-то значение, я выполняю свои запросы AJAX через JQuery.

ОБНОВЛЕНИЕ: Здесь есть потрясающая фишка. Оказывается, AJAX не проблема. Я был уверен, что на основании симптомов, что это было связано с самозаверяющими сертификатами, но отсутствие ошибки AJAX вызывало беспокойство, особенно. с учетом спецификации, указанной в ответе ниже. Другой член команды прибил его: обработчики ошибок AJAX не стреляли, потому что JQuery никогда не загружался! Мы включили JQuery из другого субдомена нашего сайта, также размещенного на HTTPS, и пользователи добавили исключения для нашего сайта .example.com, но не js.example.com. Очевидно, если вы укажете тэг <script> в безопасном безопасном соединении, это тоже не работает.

{/headdesk}

4b9b3361

Ответ 1

XMLHttpRequests (запросы AJAX) разрешены только на серверах одинакового происхождения. Это означает, что схема://host: часть порта целевого URL должна совпадать с частью текущего документа. Согласно спецификации, вам даже не разрешается делать запрос по URL-адресу SSL из не-SSL.

Менее хакерское решение, которое я вижу, это то, что вы просто принудительно перенаправляете всех пользователей на сайт SSL. Таким образом, они будут вынуждены видеть предупреждение сертификата перед любым запросом AJAX.

Примечание. Спецификация также говорит, что в случае сбоя рукопожатия TLS (который я предполагаю, что этот случай подпадает под каким-либо образом) он должен выбросить исключение NETWORK_ERR (код 19). Вы можете попытаться поймать исключение при запуске запроса AJAX. Подробнее см. спецификацию для обработки ошибок.