从HTTP到HTTPS的跨域请求立即中止

21

我正在尝试从HTTP页面向HTTPS服务进行跨域Web服务调用。

我在服务器上设置了正确的CORS头(它对于HTTP-HTTP和HTTPS-HTTPS有效)。

如果我将请求更改为JSONp,它是有效的。

我在Chrome和Firefox中看到的情况是HTTPS请求从未发送,它立即被中止,并且服务器永远不会收到请求。

值得注意的是,预检OPTIONS请求被中止了(它没有到达服务器)。

我找不到任何解释这确实不可能(从HTTP到HTTPS),更好的是:解释为什么。我可以理解HTTPS到HTTP是不安全的,但反过来应该没问题吧?这似乎很荒谬,因为JSONp可以工作(但很麻烦)。

备注

我还设置了withCredentialstrue,并且发送了一些自定义标头和自定义Content-Typeapplication/json

我使用常规的XMLHTTPRequest,并针对IE<=9回退到JSONp。


你有一个可以查看的实时网站吗? - Laurent Perrin
1
不,我没有,在本地开发服务器上运行它。 - Halcyon
2个回答

12

好的,我搞明白了。我用于HTTPS域的证书是自签名的且未经验证的。将其添加到受信任的第三方机构列表中即可解决问题。

您可以通过IE在Windows 7中安装证书。以下步骤适用于我: http://productforums.google.com/forum/#!topic/chrome/bds-Ao9LigA%5B1-25%5D (由zacharysyoung 2/11/09发布) 请确保以管理员身份运行IE(9),否则安装将失败,即使它显示已正确安装。

  1. 打开Internet Explorer (IE)并导航到托管自签名证书的站点。
  2. IE应显示一个警告页面,“此网站的安全证书存在问题。”
  3. 点击“继续访问此网站(不推荐)”链接。
  4. 页面加载完成后,请看地址栏右侧。应该看到一个红色/粉色按钮,标注为“证书错误”。点击该按钮。
  5. 会出现一个标题为“不受信任的证书”的弹窗。点击弹窗底部的“查看证书”链接。
  6. 出现另一个标题为“证书”的弹窗。点击“安装证书…”按钮。
  7. 将启动“证书导入向导”。点击“下一步”按钮。
  8. ** 对于XP:a. 保持“自动选择证书…”选项已选中,并单击“下一步”按钮。 ** 对于Vista:a. 选择“将所有证书放入以下存储”选项,然后单击“浏览”按钮。 b. 单击“显示物理存储” 复选框。 c. 展开“第三方根证书颁发机构”文件夹,选择“本地计算机”。单击“确定”按钮。
  9. 按钮。d. 点击“下一步”按钮。
  10. 这将显示“完成证书导入向导”对话框。点击“完成”按钮。
  11. 会出现“安全警告”弹窗。该警告是通知您,实际上无法验证证书的来源。您应该知道证书来自何方。如果知道,请单击“是”按钮安装证书。
  12. 最后一个弹窗将通知您,“导入成功”。点击“确定”按钮。
  13. 重新启动/打开Chrome并导航到相关网站。您不应该被安全警告页面所拦截。

此外,我认为我在Chrome中发现了一个漏洞。请参阅: https://code.google.com/p/chromium/issues/detail?id=141839


非常有帮助。对于其他人来说,如果SSL证书存在问题,Firefox将会默默地中止OPTIONS请求。我刚刚通过直接访问该域并为我的本地自签名添加了一个例外来解决这个问题。之后,OPTIONS请求就可以正常工作了。 - mrgreenfur

1

你可以尝试使用easyXDM这样的工具来进行设置,它非常快速且易于上手,并且会为您处理所有的向后兼容性问题(甚至支持IE6)。虽然它可能不是你所期望的自制解决方案,但如果你需要快速实现跨域访问(在你能够访问到两个域的情况下),那么它完全符合要求。

当然,你也可以编写自己的iframe(postMessage)接口,但为什么要重复造轮子呢?(别忘了如果你使用不同的子域名,需要设置document.domain)


我有一个可行的实现(JSONp)。但我想知道为什么Chrome和Firefox会阻止HTTP到HTTPS请求。easyXDM看起来没有维护,杂乱无章,完全过度膨胀,并且需要..Flash?如果我想要上传或真正大的请求,那么iframe回退可能很有趣,但是目前我没有这样的要求。我也不急。 - Halcyon
对于个人浏览器,协议在隐私和安全方面有非常大的影响。新的浏览器确实有“内容安全策略”,但不确定它是否跨协议。我可能过早地提供了一个解决方案,但是 easyXDM 社区 仍然存在。我相信最后一次更改是不到一个月前(它非常稳定,不需要任何新功能)。至于 Flash,在 postMessage 不可用时,它被用作备选方案,但它具有大量(过度)的功能集。 - SciSpear
我正在使用CORS..我想我提到了吗?什么是跨协议? - Halcyon
1
HTTPS转HTTP我能理解,但是HTTP转HTTPS? - Halcyon
我理解你的意思(而且我对w3c小组有一些选择性的话要说),但是http->https打破了不同协议===不同站点/域名的基本决定。这不会改变,但你可以像我在回复中建议的那样编写自己的postMessage内容(我发现了一个postMessage包装库,可以让它更容易)。 - SciSpear
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接