将请求从https发送到本地http服务器

时间:2017-04-10 10:48:52

标签: javascript rest ssl jetty

我试着解释一下我们的问题。

我们正在编写一个小工具(使用Java 1.8和Jetty + Jersey),它提供了一个休息服务器,用于在硬盘上保存数据(文档,...)或直接打印文档。

可以在本地计算机(localhost)或本地网络中的其他设备上启动/访问该工具。

问题是,如果请求未通过ssl加密,则无法从https页面向本地工具发送请求。

我们需要的是我们工具的ssl证书。

但问题是我们无法知道客户想要运行该工具的设备/ IP地址,您必须将域绑定到ssl证书。

我们可以创建ssl-certificate并将其与(例如)tool.domain.com绑定,但该工具可以在127.0.0.1以及192.168.10.2或类似的东西上运行。

所以我的问题是,有没有办法(以编程方式)"绕过"这堵墙?

一种方式"将添加一个条目到本地主机文件,但我们希望尽可能少的客户努力,你不能在非根移动设备上设置主机条目。

编辑:添加了一些代码段。

        ServletContextHandler context = new ServletContextHandler(server, "/*");

        // vhosts
//      context.setContextPath("/*");
        context.setVirtualHosts(new String[]{
             "127.0.0.1",
             "192.168.6.195",
             "localhost",
             "tool.domain.com"
        });

我们将虚拟主机添加到jetty服务器。我们为自己的域名提供了自签名证书(用于测试)。

我们要存档这样的内容:

enter image description here

这里有一些用于测试/可视化的JS代码:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://127.0.0.1:7331/test/echo/test1111');
xhr.setRequestHeader('Host', 'https://tool.domain.com');
xhr.send();

但Chrome(我认为其他浏览器也会阻止主机标头

1 个答案:

答案 0 :(得分:1)

如果您拥有自己的公司和自己的公司域名,那么这是可能的。

让我们说你有dominice-so.com

如果为self.dominice-so.com之类的内容创建了一个dns条目,以便始终返回127.0.0.1,那么您可以在产品中发送一个包含域名self.dominice-so.com的有效证书的密钥库/信任库。

浏览器应该可以使用类似......

之类的连接
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://self.dominice-so.com:7331/test/echo/test1111');
xhr.setRequestHeader('Host', 'https://tool.domain.com');
xhr.send();

由您来确保密钥库/信任库密码的安全,这样它就不会陷入邪恶的手中。 (这超出了这个问题的范围)