通过https网站与localhost上的http服务器进行通信,跨域

时间:2013-05-22 17:19:52

标签: http https cross-domain jetty jsonp

所以我有一个需要与桌面应用程序通信的GWT webapp。为此,桌面程序在给定端口(例如,http://localhost:9000)启动Web服务器。

我已经实现了JSON-P通信来绕过跨域过滤器,这在本地测试时工作正常(webapp在http://localhost:8888运行)。问题是,生产网站是通过https提供的,没有浏览器允许您通过https从http请求javascript。

所以我尝试了一些事情。

我在服务于GWT javascript的服务器和javascript尝试向其发出请求的服务器以及发出HTTP请求时,使用Java HttpServletResponse.addHeader("Access-Control-Allow-Origin", "*")设置了“Access-Control-Origin:*”标头,但是它被相同的原始过滤器阻止(因为我试图从https向http发出请求,因此可以推测)。

我试图从一个新的窗口(通过调用$ wnd.open创建)中使用Json-P通信而没有一个URL希望它会加载http,但它是通过https加载的,所以我遇到了同样的问题像以前一样的问题。

有没有办法通过https向http服务的javascript提出跨域请求?没有任何可行的方法在localhost上运行https(在签署JSON-P请求时,自签名证书被阻止。)

1 个答案:

答案 0 :(得分:1)

假设您部署的计算机具有Internet访问权限,此问题的最佳解决方案是在托管webapp的主站点上注册子域(例如,localhost.example.com)并设置DNS条目指向127.0.0.1。然后,您可以获取localhost.example.com的已签名https证书,并将该证书与您的应用程序一起分发。

警告语:

  • 由于证书随您的应用程序一起分发,因此不保密,因此请确保不要为* .example.com或类似的任何内容提供证书。幸运的是,攻击者需要在本地计算机上运行服务器才能利用它,在这种情况下,他们已经可以访问您的所有cookie和内容。
  • 如果/当证书过期,事情可能会中断。这可能需要让您的客户端应用程序从您的Web服务器下载证书。这种安全含义应该不比在二进制文件中分发更糟糕。
  • 如果您对安全性非常敏感,则使用完全独立的域(localhostexample.com)可以防止未来的漏洞或漏洞。