2012-03-07 165 views
11

我在發送JSONP請求從HTTPS站點到HTTP站點的問題。HTTPS到HTTP JSONP請求

我有一個(非本地)通過https(有效證書)的測試環境,我可以成功地運行所有這些跨站點/「交叉協議」請求(帶有警告,但沒有錯誤)。

谷歌瀏覽器的Javascript控制檯輸出

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

然而,在生產,(在谷歌應用程序引擎,Appspot上子域)谷歌瀏覽器阻止等待用戶確認的所有請求。

谷歌瀏覽器的Javascript控制檯輸出(特別注意[鎖定]文本):

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

我知道我在做什麼是不安全的,而是由第三方提供該服務到目前爲止還沒有可用的SSL通信。我真的很困惑,因爲我不明白爲什麼在測試環境中工作(有警告),而不是在appspot(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上。

有什麼想法?

+4

Chrome對待Google HTTPS頁面的方式通常與標準HTTPS頁面不同(例如特殊證書檢查)。也許這是不安全的內容的情況? – Robert 2012-03-07 16:20:37

+0

讓你aré吧。事實上,只有在GAE上部署應用程序(appspot使用Google的證書)時纔會出現問題。我會深入研究它。謝謝! – 2012-03-08 22:04:52

+0

我在我自己的服務器和(有效)證書上有同樣的問題... – Stefano 2012-09-06 14:02:41

回答

1

一個Apache代理將代表您的端點的請求。你甚至可以擁有對服務的非jsonp請求(json,xml,images,post,put,delete等),因爲瀏覽器認爲它正在對同一個域進行請求。

你non.secure.site虛擬主機文件將包含類似

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 

谷歌的ProxyPass更多信息

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

0

如果您沒有其他選擇,但我們如果沒有安全的第三方API,您可以自己考慮關於MITM的API。

創建一個服務器端腳本,該腳本將僅通過SSL訪問,並將充當代理或API和代理之間的代理或代理。這樣,您可以通過對數據進行自己的檢查和驗證來提高安全性,並且由於您將在SSL下提供服務,因此您將不會收到任何「混合內容」錯誤。

順便說一句,我還沒有測試過,總是有機會GAE提供的Google證書下的網站會有不同的行爲。

希望我能幫上忙。

0

我在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");