我试着解释一下我们的问题。
我们正在编写一个小工具(使用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服务器。我们为自己的域名提供了自签名证书(用于测试)。
我们要存档这样的内容:
这里有一些用于测试/可视化的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(我认为其他浏览器也会阻止主机标头
)答案 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();
由您来确保密钥库/信任库密码的安全,这样它就不会陷入邪恶的手中。 (这超出了这个问题的范围)