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

Запрос HTTPS на HTTP JSONP

У меня возникают проблемы с отправкой JSONP-запросов с сайта HTTPS сайта на HTTP.

У меня есть (не локальная) тестовая среда поверх https (с действительным сертификатом), где я могу успешно запускать все эти кросс-сайты/ "кросс-протокол" (с предупреждениями, но без ошибок).

Выход консоли Javascript в Google Chrome:

The page at https://my.test.environment/ ran insecure content from http://non.secure.site/service?jsonCallback=jsonp1331132928704

Однако в процессе производства (в Google App Engine, subdomain appspot) Google Chrome блокирует все запросы, ожидающие подтверждения пользователя.

Выход консоли Javascript в Google Chrome (особое внимание уделяется [заблокирован]):

[blocked] The page at https://production.appspot.com/ ran insecure content from http://non.secure.site/service?jsonCallback=jsonp1331132928704

Я знаю, что я делаю, это не безопасно, но эти услуги предоставляются сторонними компаниями, и пока нет связи SSL. Я действительно смущен этим, потому что я не понимаю, почему работает (с предупреждениями) в тестовой среде, а не в apppot (Google App Engine).

Я попытался исследовать заголовки без успеха.

Заголовки тестовой среды:

Connection:Keep-Alive
Content-Encoding:gzip
Content-Language:es
Content-Length:2524
Content-Type:text/html;charset=utf-8
Date:Wed, 07 Mar 2012 15:48:30 GMT
Keep-Alive:timeout=15, max=100
Set-Cookie: cookie_info...
Vary:Accept-Encoding

Заголовки APPSpot:

access-control-allow-credentials:false
access-control-allow-origin:*
cache-control:no-cache, must-revalidate
content-encoding:gzip
content-length:47890
content-type:text/html; charset=utf-8
date:Wed, 07 Mar 2012 14:52:02 GMT
expires:Fri, 01 Jan 1990 00:00:00 GMT
pragma:no-cache
server:Google Frontend
set-cookie: coookie_info....
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1

Я не знаю, почему это работает на тестовом envinroment, и тот же подход заблокирован на APPSpot Google Chrome.

Любые мысли?

4b9b3361

Ответ 1

Прокси-сервер Apache выполнит запрос к конечной точке от вашего имени. У вас даже могут быть запросы, отличные от jsonp, для службы (json, xml, images, post, put, delete и т.д.), Поскольку браузер считает, что он выполняет запрос в тот же домен.

Ваш файл vhost.secure.site vhost будет содержать что-то вроде

ProxyRequests Off
ProxyPreserveHost On 
<Proxy *>
    Allow from all
</Proxy>
ProxyPass /appspot https://production.appspot.com/
ProxyPassReverse /appspot https://production.appspot.com/

Как только вы его настроите, вы просто вызываете службу, как...

http://non.secure.site/appspot/service?jsonCallback=jsonp1331132928704

Google proxypass для получения дополнительной информации

https://serverfault.com/questions/429404/help-me-understand-how-to-use-proxypass

Ответ 2

Если у вас нет другого варианта, но с использованием этого не защищенного стороннего API вы можете сами подумать о MITM, что API.

Создайте серверную часть script, доступ к которой будет осуществляться только через SSL и будет действовать как прокси-сервер или переадресатор между вашим тегом и API. Таким образом, вы можете повысить уровень безопасности, выполнив собственные проверки и проверки данных, а потому, что вы будете обслуживать его по SSL, вы не получите никаких ошибок "Смешанного содержимого".

Кстати, я не проверял его всегда, вероятность того, что сайты под сертификатом Google, обслуживаемые GAE, будут действовать по-другому.

Надеюсь, что смогу помочь.

Ответ 3

У меня такая же проблема для того, чтобы делать то же самое, что и между http и https. Это проблема с перекрестным доменом.

Самое важное, что вам нужно - это серверная страница, которую вы используете для выполнения завитки, должна установить некоторые заголовки для разрешения HTTP-соединения https. Это ниже....

header("Access-Control-Allow-Origin: your https url");
header("Access-Control-Allow-Methods: POST, GET");
header("Access-Control-Max-Age: 1728000");

header("Access-Control-Allow-Headers: Content-Type, Connection, Depth, User-Agent, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control");
header("Connection: close");