AJAX вызывает ненадежный (самозаверяющий) HTTPS молча - PullRequest
20 голосов
/ 30 декабря 2010

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

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

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

{/ headdesk}

1 Ответ

14 голосов
/ 30 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...