HTTPS 到 HTTP JSONP 请求

Posted

技术标签:

【中文标题】HTTPS 到 HTTP JSONP 请求【英文标题】:HTTPS to HTTP JSONP request 【发布时间】:2012-03-25 04:13:26 【问题描述】:

我在发送 JSONP 请求从 HTTPS 站点到 HTTP 站点时遇到问题。

我有一个通过 https 的(非本地)测试环境(具有有效证书),我能够成功运行所有这些跨站点/“跨协议”请求(带有警告,但没有错误)。

Google Chrome Javascript 控制台输出

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

但是,在生产中,(在 Google App Engine 上,appspot 子域)Google Chrome 会阻止所有等待用户确认的请求。

Google Chrome Javascript 控制台输出(特别注意 [blocked] 文本):

[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

我不知道为什么这在测试环境中起作用,并且谷歌浏览器在 APPSpot 上阻止了相同的方法。

有什么想法吗?

【问题讨论】:

Chrome 对 Google HTTPS 页面的处理通常与标准 HTTPS 页面不同(例如特殊证书检查)。不安全的内容可能也是这种情况吗? 也许你是对的。实际上,只有在我们将应用部署在 GAE 上时才会出现问题(appspot 使用 Google 的证书)。我会深入研究它。谢谢! 我自己的服务器和(有效的)证书也有同样的问题... 好吧,在这里回答:***.com/questions/12216208/… 我必须指出一件重要的事情——您刚刚写到您正在对第三方进行 JSONP 调用,而他们不提供安全性。伙计... JSONP 只是从第三方运行 javascript 并希望它使用一些数据调用您的函数的名称。如果该调用中没有 https,任何人都可以执行 MITM 并运行一些代码来拦截您尝试使用 https 保护的任何数据。 【参考方案1】:

Apache 代理将代表您向端点发出请求。您甚至可以对服务(json、xml、图像、post、put、delete 等)发出非 jsonp 请求,因为浏览器认为它正在向同一个域发出请求。

您的 non.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】:

如果您没有其他选择,只能使用不受保护的 3rd-party API,您可以自己考虑 MITM 该 API。

创建一个只能通过 SSL 访问的服务器端脚本,它将充当您的代码和 API 之间的代理或转发器。这样,您可以通过对数据进行自己的检查和验证来提高安全性,并且由于您将在 SSL 下提供数据,因此您不会收到任何“混合内容”错误。

顺便说一句,我还没有测试过,根据 GAE 提供的 Google 证书下的网站总是有可能会有不同的行为。

希望我能帮上忙。

【讨论】:

【参考方案3】:

我在 http 和 https 之间做同样的事情时遇到了同样的问题。这是一个跨域问题。

您需要的最重要的事情是您用于进行 curl 的服务器端页面必须设置一些标头以允许 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");

【讨论】:

以上是关于HTTPS 到 HTTP JSONP 请求的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 现在阻止从 https 到 http 的所有 jsonp 请求?

Chrome 现在阻止从 https 到 http 的所有 jsonp 请求?

Chrome 现在阻止从 https 到 http 的所有 jsonp 请求?

Chrome 现在阻止从 https 到 http 的所有 jsonp 请求?

Chrome 现在阻止从 https 到 http 的所有 jsonp 请求?

是否可以从 HTTPS 向 HTTP 发出 JSONP 请求?