有没有办法强制应用程序发布使用https而不是http

问题描述:

我有一个应用程序发送请求到Web服务。不幸的是,应用程序被编译,并且到web服务的链接作为http嵌入到应用程序中。 (是的,我知道这是多么愚蠢,我没有写它)有没有办法强制应用程序发布使用https而不是http

最近,第三方公司不再允许http请求,一切都必须是https。

该应用程序在Tomcat上作为webapp运行。该服务器是一个Windows服务器。

有没有办法拦截对这个Web服务的调用并强制它使用https?

您可以使用代理脚本。用你想要的任何服务器端语言编写,例如PHP,将API URL设置为这个脚本,脚本为你做https请求并将结果传回给你的应用程序。

你也可以使用Apache本身作为代理,并使用类似:Apache config: how to proxypass http requests to https

正如你不能改变应用程序的源代码(因为它是编译),并且不能更改Web服务(因为它是第三方),解决此问题的唯一方法是使成为应用程序和Web服务之间的代理。要做到这一点,你需要(假定代理在本地主机上运行):

  1. 作为Web服务URL被嵌入到编译的应用程序,为了让应用程序发送HTTP请求到我们的代理,主机映射需要更改(例如/etc/hosts)以覆盖DNS。例如,如果应用程序中的HTTP请求是GET http://example.com/api/sample,则/etc/hosts,example.com需要映射到127.0.0.1
  2. 在localhost中创建代理Web服务器并打开与Web服务相同的端口。这个代理是一个非常简单的web服务器(任何后端编程技术都可以做到),它只负责请求转发。这样,当应用程序发送HTTP请求到example.com时,它将请求发送到代理服务器。
  3. 代理服务器收到来自应用程序的HTTP请求后,提取请求的URL/header/body并发送HTTPS请求至example.com的真实IP地址。请注意:在此HTTPS请求中,应添加标头host,其值为example.com。第三方网络服务可能会检查此标题。
  4. example.com返回实际响应后,代理将把它返回给应用程序。

当然,你也可以使用逆向工程(Java反编译)获取应用程序的“源代码”,更改Web服务URL,然后重新编译为一个Web应用程序。但是,由于应用程序可能需要更新/升级,并且可能不受您的控制,因此不建议使用这种逆向工程方法。